package svc

import (
	"applet/app/md"
	"errors"
	"github.com/gin-gonic/gin"
	"strings"
	"xorm.io/xorm"

	"applet/app/cfg"
	"applet/app/db"

	"applet/app/utils"
	"applet/app/utils/cache"
)

// 单挑记录获取
func SysCfgGet(c *gin.Context, key string) string {
	mid := c.GetString("mid")
	eg := db.DBs[mid]
	return db.SysCfgGetWithDb(eg, mid, key)
}

// 多条记录获取
func SysCfgFind(c *gin.Context, keys ...string) map[string]string {
	var masterId string
	if c == nil {
		masterId = ""
	} else {
		masterId = c.GetString("mid")
	}
	tmp := SysCfgFindComm(masterId, keys...)
	return tmp
}

// SysCfgGetByMasterId get one config by master id
func SysCfgGetByMasterId(masterId, key string) string {
	res := SysCfgFindComm(masterId, key)
	if _, ok := res[key]; !ok {
		return ""
	}
	return res[key]
}

// SysCfgFindComm get cfg by master id
func SysCfgFindComm(masterId string, keys ...string) map[string]string {
	var eg *xorm.Engine
	if masterId == "" {
		eg = db.Db
	} else {
		eg = db.DBs[masterId]
	}
	res := map[string]string{}
	//TODO::判断keys长度(大于10个直接查数据库)
	if len(keys) > 10 {
		cfgList, _ := db.SysCfgGetAll(eg)
		if cfgList == nil {
			return nil
		}
		for _, v := range *cfgList {
			res[v.Key] = v.Val
		}
	} else {
		for _, key := range keys {
			res[key] = db.SysCfgGetWithDb(eg, masterId, key)
		}
	}
	return res
}

// 多条记录获取
func EgSysCfgFind(keys ...string) map[string]string {
	var e *xorm.Engine
	res := map[string]string{}
	if len(res) == 0 {
		cfgList, _ := db.SysCfgGetAll(e)
		if cfgList == nil {
			return nil
		}
		for _, v := range *cfgList {
			res[v.Key] = v.Val
		}
		// 先不设置缓存
		// cache.SetJson(md.KEY_SYS_CFG_CACHE, res, 60)
	}
	if len(keys) == 0 {
		return res
	}
	tmp := map[string]string{}
	for _, v := range keys {
		if val, ok := res[v]; ok {
			tmp[v] = val
		} else {
			tmp[v] = ""
		}
	}
	return tmp
}

// 清理系统配置信息
func SysCfgCleanCache() {
	cache.Del(md.KEY_SYS_CFG_CACHE)
}

// 写入系统设置
func SysCfgSet(c *gin.Context, key, val, memo string) bool {
	cfg, err := db.SysCfgGetOne(db.DBs[c.GetString("mid")], key)
	if err != nil || cfg == nil {
		return db.SysCfgInsert(db.DBs[c.GetString("mid")], key, val, memo)
	}
	if memo != "" && cfg.Memo != memo {
		cfg.Memo = memo
	}
	SysCfgCleanCache()
	return db.SysCfgUpdate(db.DBs[c.GetString("mid")], key, val, cfg.Memo)
}

// 多条记录获取
func SysCfgFindByIds(eg *xorm.Engine, keys ...string) map[string]string {
	key := utils.Md5(eg.DataSourceName() + md.KEY_SYS_CFG_CACHE)
	res := map[string]string{}
	c, ok := cfg.MemCache.Get(key).(map[string]string)
	if !ok || len(c) == 0 {
		cfgList, _ := db.DbsSysCfgGetAll(eg)
		if cfgList == nil {
			return nil
		}
		for _, v := range *cfgList {
			res[v.Key] = v.Val
		}
		cfg.MemCache.Put(key, res, 10)
	} else {
		res = c
	}
	if len(keys) == 0 {
		return res
	}
	tmp := map[string]string{}
	for _, v := range keys {
		if val, ok := res[v]; ok {
			tmp[v] = val
		} else {
			tmp[v] = ""
		}
	}
	return tmp
}

// 多条记录获取
func SysCfgFindByIdsToCache(eg *xorm.Engine, dbName string, keys ...string) map[string]string {
	key := utils.Md5(dbName + md.KEY_SYS_CFG_CACHE)
	res := map[string]string{}
	c, ok := cfg.MemCache.Get(key).(map[string]string)
	if !ok || len(c) == 0 {
		cfgList, _ := db.DbsSysCfgGetAll(eg)
		if cfgList == nil {
			return nil
		}
		for _, v := range *cfgList {
			res[v.Key] = v.Val
		}
		cfg.MemCache.Put(key, res, 1800)
	} else {
		res = c
	}
	if len(keys) == 0 {
		return res
	}
	tmp := map[string]string{}
	for _, v := range keys {
		if val, ok := res[v]; ok {
			tmp[v] = val
		} else {
			tmp[v] = ""
		}
	}
	return tmp
}

// 支付配置
func SysCfgFindPayment(c *gin.Context) ([]map[string]string, error) {
	platform := c.GetHeader("platform")
	payCfg := SysCfgFind(c, "pay_wx_pay_img", "pay_ali_pay_img", "pay_balance_img", "pay_type")
	if payCfg["pay_wx_pay_img"] == "" || payCfg["pay_ali_pay_img"] == "" || payCfg["pay_balance_img"] == "" || payCfg["pay_type"] == "" {
		return nil, errors.New("lack of payment config")
	}
	payCfg["pay_wx_pay_img"] = ImageFormat(c, payCfg["pay_wx_pay_img"])
	payCfg["pay_ali_pay_img"] = ImageFormat(c, payCfg["pay_ali_pay_img"])
	payCfg["pay_balance_img"] = ImageFormat(c, payCfg["pay_balance_img"])

	var result []map[string]string

	if strings.Contains(payCfg["pay_type"], "aliPay") && platform != md.PLATFORM_WX_APPLET {
		item := make(map[string]string)
		item["pay_channel"] = "alipay"
		item["img"] = payCfg["pay_ali_pay_img"]
		item["name"] = "支付宝支付"
		result = append(result, item)
	}

	if strings.Contains(payCfg["pay_type"], "wxPay") {
		item := make(map[string]string)
		item["pay_channel"] = "wx"
		item["img"] = payCfg["pay_wx_pay_img"]
		item["name"] = "微信支付"
		result = append(result, item)
	}

	if strings.Contains(payCfg["pay_type"], "walletPay") {
		item := make(map[string]string)
		item["pay_channel"] = "fin"
		item["img"] = payCfg["pay_balance_img"]
		item["name"] = "余额支付"
		result = append(result, item)
	}

	return result, nil
}