package db

import (
	"applet/app/cfg"
	"applet/app/db/model"
	"applet/app/utils"
	"applet/app/utils/cache"
	"crypto/tls"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/tidwall/gjson"
	"io"
	"io/ioutil"
	"net/http"
	"strings"
	"time"
	"xorm.io/xorm"
)

func GetAppletKey(c *gin.Context, eg *xorm.Engine) map[string]string {
	appId := c.GetHeader("appid")
	isFilterTaobao := "0"
	appletName := ""
	appletLogo := ""
	originalAppId := ""
	bottomNavCssId := ""
	mpAuditVersion := ""
	MpAuditGoodsDetailCssId := ""
	orderCssId := ""
	if appId == "" {
		wxAppletCfg := SysCfgGetWithDb(eg, c.GetString("mid"), "wx_applet_key")
		isFilterTaobao = gjson.Get(wxAppletCfg, "taobaoGoodsOnOff").String()
		appletName = gjson.Get(wxAppletCfg, "appletName").String()
		originalAppId = gjson.Get(wxAppletCfg, "originalAppId").String()
		appletLogo = gjson.Get(wxAppletCfg, "appletIcon").String()
		mpAuditVersion = SysCfgGetWithDb(eg, c.GetString("mid"), "mp_audit_version")
		var tm model.SysTemplate
		if has, err := eg.Where("is_use = 1 AND type = 'bottom' AND platform = 4 ").
			Cols("id,uid,name,is_use,is_system").
			Get(&tm); err != nil || has == false {
			bottomNavCssId = ""
		} else {
			bottomNavCssId = utils.IntToStr(tm.Id)
		}
		if c.GetHeader("AppVersionName") == mpAuditVersion && c.GetHeader("AppVersionName") != "" {
			m := SysCfgGetWithDb(eg, c.GetString("mid"), "mp_audit_template")
			if m != "" {
				bottomNavCssId = utils.Int64ToStr(gjson.Get(m, "bottom").Int())
			}
			m1 := SysCfgGet(c, "mp_audit_template")
			if m1 != "" {
				MpAuditGoodsDetailCssId = utils.Int64ToStr(gjson.Get(m1, "product_detail").Int())
			}
		}
		appId = gjson.Get(wxAppletCfg, "appId").String()
	} else {
		var wxApplet model.WxAppletList
		has, err2 := eg.Where("app_id=?", appId).Get(&wxApplet)
		if has && err2 == nil {
			isFilterTaobao = utils.IntToStr(wxApplet.IsFilterTaobao)
			appletName = wxApplet.AppletName
			appletLogo = wxApplet.AppletLogo
			originalAppId = wxApplet.OriginalAppId
			orderCssId = utils.IntToStr(wxApplet.OrderCssId)
			mpAuditVersion = wxApplet.MpAuditVersion
			bottomNavCssId = utils.IntToStr(wxApplet.BottomNavCssId)
			MpAuditGoodsDetailCssId = ""
			if c.GetHeader("AppVersionName") == mpAuditVersion && c.GetHeader("AppVersionName") != "" {
				bottomNavCssId = utils.IntToStr(wxApplet.MpAuditCssId)
				MpAuditGoodsDetailCssId = utils.IntToStr(wxApplet.MpAuditGoodsDetailCssId)
			}
		}
	}
	r := map[string]string{
		"order_css_id":                 orderCssId,
		"app_id":                       appId,
		"is_filter_taobao":             isFilterTaobao,
		"applet_name":                  appletName,
		"applet_logo":                  appletLogo,
		"original_app_id":              originalAppId,
		"bottom_nav_css_id":            bottomNavCssId,
		"mp_audit_version":             mpAuditVersion,
		"mp_audit_goods_detail_css_id": MpAuditGoodsDetailCssId,
	}
	return r

}
func GetShareUse(c *gin.Context, eg *xorm.Engine) map[string]string {
	var wxApplet model.WxAppletList
	has, err2 := eg.Where("share_use=?", 1).Asc("id").Get(&wxApplet)
	wxAppletCfg := SysCfgGetWithDb(eg, c.GetString("mid"), "wx_applet_key")
	originalAppId := gjson.Get(wxAppletCfg, "originalAppId").String()
	appId := gjson.Get(wxAppletCfg, "appId").String()
	if has && err2 == nil {
		originalAppId = wxApplet.OriginalAppId
		appId = wxApplet.AppId
	}
	r := map[string]string{
		"app_id":          appId,
		"original_app_id": originalAppId,
	}
	return r
}
func GetAppletToken(c *gin.Context, appId string, isMore, isReset string) (accessToken string) {
	key := fmt.Sprintf("%s:%s:%s", c.GetString("mid"), "wx_applet_access_token2", appId)
	token, err := cache.GetString(key)
	if err == nil && token != "" && strings.Contains(token, "{") == false && isReset == "0" {
		// 有缓存
		accessToken = token
	} else {
		ExpiresIn := 1800
		accessTokenStr := ApiToSuperAdminWx(c, appId, isMore)
		if accessTokenStr == "" {
			return ""
		}
		ExpiresIn = int(gjson.Get(accessTokenStr, "expires_in").Int()) - 60*60*1 //TODO::暂时只用1个小时
		accessToken = gjson.Get(accessTokenStr, "authorizer_access_token").String()
		if ExpiresIn > 0 {
			//fmt.Printf("返回结果: %#v", res)
			_, err = cache.SetEx(key, accessToken, ExpiresIn)
			if err != nil {
				fmt.Println("微信授权错误", err)
				return ""
			}
		}

	}
	return accessToken
}

// 总后台微信token isMore多小程序登录总后台要判断读另一个表
func ApiToSuperAdminWx(c *gin.Context, appid string, isMore string) string {
	var req = make(map[string]string, 0)
	var host string
	host = cfg.WebsiteBackend.URL + "/Wx/getAuthorizerResult?appid=" + appid + "&is_more=" + isMore
	fmt.Println(host)
	tr := &http.Transport{
		MaxIdleConnsPerHost: 200,
		MaxIdleConns:        200,
		MaxConnsPerHost:     200,
		TLSClientConfig:     &tls.Config{InsecureSkipVerify: true},
	}
	client := &http.Client{
		Timeout:   5 * time.Second,
		Transport: tr,
	}
	byte1, _ := json.Marshal(req)
	req1, _ := http.NewRequest("POST", host, strings.NewReader(string(byte1)))
	req1.Header.Set("Content-Type", "application/json")
	resp, err := (client).Do(req1)
	if err != nil || resp == nil {
		if resp != nil {
			_, _ = io.Copy(ioutil.Discard, resp.Body)
		}
		return ""
	}
	defer resp.Body.Close()
	respByte, _ := ioutil.ReadAll(resp.Body)

	if len(respByte) == 0 {
		return ""
	}
	return string(respByte)

}