package eta_business

import (
	"encoding/json"
	"hongze/hz_crm_api/controllers"
	"hongze/hz_crm_api/models"
	"hongze/hz_crm_api/models/eta_business"
	etaBusinessService "hongze/hz_crm_api/services/eta_business"
)

// EtaBusinessMenuController ETA商家菜单
type EtaBusinessMenuController struct {
	controllers.BaseAuthController
}

// List
// @Title 商家菜单列表
// @Description 商家菜单列表
// @Param   BusinessId	query	int	false	"商家ID"
// @Success 200 Ret=200 获取成功
// @router /menu/list [get]
func (this *EtaBusinessMenuController) List() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}

	resp := new(eta_business.EtaBusinessMenuListResp)
	resp.ChoiceList = make([]int, 0)
	resp.HalfChoiceList = make([]int, 0)
	resp.List = make([]*eta_business.EtaBusinessMenuItem, 0)
	// 权限校验
	ok, e := etaBusinessService.CheckEtaBusinessOperateAuth(sysUser.RoleTypeCode)
	if e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "操作权限校验失败, ErrMsg: " + e.Error()
		return
	}
	if !ok {
		br.Data = resp
		br.Ret = 200
		br.Success = true
		br.Msg = "获取成功"
		return
	}

	// 商家勾选的权限
	businessId, _ := this.GetInt("EtaBusinessId", 0)
	if businessId > 0 {
		relateOb := new(eta_business.EtaBusinessMenuRelate)
		cond := ` AND eta_business_id = ?`
		pars := make([]interface{}, 0)
		pars = append(pars, businessId)
		relates, e := relateOb.GetItemsByCondition(cond, pars, []string{}, "")
		if e != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取商家菜单关联列表失败, Err: " + e.Error()
			return
		}
		for _, r := range relates {
			if r.Type == 1 {
				resp.HalfChoiceList = append(resp.HalfChoiceList, r.MenuId)
				continue
			}
			resp.ChoiceList = append(resp.ChoiceList, r.MenuId)
		}
	}

	menuOb := new(eta_business.EtaBusinessMenu)
	order := `sort ASC, create_time DESC, menu_id DESC`
	list, e := menuOb.GetItemsByCondition("", make([]interface{}, 0), []string{}, order)
	if e != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取商家菜单列表失败, Err: " + e.Error()
		return
	}

	items := make([]*eta_business.EtaBusinessMenuItem, 0)
	for _, v := range list {
		t := &eta_business.EtaBusinessMenuItem{
			MenuId:       v.MenuId,
			ParentId:     v.ParentId,
			Name:         v.Name,
			Sort:         v.Sort,
			Path:         v.Path,
			PathName:     v.PathName,
			IconPath:     v.IconPath,
			Component:    v.Component,
			Hidden:       v.Hidden,
			HiddenLayout: v.HiddenLayout,
			Level:        v.Level,
			MenuType:     v.MenuType,
			ButtonCode:   v.ButtonCode,
			Children:     make([]*eta_business.EtaBusinessMenuItem, 0),
		}
		items = append(items, t)
	}

	// 递归返回树形结构
	items = etaBusinessService.GetMenuTreeRecursive(items, 0)

	resp.List = items
	br.Data = resp
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
}

// SaveRelate
// @Title 保存商家菜单关联
// @Description 保存商家菜单关联
// @Param	request	body eta_business.EtaBusinessAddReq true "type json string"
// @Success 200 Ret=200 操作成功
// @router /menu/relate/save [post]
func (this *EtaBusinessMenuController) SaveRelate() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}

	// 操作权限校验
	ok, e := etaBusinessService.CheckEtaBusinessOperateAuth(sysUser.RoleTypeCode)
	if e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "操作权限校验失败, ErrMsg: " + e.Error()
		return
	}
	if !ok {
		br.Msg = "无权操作"
		return
	}

	// 参数校验
	var req eta_business.EtaBusinessMenuRelateSaveReq
	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + e.Error()
		return
	}
	if req.EtaBusinessId <= 0 {
		br.Msg = "参数有误"
		return
	}
	if len(req.MenuIds) == 0 {
		br.Msg = "请选择菜单"
		return
	}

	ob := new(eta_business.EtaBusinessMenuRelate)
	items := make([]*eta_business.EtaBusinessMenuRelate, 0)
	for _, v := range req.MenuIds {
		t := new(eta_business.EtaBusinessMenuRelate)
		t.MenuId = v
		t.EtaBusinessId = req.EtaBusinessId
		items = append(items, t)
	}
	for _, v := range req.HalfMenuIds {
		t := new(eta_business.EtaBusinessMenuRelate)
		t.MenuId = v
		t.Type = 1
		t.EtaBusinessId = req.EtaBusinessId
		items = append(items, t)
	}
	if e := ob.CreateMulti(req.EtaBusinessId, items); e != nil {
		br.Msg = "保存失败"
		br.ErrMsg = "保存商家菜单关联失败, Err: " + e.Error()
		return
	}

	// TODO:后续需要生成SQL脚本文件

	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
}