package command

import (
	"math"

	"github.com/spf13/cobra"
)

var (
	ctFormat     string
	ctDataDir    string
	ctFilePrefix string
)

// NewConfigTemplateCommand returns the cobra command
// for "config template"
func NewConfigTemplateCommand() *cobra.Command {
	ctCmd := &cobra.Command{
		Use:   "ct <subcommand>",
		Short: "Config Template related commands",
	}

	ctCmd.AddCommand(NewConfigTemplateDumpCommand())
	ctCmd.AddCommand(NewConfigTemplateLoadCommand())

	return ctCmd
}

// NewConfigTemplateDumpCommand returns the cobra command for "ct dump",
// "ct dump" dumps all config templates,
// file formats supported: json
func NewConfigTemplateDumpCommand() *cobra.Command {
	ct := &cobra.Command{
		Use:   "dump [options]",
		Short: "dump all config templates, file formats supported: json",

		Run: configTemplateDumpCommandFunc,
	}

	ct.Flags().StringVar(&ctFormat, "format", "json", "file format for data")
	ct.Flags().StringVar(&ctDataDir, "dir", "./", "the storage directory of data")
	ct.Flags().StringVar(&ctFilePrefix, "file-prefix", "configTemplates", "the prefix of dump files")

	return ct
}

// NewConfigTemplateLoadCommand returns the cobra command for "ct load"
// "ct load" loads config templates form specific files,
// file formats supported: json
func NewConfigTemplateLoadCommand() *cobra.Command {
	ct := &cobra.Command{
		Use:   "load [options]",
		Short: "load config templates form files, file formats supported: json",

		Run: configTemplateLoadCommandFunc,
	}
	ct.Flags().StringVar(&ctFormat, "format", "json", "file format for data")
	ct.Flags().StringVar(&ctDataDir, "dir", "./", "the storage directory of data")
	ct.Flags().StringVar(&ctFilePrefix, "file-prefix", "configTemplates", "the prefix of dump files")

	return ct
}

func configTemplateDumpCommandFunc(cmd *cobra.Command, args []string) {
	checkDumpAndLoadArgs(args, ctFormat, ctDataDir, ctFilePrefix)

	schCli := mustClientFromCmd(cmd)
	cts, err := schCli.ListConfigTemplates(math.MaxInt32, 0)
	if err != nil {
		ExitWithError(ExitError, err)
	}

	saveDumpFile(cts, ctDataDir, ctFilePrefix, ctFormat)
}

func configTemplateLoadCommandFunc(cmd *cobra.Command, args []string) {
	checkDumpAndLoadArgs(args, ctFormat, ctDataDir, ctFilePrefix)

	cts, err := readConfigTemplatesFromJSONFile(ctDataDir, ctFilePrefix)
	if err != nil {
		ExitWithError(ExitError, err)
	}

	schCli := mustClientFromCmd(cmd)

	for _, ct := range cts {
		if err := ct.Verify(); err != nil {
			ExitWithError(ExitError, err)
		}

		if _, err = schCli.SetConfigTemplate(ct); err != nil {
			ExitWithError(ExitError, err)
		}
	}
}
