/*
Copyright © 2024 NAME HERE <EMAIL ADDRESS>
*/
package cmd

import (
	"fmt"
	"os"
	"time"

	"github.com/juju/errors"
	log "github.com/sirupsen/logrus"
	"github.com/spf13/cobra"

	"github.com/tidbcloud/auto-deploy/internal/types"
	"github.com/tidbcloud/auto-deploy/internal/utils"
)

// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
	Use:   "deploy-cli",
	Short: "Deploy TiDB Clound control services tool",
	Long: `Deploy TiDB Cloud control services automatically, plase check sub command for more detail
`,
	// Uncomment the following line if your bare application
	// has an action associated with it:
	PersistentPreRun: func(cmd *cobra.Command, args []string) {
		log.SetFormatter(&log.TextFormatter{
			DisableColors:   true,
			FullTimestamp:   false,
			DisableQuote:    true,
			TimestampFormat: time.TimeOnly,
		})
		lvl, err := log.ParseLevel(level)
		if err != nil {
			log.Errorf("Invalid log level, set to default %s", defaultLevel)
			log.SetLevel(log.InfoLevel)
		} else {
			log.SetLevel(lvl)
		}
		if enableMaskSensitive {
			if oidcProvider == types.GithubOidcProvider {
				utils.SetGithubMasker()
			} else {
				utils.SetLoggerMasker()
			}
		}
	},
}

// For dev & test: var oidcProvider types.OidcProviderType = types.FakeOidcProvider
const defaultLevel = log.InfoLevel

var oidcProvider types.OidcProviderType = types.GithubOidcProvider
var instance string
var level = defaultLevel.String()
var enableMaskSensitive = true

// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
	err := rootCmd.Execute()
	if err != nil {
		fmt.Println("Encounter error:", errors.ErrorStack(err))
		os.Exit(1)
	}
}

func init() {
	rootCmd.PersistentFlags().StringVarP(&instance, "instance", "i", "dev", "TiDB Cloud instance name")
	rootCmd.PersistentFlags().VarP(&oidcProvider, "oidc-provider", "p", "OIDC provider, only support github")
	rootCmd.PersistentFlags().StringVarP(&level, "log-level", "", level, "Log level")
	rootCmd.PersistentFlags().BoolVarP(&enableMaskSensitive, "enable-mask-sensitive", "m", true, "If mask sensitive output")
	rootCmd.SilenceUsage = true
}
