package db

import (
	"applet/app/db/model"
	"applet/app/utils"
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/syyongx/php2go"
	"regexp"
	"strings"
)

func sysModFormat(c *gin.Context, m interface{}) (interface{}, error) {
	var mods []model.SysModule
	protocol := SysCfgGet(c, "file_bucket_scheme")
	domain := SysCfgGet(c, "file_bucket_host")
	//fmt.Println(protocol, domain)
	if protocol == "" || domain == "" {
		return nil, errors.New("System configuration error, object storage protocol and domain name not found")
	}
	modname_list := []string{"product", "search_result_taobao_item", "hot_rank_tab_view"}
	switch m.(type) {
	case *[]model.SysModule:
		ms := m.(*[]model.SysModule)
		for _, item := range *ms {
			item.Data = ReformatStr(protocol, domain, item.Data, c)
			if item.ModName == "product_detail_title" {
				if strings.Contains(item.Data, "tmall") == false {
					item.Data = strings.Replace(item.Data, "\"platform_css\":[", "\"platform_css\":[{\"name\":\"天猫\",\"type\":\"tmall\",\"text_color\":\"#FFFFFF\",\"bg_color\":\"#FF4242\"},", 1)
				}
				if strings.Contains(item.Data, "kuaishou") == false {
					item.Data = strings.Replace(item.Data, "\"platform_css\":[", "\"platform_css\":[{\"name\":\"快手\",\"type\":\"kuaishou\",\"text_color\":\"#FFFFFF\",\"bg_color\":\"#FF4242\"},", 1)
				}
				if strings.Contains(item.Data, "tikTok") == false {
					item.Data = strings.Replace(item.Data, "\"platform_css\":[", "\"platform_css\":[{\"name\":\"抖音\",\"type\":\"tikTok\",\"text_color\":\"#FFFFFF\",\"bg_color\":\"#FF4242\"},", 1)
				}
			}

			if strings.Contains(item.Data, "tmall") == false && utils.InArr(item.ModName, modname_list) {
				item.Data = strings.Replace(item.Data, "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"},{\"index\":\"7\",\"type\":\"tmall\",\"platform_name\":\"天猫\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", 1)
				item.Data = strings.Replace(item.Data, "{\"type\":\"kaola\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", "{\"type\":\"kaola\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"},{\"type\":\"tmall\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", 1)
			}
			if strings.Contains(item.Data, "\"virtual_coin_pre_fix_name\":") == false && item.ModName == "product" {
				item.Data = strings.ReplaceAll(item.Data, "\"virtual_coin_name\":", "\"virtual_coin_pre_fix_name\":\"返\",\"virtual_coin_name\":")
			}
			item = SysModDataByReplace(c, item)

			mods = append(mods, item)
		}
		return &mods, nil
	case *model.SysModule:
		m := m.(*model.SysModule)
		m.Data = ReformatStr(protocol, domain, m.Data, c)
		m = SysModDataByReplaceSecond(c, m)
		return m, nil
	case []*model.UserLevel:
		ms := m.([]*model.UserLevel)
		for _, item := range ms {
			item.CssSet = ReformatStr(protocol, domain, item.CssSet, c)
		}
		return ms, nil
	case []*model.SysPushUser:
		ms := m.([]*model.SysPushUser)
		for _, item := range ms {
			item.SendData = ReformatStr(protocol, domain, item.SendData, c)
		}
		return ms, nil
	case *model.SysPushUser:
		m := m.(*model.SysPushUser)
		m.SendData = ReformatStr(protocol, domain, m.SendData, c)
		return m, nil
	default:
		return nil, nil
	}
}

func ReformatComm(str, protocol, domain string) string {
	// PNG
	replaceList := reformatImg(str)
	l := removeDuplicateElement(replaceList)
	for _, s := range l {
		if strings.Contains(s, "http") {
			continue
		}
		ss := s
		s = strings.ReplaceAll(s, `\`, "")
		s = strings.ReplaceAll(s, `"`, "")
		s = php2go.Rawurlencode(s)
		new := fmt.Sprintf("%s://%s/%s", protocol, domain, s)
		//if skipHTTPPng(new) {
		//	continue
		//}
		str = strings.Replace(str, ss, `"`+new+`"`, -1)
	}
	return str
}
func ReformatStr(protocol, domain, str string, c *gin.Context) string {
	//protocol := SysCfgGet(c, "file_bucket_scheme")
	//domain := SysCfgGet(c, "file_bucket_host")

	// PNG
	str = ReformatComm(str, protocol, domain)
	return str
}

// 正则匹配
func reformatPng(data string) []string {
	re, _ := regexp.Compile(`"([^\"]*.png")`)
	list := re.FindAllString(data, -1)
	return list
}
func reformatJpeg(data string) []string {
	re, _ := regexp.Compile(`"([^\"]*.jpeg")`)
	list := re.FindAllString(data, -1)
	return list
}
func reformatMp4(data string) []string {
	re, _ := regexp.Compile(`"([^\"]*.mp4")`)
	list := re.FindAllString(data, -1)
	return list
}

func skipHTTPPng(data string) bool {
	re, _ := regexp.Compile(`(http|https):\/\/([^\"]*.png)`)
	return re.MatchString(data)
}

// 正则匹配
func reformatJPG(data string) []string {
	re, _ := regexp.Compile(`"([^\"]*.jpg")`)
	list := re.FindAllString(data, -1)
	return list
}

// 正则匹配
func reformatGIF(data string) []string {
	re, _ := regexp.Compile(`"([^\"]*.gif")`)
	list := re.FindAllString(data, -1)
	return list
}
func reformatImg(data string) []string {
	re, _ := regexp.Compile(`"([^\"]*.(png|jpg|jpeg|gif|mp4)")`)
	list := re.FindAllString(data, -1)
	return list
}

func removeDuplicateElement(addrs []string) []string {
	result := make([]string, 0, len(addrs))
	temp := map[string]int{}
	i := 1
	for _, item := range addrs {
		if _, ok := temp[item]; !ok {
			temp[item] = i
			result = append(result, item)
			continue
		}
		temp[item] = temp[item] + 1
	}
	// fmt.Println(temp)
	return result
}

// 单条记录获取DB
func SysCfgGet(c *gin.Context, key string) string {
	res := SysCfgFind(c, key)
	//fmt.Println(res)
	if _, ok := res[key]; !ok {
		return ""
	}
	return res[key]
}

// 多条记录获取
func SysCfgFind(c *gin.Context, keys ...string) map[string]string {
	eg := DBs[c.GetString("mid")]
	masterId := c.GetString("mid")
	res := map[string]string{}
	//TODO::判断keys长度(大于10个直接查数据库)
	if len(keys) > 10 {
		cfgList, _ := SysCfgGetAll(eg)
		if cfgList == nil {
			return nil
		}
		for _, v := range *cfgList {
			res[v.Key] = v.Val
		}
	} else {
		for _, key := range keys {
			res[key] = SysCfgGetWithDb(eg, masterId, key)
		}
	}
	return res
}