package cmd

import (
	initcmd "sunhpc/cmd/init"
	"sunhpc/cmd/soft"
	"sunhpc/internal/log"

	"github.com/spf13/cobra"
	"github.com/spf13/viper"
)

var (
	cfgFile string
	verbose bool
	noColor bool
)

var rootCmd = &cobra.Command{
	Use:   "sunhpc",
	Short: "SunHPC - HPC集群一体化运维工具",
	PersistentPreRun: func(cmd *cobra.Command, args []string) {
		// 初始化日志
		log.Init(verbose)

		// 是否禁用颜色
		if noColor {
			log.EnableColor(false)
		}

		log.Debugf("命令: %s", cmd.Name())
		log.Debugf("详细模式: %v", verbose)
	},
	PersistentPostRun: func(cmd *cobra.Command, args []string) {
		// 同步日志
		log.Sync()
		log.Close()
	},
}

func Execute() error {
	return rootCmd.Execute()
}

func init() {
	cobra.OnInitialize(initConfig)

	rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "配置文件路径 (默认为 /etc/sunhpc/sunhpc.yaml)")
	rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "启用详细日志输出")
	rootCmd.PersistentFlags().BoolVar(&noColor, "no-color", false, "禁用彩色输出")

	// 注册一级子命令
	rootCmd.AddCommand(initcmd.Cmd)
	rootCmd.AddCommand(soft.Cmd)
	rootCmd.AddCommand(nodeCmd)
}

func initConfig() {
	if cfgFile != "" {
		viper.SetConfigFile(cfgFile)
	} else {
		viper.AddConfigPath("/etc/sunhpc")
		viper.SetConfigType("yaml")
		viper.SetConfigName("sunhpc")
	}

	viper.AutomaticEnv()

	if err := viper.ReadInConfig(); err == nil {
		log.Infof("使用配置文件: %s", viper.ConfigFileUsed())
	} else {
		log.Debugf("未找到配置文件: %v", err)
	}
}
