package wechatmenu

import (
	"encoding/json"
	"strings"
	"wechat-conf/controllers"
	"wechat-conf/models/model"
	"wechat-conf/service/keyvalue"
	"wechat-conf/service/sysuser"
	"wechat-conf/service/wechatmenu"
	"wechat-conf/utils"

	"github.com/astaxie/beego"
)

// MenuController 信息
type MenuController struct {
	dao  *wechatmenu.WechatmenuServ
	sdao *sysuser.SysuserServ
	kdao *keyvalue.KeyvalueServ
	controllers.BaseController
}

// Constructor 初始化 Controller
// @Title Constructor
// @Description 初始化 Controller, 系统自动调用
func (c *MenuController) Constructor() {
	c.dao = wechatmenu.NewWechatmenuServ(c.Context)
	c.sdao = sysuser.NewSysuserServ(c.Context)
	c.kdao = keyvalue.NewKeyvalueServ(c.Context)
}

type Wehchatmenu struct {
	WechatJson string
}
type WechatMenuDetailSub struct {
	Name     string `json:"name"`
	Type     string `json:"type"`
	Value    string `json:"value,omitempty"`
	Url      string `json:"url,omitempty"`
	Media_Id string `json:"media_id,omitempty"`
	Key      string `json:"key,omitempty"`
}
type WechatMenuDetail struct {
	Name       string                `json:"name"`
	Type       string                `json:"type"`
	Value      string                `json:"value,omitempty"`
	Url        string                `json:"url,omitempty"`
	Media_Id   string                `json:"media_id,omitempty"`
	Key        string                `json:"key,omitempty"`
	Sub_Button []WechatMenuDetailSub `json:"sub_button"`
}
type WechatMenu struct {
	Button []WechatMenuDetail `json:"button"`
}
type WechatMenus struct {
	Menu WechatMenu `json:"menu"`
}

func (c *MenuController) GetMenuList() {
	user := c.Context.Get("user").(*model.SysUser)
	appId, err := c.sdao.GetAppIdByOrgId(user.OrgId)
	if err != nil {
		c.ResponseError(err)
	}
	client, err := utils.Component.GetWxClient(appId)
	if err != nil {
		c.ResponseError(err)
	}
	menu, err := client.GetMenu()
	beego.Error(menu)
	var keyList []*model.TaWechatKeyValue
	if menu != nil {
		menus := menu["menu"].(map[string]interface{})
		wechatmenu := menus["button"].([]interface{})
		for i := 0; i < len(wechatmenu); i++ {
			m := wechatmenu[i].(map[string]interface{})
			if m["type"] != nil {
				if m["type"].(string) == "click" {
					key, err := c.kdao.GetValueByKey(m["key"].(string))
					if err != nil {
						c.ResponseError(err)
					}
					keyList = append(keyList, key)
				}
			}
			if m["sub_button"] != nil {
				subbuttons := m["sub_button"].([]interface{})
				for j := 0; j < len(subbuttons); j++ {
					subb := subbuttons[j].(map[string]interface{})
					if subb["type"].(string) == "click" {
						key, err := c.kdao.GetValueByKey(subb["key"].(string))
						if err != nil {
							c.ResponseError(err)
						}
						keyList = append(keyList, key)
					}
				}
			}
		}
	}

	if err != nil {
		var code string = err.Error()
		if strings.Contains(code, "46003") {
			c.ResponseJSON(menu)
		} else {
			c.ResponseError(err)
		}
	}
	c.ResponseJSON(map[string]interface{}{
		"menu":    menu,
		"keyList": keyList,
	})
}

func (c *MenuController) RefreshMenu() {
	user := c.Context.Get("user").(*model.SysUser)
	err := c.kdao.DeleteByOrgId(user.OrgId)
	if err != nil {
		c.ResponseError(err)
	}
	wechatJson := Wehchatmenu{}
	if err := c.ParseForm(&wechatJson); err != nil {
		c.ResponseError(err)
	}
	str := wechatJson.WechatJson
	var menu WechatMenus
	err = json.Unmarshal([]byte(str), &menu)
	//var data []byte = []byte(str)
	if err != nil {
		c.ResponseError(err)
	}
	wechatmenu := menu.Menu.Button
	beego.Error(wechatmenu)
	for i := 0; i < len(wechatmenu); i++ {
		if wechatmenu[i].Type == "text" {
			wechatmenu[i].Type = "click"
			var keyvalue = model.TaWechatKeyValue{
				KeyId: utils.GetGUID(),
				Value: wechatmenu[i].Value,
				OrgId: user.OrgId,
			}
			err := c.kdao.AddKeyvalue(keyvalue)
			if err != nil {
				c.ResponseError(err)
			}
			wechatmenu[i].Key = keyvalue.KeyId
			wechatmenu[i].Value = ""
		}
		for j := 0; j < len(wechatmenu[i].Sub_Button); j++ {
			if wechatmenu[i].Sub_Button[j].Type == "text" {
				wechatmenu[i].Sub_Button[j].Type = "click"
				var keyvalue = model.TaWechatKeyValue{
					KeyId: utils.GetGUID(),
					Value: wechatmenu[i].Sub_Button[j].Value,
					OrgId: user.OrgId,
				}
				err := c.kdao.AddKeyvalue(keyvalue)
				if err != nil {
					c.ResponseError(err)
				}
				wechatmenu[i].Sub_Button[j].Key = keyvalue.KeyId
				wechatmenu[i].Sub_Button[j].Value = ""
			}
		}
	}
	beego.Error(wechatmenu)
	var upwechat WechatMenu
	upwechat.Button = wechatmenu
	menuData, err := json.Marshal(upwechat)
	if err != nil {
		c.ResponseError(err)
	}
	beego.Error(string(menuData))
	err = c.dao.UpdateWechatMenu(string(menuData), user.OrgId)
	if err != nil {
		c.ResponseError(err)
	}
	appId, err := c.sdao.GetAppIdByOrgId(user.OrgId)
	if err != nil {
		c.ResponseError(err)
	}
	client, err := utils.Component.GetWxClient(appId)
	if err != nil {
		c.ResponseError(err)
	}
	err = client.RefreshMenu(menuData)
	if err != nil {
		c.ResponseError(err)
	}
	c.ResponseJSON("操作成功!")
}