package config

import (
	"fmt"
	"log"
	"xg_auto_deploy/internal/models"
	"xg_auto_deploy/internal/utils"

	"github.com/spf13/viper"
)

type configFile struct {
	v              *viper.Viper
	baseNodeConfig *models.ServerNodeInfo
	subNodeConfig  map[string]*models.ServerNodeInfo
	xginiMap       map[string]string
	clusterMap     map[string]string
}

func InitNodeSetting(path string) *configFile {

	config := configFile{
		v:              viper.New(),
		baseNodeConfig: &models.ServerNodeInfo{},
		subNodeConfig:  make(map[string]*models.ServerNodeInfo),
		xginiMap:       make(map[string]string),
		clusterMap:     make(map[string]string),
	}

	config.openConfigFile(path)
	config.parseConfigfile()
	return &config
}

func (config *configFile) parseConfigfile() {
	selectNodeConfig := func(key, value string, serverNodeTemp *models.ServerNodeInfo) {
		switch key {
		case "ip_port":
			serverNodeTemp.IpPort = value
		case "target_file":
			serverNodeTemp.TargetFile = value
		case "local_file":
			serverNodeTemp.LocalFile = value
		case "user_password":
			r, l := utils.SplitColon(value)
			serverNodeTemp.User = r
			serverNodeTemp.Password = l
		case "xugu_addr":
			serverNodeTemp.XuguAddr = value
		}
	}

	//k,v读取出来的是父节点的参数
	for key, value := range config.v.GetStringMapString("node") {
		//读取的是[node]的子组[node.*]
		subNodeConfigTempMap := config.v.GetStringMapString(fmt.Sprintf("node." + key))
		if len(subNodeConfigTempMap) != 0 {
			//子组[node.*]参数解析
			serverNodeTemp := models.ServerNodeInfo{}
			for k, v := range subNodeConfigTempMap {
				selectNodeConfig(k, v, &serverNodeTemp)
			}

			//config.subNodeConfig[fmt.Sprintf("node."+key)] = &serverNodeTemp
			config.subNodeConfig[key] = &serverNodeTemp

		}
		//基类节点的参数解析
		selectNodeConfig(key, value, config.baseNodeConfig)
	}
	//检查子节点配置信息是否为空,为空则用基节点信息替换
	for _, serverNodeTemp := range config.subNodeConfig {
		checkServerNodeInfoIsEmpty(serverNodeTemp, config.baseNodeConfig)
	}

	//获取配置文件里的xugu
	for key, value := range config.v.GetStringMapString("xugu") {
		config.xginiMap[key] = value
	}

	//获取配置文件里的cluster
	for key, value := range config.v.GetStringMapString("cluster") {
		config.clusterMap[key] = value
	}
	//输出服务器节点配置信息
	// fmt.Printf("config.baseNodeConfig: %v\n", config.baseNodeConfig)
	// for k, v := range config.subNodeConfig {
	// 	fmt.Printf("subNodeConfigK: %s,subNodeConfigV: %v \n", k, *v)
	// }

}

func (config *configFile) openConfigFile(path string) {
	//读取指定config.toml配置文件
	config.v.SetConfigType("toml")
	config.v.SetConfigFile(path)
	if err := config.v.ReadInConfig(); err != nil {
		log.Fatalf("读取配置文件失败: %v", err)
	}
}

// 检查服务器节点配置信息是否为空,为空则用基节点信息替换
func checkServerNodeInfoIsEmpty(nodeInfo *models.ServerNodeInfo, baseNodeInfo *models.ServerNodeInfo) {
	isEmpty := func(s string) bool {
		return len(s) == 0
	}
	// if isEmpty(nodeInfo.IpPort) {
	// 	nodeInfo.IpPort = baseNodeInfo.IpPort
	// }
	if isEmpty(nodeInfo.LocalFile) {
		nodeInfo.LocalFile = baseNodeInfo.LocalFile
	}
	if isEmpty(nodeInfo.TargetFile) {
		nodeInfo.TargetFile = baseNodeInfo.TargetFile
	}
	if isEmpty(nodeInfo.User) {
		nodeInfo.User = baseNodeInfo.User
	}
	if isEmpty(nodeInfo.Password) {
		nodeInfo.Password = baseNodeInfo.Password
	}
	if isEmpty(nodeInfo.XuguAddr) {
		nodeInfo.XuguAddr = baseNodeInfo.XuguAddr
	}

}

func (config *configFile) GetXuguini() map[string]string {
	return config.xginiMap
}

func (config *configFile) GetCluster() map[string]string {
	return config.clusterMap
}

func (config *configFile) GetNodeConfig() map[string]*models.ServerNodeInfo {
	return config.subNodeConfig
}