package cmd

import (
	"flag"
	"os"

	"github.com/mitchellh/go-homedir"
	pkgErrors "github.com/pkg/errors"
	"github.com/spf13/cobra"
	"github.com/spf13/pflag"
	"github.com/spf13/viper"
	klogv2 "k8s.io/klog/v2"

	"github.com/pingcap/test-infra/tools/tcctl/pkg/config"
	"github.com/pingcap/test-infra/tools/tcctl/pkg/util"
)

const (
	dryRunFlag       = "dry-run"
	ecrServerDefault = "946646677266.dkr.ecr.us-west-2.amazonaws.com"
)

var (
	cfgFile          string
	inputFile        string
	serverConfig     config.ApiServerConfig
	dryrun           bool
	ecrServer        string
	onlySyncECRImage bool
)

var rootCmd = &cobra.Command{
	Use:   "tcctl",
	Short: "A cli tool to control test-infra",
	Long:  `A cli tool to control test-infra: https://github.com/pingcap/test-infra/tree/main/tools/tcctl`,
}

func Execute() {
	defer klogv2.Flush()
	if err := rootCmd.Execute(); err != nil {
		if pkgErrors.Is(err, util.ErrTestbedConfig) {
			os.Exit(util.ExitTestbedConfig)
		} else if pkgErrors.Is(err, util.ErrTimeout) {
			os.Exit(util.ExitTimeout)
		} else {
			os.Exit(1)
		}
	}
}

func init() {
	logFlags := flag.NewFlagSet("log", flag.ExitOnError)
	logFlags.Bool("h", false, "just for ignore help")
	logFlags.Bool("help", false, "just for ignore help")
	klogv2.InitFlags(logFlags)

	pflag.CommandLine.AddGoFlag(logFlags.Lookup("v"))
	pflag.CommandLine.AddGoFlag(logFlags.Lookup("logtostderr"))
	err := logFlags.Parse(os.Args[1:])
	if err != nil {
		panic(err)
	}
	cobra.OnInitialize(initConfig)

	rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file, default $HOME/.tcctl.yaml")
	rootCmd.PersistentFlags().StringVarP(&inputFile, "file", "f", "", "the input yaml file name, '*.csv' for csv file, '-' for stdin")
	rootCmd.PersistentFlags().StringP("tcms-host", "t", "https://tcms.pingcap.net", "the tcms host address")
	rootCmd.PersistentFlags().StringP("rms-host", "r", "http://localhost", "the rms-apiserver host address")
	rootCmd.PersistentFlags().String("token", "", "user token from tcms")
	viper.BindPFlag("tcms-host", rootCmd.PersistentFlags().Lookup("tcms-host"))
	viper.BindPFlag("rms-host", rootCmd.PersistentFlags().Lookup("rms-host"))
	viper.BindPFlag("token", rootCmd.PersistentFlags().Lookup("token"))
}

func initConfig() {
	if cfgFile != "" {
		viper.SetConfigFile(cfgFile)
	} else {
		home, err := homedir.Dir()
		cobra.CheckErr(err)
		viper.AddConfigPath(home)
		viper.SetConfigFile(home + "/.tcctl.yml")
	}
	viper.AutomaticEnv()
	if err := viper.ReadInConfig(); err == nil {
		util.LogDebugf("using config file: %s", viper.ConfigFileUsed())
	} else if cfgFile != "" {
		util.LogErrorf("config %s not found", viper.ConfigFileUsed())
	}
	err := viper.Unmarshal(&serverConfig)
	if err != nil {
		panic(err)
	}
}
