package cmd

import (
	"fmt"
	"os"

	"github.com/spf13/cobra"
	jobcmd "github.com/tidbcloud/metrics-integration/global/internal/domain/cmd/job"
	"github.com/tidbcloud/metrics-integration/global/internal/domain/container"
	"github.com/tidbcloud/metrics-integration/global/internal/domain/entity"
	"github.com/tidbcloud/metrics-integration/global/internal/infrastructure/config"
	"github.com/tidbcloud/metrics-integration/global/internal/infrastructure/di"
	"gorm.io/gorm"
)

// Used for flags.
var cfgFile string

var rootCmd = &cobra.Command{
	Use:               "metrics-integration",
	CompletionOptions: cobra.CompletionOptions{DisableDefaultCmd: true},
}

func setupDI() {
	container.InitDependencies()
}

func initGlobalConfig() {
	cobra.CheckErr(config.InitConfig(cfgFile))
}

func initDBMigrations() {
	if err := di.DiCall(func(db *gorm.DB) error {
		if !db.Migrator().HasTable(&entity.Integration{}) {
			if err := db.AutoMigrate(&entity.Integration{}); err != nil {
				return fmt.Errorf("auto migrate failed: %w", err)
			}
		}
		if !db.Migrator().HasTable(&entity.MetricsKey{}) {
			if err := db.AutoMigrate(&entity.MetricsKey{}); err != nil {
				return fmt.Errorf("auto migrate MetricsKey failed: %w", err)
			}
		}
		if !db.Migrator().HasTable(&entity.GeneralIntegration{}) {
			if err := db.AutoMigrate(&entity.GeneralIntegration{}); err != nil {
				return fmt.Errorf("auto migrate GeneralIntegration failed: %w", err)
			}
		}
		return nil
	}); err != nil {
		panic(fmt.Sprintf("database init failed: %s", err))
	}
}

func init() {
	rootCmd.SetVersionTemplate("{{printf \"%s\" .Version}}\n")
	cobra.OnInitialize(initGlobalConfig, setupDI, initDBMigrations)
	rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "/etc/metrics-integration/config.yaml", "config file path")
	rootCmd.AddCommand(jobcmd.GetJobCmd())
}

func Execute() {
	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}
