package system

import (
	"context"
	"hongze/fms_api/global"
	"hongze/fms_api/models/base"
)

// 菜单表
type SysMenu struct {
	MenuId       int64  `gorm:"primaryKey;column:menu_id;" json:"menu_id"`
	ParentId     int64  `gorm:"column:parent_id" json:"parent_id"`         //父级菜单ID
	RootId       int64  `gorm:"column:root_id" json:"root_id"`             //顶层菜单ID
	Name         string `gorm:"column:name" json:"name"`                   //菜单名称或者按钮名称
	Sort         int8   `gorm:"column:sort" json:"sort"`                   //排序序号
	Path         string `gorm:"column:path" json:"path"`                   //路由地址
	PathName     string `gorm:"column:path_name" json:"path_name"`         //路由名称
	IconPath     string `gorm:"column:icon_path" json:"icon_path"`         //菜单图标地址
	Component    string `gorm:"column:component" json:"component"`         //组件路径
	Hidden       int8   `gorm:"column:hidden" json:"hidden"`               //是否隐藏:1-隐藏 0-显示
	HiddenLayout int8   `gorm:"column:hidden_layout" json:"hidden_layout"` //是否隐藏layout:1-隐藏 0-显示
	Level        int8   `gorm:"column:level" json:"level"`
	MenuType     int8   `gorm:"column:menu_type" json:"menu_type"`     //菜单类型: 0-菜单, 1-按钮
	ButtonCode   string `gorm:"column:button_code" json:"button_code"` //按钮唯一标识
	base.TimeBase
}

// TableName get sql table name.获取数据库表名
func (m *SysMenu) TableName() string {
	return "sys_menu"
}
type SysMenuAddReq struct {
	ParentId     int64  `json:"parent_id"`                                     //父级菜单ID
	Name         string `json:"name" binding:"required"`                       //菜单名称或者按钮名称
	Sort         int8   `json:"sort"`                                          //排序序号
	Path         string `json:"path"`                                          //路由地址
	PathName     string `json:"path_name"`                                     //路由名称
	IconPath     string `json:"icon_path"`                                     //菜单图标地址
	Component    string `json:"component"`                                     //组件路径
	Hidden       int8   `json:"hidden" binding:"oneof=0 1"`                    //是否隐藏:1-隐藏 0-显示
	HiddenLayout int8   `json:"hidden_layout" binding:"oneof=0 1"`             //是否隐藏layout:1-隐藏 0-显示
	MenuType     int8   `json:"menu_type" binding:"oneof=0 1"`                 //菜单类型: 0-菜单, 1-按钮
	ButtonCode   string `json:"button_code" binding:"required_if=menu_type 1"` //按钮唯一标识
}
type SysMenuEditReq struct {
	MenuId     int64  `json:"menu_id" binding:"required,gte=1"`
	SysMenuAddReq
}
// 新增
func (m *SysMenu) Add() (err error) {
	err = global.DEFAULT_MYSQL.Create(m).Error
	return
}

// 修改
func (m *SysMenu) Update(updateCols []string) (err error) {
	err = global.DEFAULT_MYSQL.Model(m).Select(updateCols).Updates(m).Error
	return
}

func (m *SysMenu) SelectPage(page base.IPage, condition string, pars []interface{}) (count int64,results []*SysMenu, err error) {
	results = make([]*SysMenu, 0)
	query := global.DEFAULT_MYSQL.WithContext(context.TODO()).Model(m).
		Where(condition, pars...)
	query.Count(&count)
	if len(page.GetOrderItemsString()) > 0 {
		query = query.Order(page.GetOrderItemsString())
	}
	err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
	return
}

type SysMenuButtonResp struct {
	MenuId     int64  `json:"menu_id"`                                       //菜单ID
	ParentId   int64  `json:"parent_id"`                                     //父级菜单ID
	Name       string `json:"name" binding:"required"`                       //菜单名称或者按钮名称
	MenuType   int8   `json:"menu_type" binding:"oneof=0 1"`                 //菜单类型: 0-菜单, 1-按钮
	ButtonCode string `json:"button_code" binding:"required_if=menu_type 1"` //按钮唯一标识
}

func (m *SysMenu) GetMenuListByCondition(condition string, pars []interface{}, orderStr string) (results []*SysMenu, err error) {
	results = make([]*SysMenu, 0)
	if orderStr == "" {
		orderStr = "sort asc, create_time desc"
	}
	err = global.DEFAULT_MYSQL.WithContext(context.TODO()).Model(m).
		Where(condition, pars...).Order(orderStr).Find(&results).Error
	return
}

type MenuShortListItem struct {
	MenuId int64 `json:"menu_id" form:"menu_id"` //菜单ID
}

type MenuListReq struct {
	base.PageReq
	Name       string `json:"name" form:"name"`        //菜单名称或者按钮名称
	HideLevel3 int8   `json:"hide_level3" form:"hide_level3"` //返回值是否需要隐藏三级的菜单和三级按钮(1-隐藏,0-不隐藏)
	HideButton int8   `json:"hide_button" form:"hide_button"` //返回值是否需要隐藏按钮(1-隐藏,0-不隐藏)
}

type MenuListItemResp struct {
	MenuId       int64               `json:"menu_id"`       //菜单ID
	ParentId     int64               `json:"parent_id"`     //父级菜单ID
	Name         string              `json:"name"`          //菜单名称或者按钮名称
	Sort         int8                `json:"sort"`          //排序序号
	Path         string              `json:"path"`          //页面地址或者Api请求地址
	PathName     string              `json:"path_name"`     //路由名称
	IconPath     string              `json:"icon_path"`     //菜单图标地址
	Component    string              `json:"component"`     //组件路径
	Hidden       int8                `json:"hidden"`        //是否隐藏:1-隐藏 0-显示
	HiddenLayout int8                `json:"hidden_layout"` //是否隐藏layout:1-隐藏 0-显示
	Level        int8                `json:"level"`
	MenuType     int8                `json:"menu_type"`   //菜单类型: 0-菜单, 1-按钮
	ButtonCode   string              `json:"button_code"` //按钮唯一标识
	HasBind      bool                `json:"has_bind"`    //是否已绑定,true 已绑定,false 未绑定
	CreateTime   string              `json:"create_time"` //创建时间
	ModifyTime   string              `json:"modify_time"` //最后更新时间
	Children     []*MenuListItemResp `json:"children"`
}

func (m *SysMenu) GetMenuByName(name string) (list []*SysMenu, err error) {
	err = global.DEFAULT_MYSQL.Model(m).Where("name like ?", name).Find(&list).Error
	return
}

func (m *SysMenu) GetMenuByMenuId(menuId int64) (item *SysMenu, err error) {
	err = global.DEFAULT_MYSQL.Model(m).Where("menu_id = ?", menuId).First(&item).Error
	return
}

// 删除
func (m *SysMenu) DeleteByCondition(condition string, pars []interface{}) (err error) {
	err = global.DEFAULT_MYSQL.Where(condition, pars...).Delete(m).Error
	return
}