package conf

import (
	"encoding/json"
	"fmt"
	"github.com/nacos-group/nacos-sdk-go/clients"
	"github.com/nacos-group/nacos-sdk-go/clients/config_client"
	"github.com/nacos-group/nacos-sdk-go/common/constant"
	"github.com/nacos-group/nacos-sdk-go/vo"
	"github.com/whileW/core-go/nacos"
	"github.com/whileW/core-go/utils"
	"os"
	"runtime"
)

func initNacos(config *Config) {
	var (
		data_id = utils.IF(os.Getenv("NACOSDATAID") == "",config.SysSetting.SystemName,os.Getenv("NACOSDATAID")).(string)
	)
	c,err := nacos.GetConfigClient()
	if err != nil {
		panic(fmt.Sprintf("初始化nacos config client异常:%v",err))
	}

	var changeData = func(confContent string) {
		s := map[string]interface{}{}
		if err := json.Unmarshal([]byte(confContent),&s);err != nil{
			fmt.Println(fmt.Sprintf("nacos序列化配置失败:content:%s,err:%v",confContent,err))
			return
		}
		fmt.Println("nacos config changed")
		config.AnalysisSetting(s)
	}

	if err := c.ListenConfig(vo.ConfigParam{
		DataId:data_id,
		Group:config.SysSetting.Env,
		OnChange: func(namespace, group, dataId, data string) {
			changeData(data)
		},
	});err != nil{
		panic(fmt.Sprintf("监听nacos配置失败:%v",err))
	}
	//初始化获取配置
	content,err := c.GetConfig(vo.ConfigParam{
		DataId:data_id,
		Group:config.SysSetting.Env,
	})
	if err != nil {
		panic(fmt.Sprintf("获取nacos配置失败:%v",err))
	}
	changeData(content)
	runtime.KeepAlive(c)
}

func get_nacos_client(addr string) config_client.IConfigClient {
	c := constant.NewClientConfig(
		constant.WithNamespaceId(""),
		constant.WithTimeoutMs(5000),
		constant.WithNotLoadCacheAtStart(true),
		//constant.WithLogDir("/tmp/nacos/log"),
		//constant.WithCacheDir("/tmp/nacos/cache"),
		constant.WithRotateTime("1h"),
		constant.WithMaxAge(3),
		constant.WithLogLevel("debug"),
	)
	s := []constant.ServerConfig{
		*constant.NewServerConfig(
			addr,
			8848,
			constant.WithScheme("http"),
			constant.WithContextPath("/nacos"),
		),
	}

	client, err := clients.NewConfigClient(
		vo.NacosClientParam{
			ClientConfig:  c,
			ServerConfigs: s,
		},
	)
	if err != nil {
		panic(fmt.Sprintf("初始化nacos异常:%v",err))
	}
	return client
}