package api

import (
	"epur-pay/cache"
	"epur-pay/model"
	"epur-pay/pkg/dapi"
	"epur-pay/pkg/utils"
)

type MenuResponse struct {
	*dapi.ResponseCommon
	Data []model.Menu `json:"data"` //数据列表
}

// @Summary 角色菜单列表
func GetMenuList(a *dapi.ApiBase) error {
	// 查询菜单
	menu := []model.Menu{}
	utils.Error(a.Ts.Raw(`
		select DISTINCT m.id,m.pid,m.title,m.icon,m.path,m.component,m.target,m.permission,m.type,m.status,m.hide,m.note,m.sort 
		from menu as m left join role_menu as rm on rm.menu_id = m.id 
    	left join user_role as ur on ur.role_id = rm.role_id 
           	where ur.uid = ? and m.type = 0 and m.status = 1 and m.is_delete = 0 
        order by m.pid asc, m.sort asc`, a.User.Uid).Scan(&menu).Error)

	Response := MenuResponse{}
	Response.Data = GetMenu(a.User.Detail.Token, menu, 0, nil)
	Response.ResponseCommon = a.NewSuccessResponseCommon()
	return a.ReturnSuccessCustomResponse(Response)
}

// 重装结构方式
func GetMenu(token string, menuList []model.Menu, pid int64, message map[string]int64) []model.Menu {
	treeList := []model.Menu{}
	for _, v := range menuList {
		if v.Pid == pid {
			child := GetMenu(token, menuList, v.Id, message)
			v.Children = child
			// 消息数量
			if message != nil {
				v.Meta.Badge = message[v.Permission]
			}
			treeList = append(treeList, v)
		}
	}
	return treeList
}

type MenuPermissionList struct {
	Permission string `json:"permission"`
}

type UserPermissionListResponse struct {
	*dapi.ResponseCommon
	Data struct {
		Id             int64    `json:"id"`       // 用户ID
		Nickname       string   `json:"nickname"` // 用户昵称
		RealName       string   `json:"realName"` // 别名
		Avatar         string   `json:"avatar"`   // 头像
		PermissionList []string `json:"permissionList"`
	} `json:"data"` //数据列表
}

// @Summary 权限标识列表
func GetPermissionList(a *dapi.ApiBase) error {
	Response := UserPermissionListResponse{}

	permission := []MenuPermissionList{}
	utils.Error(a.Ts.Raw(`select m.permission from menu as m left join role_menu as rm on rm.menu_id = m.id 
    	left join user_role as ur on ur.role_id = rm.role_id 
        where ur.uid = ? and m.type = 1 and m.status = 1 and m.is_delete = 0`,
		a.User.Uid).Scan(&permission).Error)

	var permissionList []string
	for _, v := range permission {
		permissionList = append(permissionList, v.Permission)
	}

	Response.Data.Id = a.User.Uid
	Response.Data.Nickname = a.User.Detail.Nickname
	Response.Data.RealName = a.User.Detail.Nickname
	//Response.Avatar = a.User.Detail.Avatar
	Response.Data.PermissionList = permissionList

	Response.ResponseCommon = a.NewSuccessResponseCommon()
	return a.ReturnSuccessCustomResponse(Response)
}

type GetPermissionMenuParams struct {
	MenuId int64 `json:"menuId"` //菜单集合
}

type MenuAllResponse struct {
	*dapi.ResponseCommon
	Data []model.Menu `json:"data"` //数据列表
}

// @Summary 获取所有菜单
func GetAllMenuList(a *dapi.ApiBase) error {
	Response := MenuResponse{}

	utils.Error(a.Ts.Raw(
		`select m.* from menu as m where m.is_delete = 0 order by m.pid asc, m.sort asc`).Scan(&Response.Data).Error)

	Response.ResponseCommon = a.NewSuccessResponseCommon()
	return a.ReturnSuccessCustomResponse(Response)
}

type EditMenuResponse struct {
	Id         int64  `json:"id,omitempty"` //菜单ID
	Pid        int64  `json:"pid"`          //菜单父级ID
	Title      string `json:"title"`        //菜单名称
	Icon       string `json:"icon"`         //菜单图标
	Path       string `json:"path"`         //菜单路径
	Component  string `json:"component"`    //菜单组件
	Target     int64  `json:"target"`       //打开方式 0-组件 1-内链 2-外链
	Permission string `json:"permission"`   //权限标识
	Type       int    `json:"type"`         //类型 0-菜单 1-节点
	Status     int    `json:"status"`       //状态 1-正常 2-禁用
	Hide       int    `json:"hide"`         //类型 0-显示 1-隐藏
	Note       string `json:"note"`         //备注
	Sort       int    `json:"sort"`         //排序
}

// @Summary 编辑菜单
func EditMenuInfo(a *dapi.ApiBase, data *EditMenuResponse) error {
	if data.Id > 0 {
		utils.Error(a.Ts.Model(&model.Menu{}).Where("id", data.Id).Updates(map[string]interface{}{
			"pid":        data.Pid,
			"status":     1,
			"title":      data.Title,
			"type":       data.Type,
			"permission": data.Permission,
			"hide":       data.Hide,
			"sort":       data.Sort,
			"target":     data.Target,
			"path":       data.Path,
			"component":  data.Component,
			"icon":       data.Icon,
		}).Error)
		// 这里要刷新下权限
		cache.Global.Caches.RolePermission = cache.Global.Caches.RolePermission.Refresh()
	} else {
		menu := &model.Menu{}
		menu.Pid = data.Pid
		menu.Title = data.Title
		menu.Type = data.Type
		menu.Permission = data.Permission
		menu.Hide = data.Hide
		menu.Sort = data.Sort
		menu.Target = data.Target
		menu.Path = data.Path
		menu.Component = data.Component
		menu.Icon = data.Icon
		menu.Status = 1
		// 如果是菜单的时候, 需要判断菜单权限表示是否重复
		if data.Type == 0 {
			if len(data.Permission) <= 0 {
				return a.ReturnPublicErrorResponse(a.Translate("AT021"))
			}

			var total int64
			utils.Error(a.Ts.Table(model.Menu{}.TableName()).Where(`permission = ?`, data.Permission).Count(&total).Error)
			if total > 0 {
				return a.ReturnPublicErrorResponse(a.Translate("AT000"))
			}
		}

		utils.Error(a.Ts.Create(&menu).Error)
	}

	return a.ReturnSuccessResponse()
}

type CommonIdsResponse struct {
	Id     []interface{} `json:"id"`
	Status string        `json:"status"`
}