package model

import (
	"strings"
	"time"
)

// SysMenu 菜单结构体
type SysMenu struct {
	Id         int64     `xorm:"pk autoincr" json:"id"`              //主键Id
	ParentId   int64     `json:"parentId"`                           //父Id
	MenuName   string    `xorm:"varchar(128)" json:"menuName"`       //菜单名称
	OrderNum   int       `xorm:"int" json:"orderNum"`                //显示顺序
	Path       string    `xorm:"varchar(200)" json:"path"`           //请求路径
	MenuType   string    `xorm:"char(1)" json:"menuType"`            //菜单类型 (M目录 C菜单 F按钮)
	Visible    bool      `xorm:"bool default(0)" json:"visible"`     //菜单状态 (0显示 1隐藏)
	IsFrame    int       `json:"isFrame"`                            //是否为外链(0是 1否)
	IsCache    int       `json:"isCache"`                            //是否缓存(0缓存 1不缓存)
	Perms      string    `xorm:"text json" excel:"" json:"perms"  `  //控制权限
	Icon       string    `xorm:"varchar(100)" json:"icon"`           //图标
	Remark     string    `xorm:"varchar(512)" json:"remark"`         //备注
	CreateTime time.Time `xorm:"created" json:"createTime"`          //创建时间
	CreateBy   string    `json:"createBy"`                           //创建人
	UpdateTime time.Time `json:"updateTime"`                         //更新时间
	UpdateBy   string    `json:"updateBy"`                           //更新人
	Status     string    `xorm:"char(1)  default(0)"  json:"status"` //菜单状态(0正常 1停用)
	Component  string    `xorm:"varchar(255)" json:"component"`      //组件路径
}

func (r *SysMenu) Key() int64 {
	return r.Id
}

func (r *SysMenu) Model() interface{} {
	return r
}
func (SysMenu) TableName() string {
	return "sys_menu"
}
func (s SysMenu) GetPath() string {
	return s.Path
}
func (s SysMenu) GetName() string {
	return strings.Title(s.Path)
}
func (s SysMenu) GetMenuId() int64 {
	return s.Id
}
func (s SysMenu) GetParentId() int64 {
	return s.ParentId
}
func (s SysMenu) GetData() interface{} {
	return s
}
func (s SysMenu) IsRoot() bool {
	// 这里通过FatherId等于0 或者 FatherId等于自身Id表示顶层根节点
	return s.ParentId == 0 || s.ParentId == s.Id
}

func (s SysMenu) GetId() int64 {
	return s.Id
}

func (s SysMenu) GetLabel() string {
	return s.MenuName
}

func (s SysMenu) IsDifferent(menu SysMenu) bool {
	return s.ParentId != menu.ParentId ||
		s.MenuName != menu.MenuName ||
		s.OrderNum != menu.OrderNum ||
		s.Path != menu.Path ||
		s.MenuType != menu.MenuType ||
		s.Visible != menu.Visible ||
		s.IsFrame != menu.IsFrame ||
		s.IsCache != menu.IsCache ||
		s.Perms != menu.Perms ||
		s.Icon != menu.Icon ||
		s.Remark != menu.Remark ||
		s.Status != menu.Status ||
		s.Component != menu.Component
}