package config

import (
	"encoding/binary"
	"encoding/json"
	"fmt"
	"github.com/patrickmn/go-cache"
	"math/rand"
	"os"
	"time"
)

var (
	Conf                *AppConfig
	WorldLoginCacheCode = cache.New(30*time.Minute, 15*time.Second)
)

const (
	ColorReset  = "\033[0m"
	ColorRed    = "\033[31m"
	ColorGreen  = "\033[32m"
	ColorYellow = "\033[33m"
	ColorBlue   = "\033[34m"
	ColorPurple = "\033[35m"
	ColorCyan   = "\033[36m"
	ColorWhite  = "\033[37m"
)

type AppConfig struct {
	AppName string `json:"app_name"` //项目名称 no-name

	DBname   string `json:"db_name"`   //数据库名称 test_schema
	DBserver string `json:"db_server"` //mysql域名

	Mode           string `json:"mode"`
	Mysql_UserName string `json:"mysql_username"` //mysql用户名 root
	Mysql_PWD      string `json:"mysql_pwd"`      //mysql密码 root
	MysqlPort      string `json:"mysql_port"`     //mysql启动端口

	Mongo_UserName string `json:"mongo_username"`
	Mongo_PWD      string `json:"mongo_pwd"`
	Mongo_Host     string `json:"mongo_host"`
	Mongo_Port     string `json:"mongo_port"`

	//华为SMS短信平台url
	HUAWEI_SMS_Url string `json:"huawei_sms_url"`

	Port string `json:"port"` //项目启动端口

	StaticPath string `json:"static_path"`

	Timeout10 string `json:"timeout10"` //mysql超时

	RedisServer string `json:"redis_server"` //redis域名
	RedisPort   string `json:"redis_port"`   //redis启动端口
	RedisPwd    string `json:"redis_pwd"`    //redis密码
	RedisDB     string `json:"redis_db"`     //redis连接数据库
	//短信验证码
	SmsAccessKeyId     string `json:"sms_access_key_id"`
	SmsAccessKeySecret string `json:"sms_access_key_secret"`
	//咪咕JWT的secret
	JwtSecret  string `json:"jwt_secret"`
	MiGuAuthId string `json:"miGuAuthId"`

	SoulUrl             string `json:"soul_url"`
	SoulAuth            string `json:"soul_auth"`
	TranscribeUrl       string `json:"transcribe_url"`
	GetTokenUrl         string `json:"get_token_url"`
	AppKey              string `json:"app_key"`
	AppSecret           string `json:"app_secret"`
	MentalClinicUrl     string `json:"mental_clinic_url"`
	CallBackUrl         string `json:"call_back_url"`
	SemanticAnalysisUrl string `json:"semantic_analysis_url"`
	VoiceSetModelUrl    string `json:"voice_set_model_url"`
	TranslatePropUrl    string `json:"translate_prop_url"`

	Md5Salt             string `json:"md5_salt"`
	ExhibitionModeAppId int64  `json:"exhibition_mode_app_id"`
	DrawAiUrl           string `json:"draw_ai_url"`
	//提示词
	PromptAPIUrl string `json:"prompt_api_url"`
	//头像绘制
	HeadPortraitAPI string `json:"head_portrait_api"`

	VoiceModelSets map[string]VoiceModel `json:"voice_model_sets"`
	//微信小程序
	WechatUrl            string `json:"wechat_url"`
	WechatAccessTokenUrl string `json:"wechat_access_token_url"`
	WechatGetPhoneUrl    string `json:"wechat_get_phone_url"`
	WechatAppId          string `json:"wechat_app_id"`
	WechatAppSecret      string `json:"wechat_app_secret"`
}

// 定义 VoiceModel 结构体来存储每个模型的路径
type VoiceModel struct {
	GPTModelPath    string `json:"gpt_model_path"`
	SoVITSModelPath string `json:"sovits_model_path"`
	ReferWavPath    string `json:"refer_wav_path"`
	PromptText      string `json:"prompt_text"`
	PromptLanguage  string `json:"prompt_language"`
	CnName          string `json:"cn_name"`
}

// 定义 VoiceModels 结构体储存所有的 VoiceModelSet
/*
type VoiceModelSets struct {
	VoiceModel map[string]VoiceModel `json:"voice_model_sets"`
}
*/

// 方法，根据人名获取模型路径
func GetModelPathsByName(name string) (string, string, bool) {
	if modelSet, exists := Conf.VoiceModelSets[name]; exists {
		return modelSet.GPTModelPath, modelSet.SoVITSModelPath, true
	}
	return "", "", false
}

func InitConfig() *AppConfig {
	fmt.Println(" 读取配置文件... ")
	file, err := os.Open("./config.json")
	/*
		 var file *os.File
			var err error
			if runtime.GOOS == "linux" {
				file, err = os.Open("./config.json")
			} else {
				file, err = os.Open("src/config.json")
			}
	*/
	if err != nil {
		println("error is :", err.Error())
	}

	decoder := json.NewDecoder(file)

	conf := AppConfig{}

	err = decoder.Decode(&conf)
	if err != nil {

		println("error is :", err.Error())

	}
	Conf = &conf
	return &conf

}

//全局随机种子
func RandInit() {
	var b [8]byte
	_, err := rand.Read(b[:])
	if err != nil {
		rand.Seed(time.Now().UnixNano())
	} else {
		rand.Seed(time.Now().UnixNano() + int64(binary.LittleEndian.Uint64(b[:])))
	}
}

var GlobalRand = func() *rand.Rand {
	// 创建一个缓冲区来存储生成的随机数
	var b [8]byte
	_, err := rand.Read(b[:])
	var seed int64
	if err != nil {
		// 如果随机数生成失败，回退到当前时间作为种子
		seed = time.Now().UnixNano()
	} else {
		// 如果随机数生成成功，使用它与当前时间的纳秒来创建种子
		seed = time.Now().UnixNano() + int64(binary.LittleEndian.Uint64(b[:]))
	}
	return rand.New(rand.NewSource(seed))
}()
