package inits

import (
	"errors"
	"fmt"
	"github.com/spf13/viper"
	"ppms-fj/global"
	"ppms-fj/tools"
)

var (
	configPath = "configs"
	configName = "col-comment"
	configType = "yaml"
)

// BuildConfig 初始化配置
func BuildConfig(rootDir, fileName string) {
	if rootDir == "" {
		viper.AddConfigPath(configPath) // 设置配置文件路径
	} else {
		viper.AddConfigPath(rootDir) // 设置配置文件路径
	}
	if fileName == "" {
		viper.SetConfigName(configName) // 设置配置文件名称
	} else {
		viper.SetConfigName(fileName) // 设置配置文件名称
	}
	viper.SetConfigType(configType) // 设置配置文件类型
	funcName := tools.RunFuncName()
	if err := viper.ReadInConfig(); err != nil {
		var configFileNotFoundError viper.ConfigFileNotFoundError
		if errors.As(err, &configFileNotFoundError) {
			fmt.Printf("[%s][NotFoundConfigFile](%s/%s.%s)\n", funcName, configPath, configName, configType)
			panic(err)
		} else {
			fmt.Printf("[%s][ParseConfigFileError](%s/%s.%s)\n%s\n", funcName, configPath, configName, configType, err.Error())
			panic(err)
		}
	}
	baseConfigKey := viper.AllKeys()
	config := make(map[string]interface{})
	for _, key := range baseConfigKey {
		config[key] = viper.Get(key)
	}
	runmode := viper.GetString("app.runmode")
	appname := viper.GetString("app.appname")
	if runmode != "" {
		viper.SetConfigName(appname + "-" + runmode) // 设置配置文件名称
		if err := viper.ReadInConfig(); err != nil {
			var configFileNotFoundError viper.ConfigFileNotFoundError
			if errors.As(err, &configFileNotFoundError) {
				fmt.Printf("[%s][NotFoundConfigFile](%s/%s-%s.%s)\n", funcName, configPath, appname, runmode, configType)
				panic(err)
			} else {
				fmt.Printf("[%s][ParseConfigFileError](%s/%s-%s.%s)\n%s\n", funcName, configPath, appname, runmode, configType, err.Error())
				panic(err)
			}
		}
		runmodeConfigKey := viper.AllKeys()
		for _, key := range runmodeConfigKey {
			config[key] = viper.Get(key)
		}
	}
	for key, value := range config {
		viper.Set(key, value)
	}
	//global.Config = &models.Config{}
	if err := viper.Unmarshal(&global.Config); err != nil {
		fmt.Printf("[%s][DeserializeToStructError]%s", funcName, err.Error())
		panic(err)
	}
}
