package common

import (
	"errors"
	"os"

	commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common"
	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/version"
	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
	versionSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
	"github.com/spf13/cobra"
)

var errUnsupportedEACLFormat = errors.New("unsupported eACL format")

// ReadEACL reads extended ACL table from eaclPath.
func ReadEACL(cmd *cobra.Command, eaclPath string) *eacl.Table {
	_, err := os.Stat(eaclPath) // check if `eaclPath` is an existing file
	if err != nil {
		commonCmd.ExitOnErr(cmd, "", errors.New("incorrect path to file with EACL"))
	}

	PrintVerbose(cmd, "Reading EACL from file: %s", eaclPath)

	data, err := os.ReadFile(eaclPath)
	commonCmd.ExitOnErr(cmd, "can't read file with EACL: %w", err)

	table := eacl.NewTable()

	if err = table.UnmarshalJSON(data); err == nil {
		validateAndFixEACLVersion(table)
		PrintVerbose(cmd, "Parsed JSON encoded EACL table")
		return table
	}

	if err = table.Unmarshal(data); err == nil {
		validateAndFixEACLVersion(table)
		PrintVerbose(cmd, "Parsed binary encoded EACL table")
		return table
	}

	commonCmd.ExitOnErr(cmd, "", errUnsupportedEACLFormat)
	return nil
}

func validateAndFixEACLVersion(table *eacl.Table) {
	if !version.IsValid(table.Version()) {
		table.SetVersion(versionSDK.Current())
	}
}