package conf

import (
	"fmt"
	"github.com/go-playground/locales/en"
	"github.com/go-playground/locales/zh"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-redis/redis"
	"github.com/go-xorm/xorm"
	//"github.com/izghua/zgh"
	//"github.com/izghua/zgh/jwt"

	"gopkg.in/go-playground/validator.v9"
	en_translations "gopkg.in/go-playground/validator.v9/translations/en"
	zh_translations "gopkg.in/go-playground/validator.v9/translations/zh"
	"os"

	//"github.com/izghua/zgh/conn"
	"zhenyihuibao/conf/conn"
	//"github.com/izghua/zgh/conf"
	//"github.com/izghua/zgh/jwt"
	"gopkg.in/yaml.v2"
	"io/ioutil"
	"path/filepath"
)

var (
	SqlServer *xorm.Engine
	CacheClient *redis.Client
	Cnf *Conf
	Env string
	LuaScriptMap map[string]string
)


func init() {
	CnfInit()
	DbInit()
	RedisInit()
	JwtInit()

	MultiLangInit()
	LoadLuaScriptInit()

}

func DbInit () {
	sp := new(conn.Sp)
	dbUser := sp.SetDbUserName(Cnf.DbUser)
	dbPwd := sp.SetDbPassword(Cnf.DbPassword)
	dbPort := sp.SetDbPort(Cnf.DbPort)
	dbHost := sp.SetDbHost(Cnf.DbHost)
	dbdb := sp.SetDbDataBase(Cnf.DbDataBase)
	sqlServer,err := conn.InitMysql(dbUser,dbPwd,dbPort,dbHost,dbdb)
	SqlServer = sqlServer
	if err != nil {
		//zgh.ZLog().Error("some errors",err.Error())
		panic(err.Error())
	}
	return
}

//func BackUpInit() {
//	bp := new(backup.BackUpParam)
//	dest := "./zip/"+time.Now().Format("2006-01-02")+".zip"
//	backu := bp.SetFilePath(Cnf.BackUpFilePath).
//		SetFiles("./backup","./static/uploads/images").
//		SetDest(dest).SetCronSpec(Cnf.BackUpDuration)
//	data := make(map[string]string)
//	data[time.Now().Format("2006-01-02")+".zip"] = dest
//	bp.Ep = MailClient
//	subject := time.Now().Format("2006-01-02") + "备份邮件"
//	bp.Ep.SetSubject(mail.EmailType(subject)).SetAttaches(data).SetBody(mail.EmailType(
//		`<html><body>
//		<p><img src="https://golang.org/doc/gopher/doc.png"></p><br/>
//		<h1>日常备份.</h1>
//		`+ string2.RandString(10) +`
//		</body></html>`)).SetTo(mail.EmailType(Cnf.BackUpSentTo))
//	err := backu.Backup()
//	if err != nil {
//		zgh.ZLog().Error("message","backup has error","error",err.Error())
//	} else {
//		zgh.ZLog().Info("message","Congratulations for backup")
//	}
//	return
//}

func RedisInit() {
	rc := new(conn.RedisClient)
	addr := rc.SetRedisAddr(Cnf.RedisAddr)
	pwd := rc.SetRedisPwd(Cnf.RedisPwd)
	db := rc.SetRedisDb(Cnf.RedisDb)
	client,err := rc.RedisInit(addr,db,pwd)
	if err != nil {
		//zgh.ZLog().Error(err.Error())
		panic(err.Error())
	}
	CacheClient = client
	return
}

func JwtInit() {
	//jt := new(jwt.JwtParam)
	//ad := jt.SetDefaultAudience(Cnf.JwtAudience)
	//jti := jt.SetDefaultJti(Cnf.JwtJti)
	//iss := jt.SetDefaultIss(Cnf.JwtIss)
	//sk := jt.SetDefaultSecretKey(Cnf.JwtSecretKey)
	//rc := jt.SetRedisCache(CacheClient)
	//tl := jt.SetTokenLife(time.Hour * time.Duration(Cnf.JwtTokenLife))
	//_ = jt.JwtInit(ad,jti,iss,sk,rc,tl)
	return
}

func CnfInit() {
	cf := &Conf{
		AppPort: "8088",
		AppUrl : "http://localhost:8088",
		AppImgUrl : "http://localhost:8081/static/uploads/images/",
		DefaultLimit : "20",
		DefaultIndexLimit : "3",

		DbUser : "root",
		DbPassword : "",
		DbPort : "3306",
		DbDataBase : "go-blog",
		DbHost : "127.0.0.1",

		JwtIss : "go-blog",
		JwtAudience : "blog",
		JwtJti : "go-blog",
		JwtSecretKey : "go-blog",
		JwtTokenLife : 3,
		RedisAddr : "localhost:6379",
		RedisPwd : "",
		RedisDb : 0,

		QiNiuUploadImg : true,
		QiNiuHostName : "",
		QiNiuAccessKey : "",
		QiNiuSecretKey : "",
		QiNiuBucket : "go-blog",
		QiNiuZone : "HUABEI",

	}


	files,_ := filepath.Glob("./env.*.yaml")
	dev := false
	prod := false
	for _,v := range files {
		switch v {
		case "env.dev.yaml":
			dev = true
		case "env.prod.yaml":
			prod = true
		default:
			continue
		}
	}

	var fileName string
	var env string
	if dev {
		fileName = "/env.dev.yaml"
		env = "dev"
	} else if prod {
		fileName = "/env.prod.yaml"
		env = "prod"
	} else {
		fileName = "default"
		env = "dev"
	}

	if fileName == "default" {
		Cnf = cf
		Env = env
		return
	}

	res,err := filepath.Abs(filepath.Dir("./main.go"))
	if err != nil {
		//zgh.ZLog().Error(err.Error())
	}

	//读取yaml配置文件
	yamlFile, err := ioutil.ReadFile(res+fileName)
	if err != nil {
		//zgh.ZLog().Error(err.Error())
	}

	err = yaml.Unmarshal(yamlFile,&cf)
	if err != nil {
		//zgh.ZLog().Error(err.Error())
	}

	Cnf = cf
	Env = env
	return
}

func MultiLangInit() {
	en := en.New()
	zh := zh.New()
	Uni = ut.New(en, zh)
	Validate = validator.New()
	locale:=	"zh"
	trans, _ := Uni.GetTranslator(locale)
	Trans = &trans
	switch locale {
	case "zh":
		zh_translations.RegisterDefaultTranslations(Validate, trans)
		break
	case "en":
		en_translations.RegisterDefaultTranslations(Validate, trans)
		break
	default:
		zh_translations.RegisterDefaultTranslations(Validate, trans)
		break
	}
	Validate.RegisterTranslation("required", trans, func(ut ut.Translator) error {
		return ut.Add("required", "{0} 必须有值!", true) // see universal-translator for details
	}, func(ut ut.Translator, fe validator.FieldError) string {
		t, _ := ut.T("required", fe.Field())
		return t
	})
}

func LoadLuaScriptInit()  {
	LuaScriptMap = make(map[string]string)
	LuaScriptMap["doYueSha"] = LoadLuaScriptForRedis("doyue.lua")
	LuaScriptMap["cancelYueSha"] = LoadLuaScriptForRedis("cancelyue.lua")
}

func LoadLuaScriptForRedis(fileStr string) string{
	scriptStr, err := readLuaScript(fileStr)
	if err != nil {
		panic(err.Error())
	}
	luaScript ,err := CacheClient.ScriptLoad(scriptStr).Result()   //返回的脚本会产生一个sha1哈希值,下次用的时候可以直接使用这个值，类似于
	if err != nil {
		fmt.Println("lua 脚本加载失败")
		panic(err.Error())
	}
	logStr := fmt.Sprintf("[ %v ]  脚本 返回sha1哈希值为 [ %v ]", fileStr, luaScript)
	fmt.Println(logStr)
	return luaScript
}

func readLuaScript(scriptName string)(content string ,err error) {
	dir,_ := os.Getwd()
	fileName := filepath.Join(dir, "business/lua/", scriptName)
	f, err := os.Open(fileName)
	if err != nil {
		return
	}
	contentByte,err := ioutil.ReadAll(f)
	if err != nil {
		return
	}
	content = string(contentByte)
	return
}