package domain

import (
	"fmt"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/constant"
	"time"
)

// 角色类型  1.普通角色  1024:超级管理员
const (
	RoleTypeNormal = 1
	RoleTypeAdmin  = 1024
)

const (
	DefaultAdminRoleName = "企业管理员" //注册默认生成的角色名
)

// 角色 (base)
type Role struct {
	// 角色ID
	RoleId int64 `json:"roleId,omitempty"`
	// 企业id
	CompanyId int64 `json:"companyId,omitempty"`
	// 组织ID
	OrgId int64 `json:"orgId,omitempty"`
	// 角色类型  1.普通角色  1024:超级管理员
	RoleType int `json:"roleType,omitempty"`
	// 角色名称
	RoleName string `json:"roleName,omitempty"`
	// 有权限的菜单
	AccessMenus []int64 `json:"accessMenus,omitempty"`
	// 描述
	Desc string `json:"desc,omitempty"`
	// 扩展数据
	Ext *Ext `json:"ext,omitempty"`
	// 创建时间
	CreatedAt time.Time `json:"createdAt,omitempty"`
	// 更新时间
	UpdatedAt time.Time `json:"updatedAt,omitempty"`
	// 删除时间
	DeletedAt time.Time `json:"deletedAt,omitempty"`
}

type RoleRepository interface {
	Save(role *Role) (*Role, error)
	Remove(role *Role) (*Role, error)
	FindOne(queryOptions map[string]interface{}) (*Role, error)
	Find(queryOptions map[string]interface{}) (int64, []*Role, error)
}

func (role *Role) Identify() interface{} {
	if role.RoleId == 0 {
		return nil
	}
	return role.RoleId
}

func (role *Role) Update(data map[string]interface{}) error {
	if companyId, ok := data["companyId"]; ok {
		role.CompanyId = companyId.(int64)
	}
	if orgId, ok := data["orgId"]; ok {
		role.OrgId = orgId.(int64)
	}
	if roleType, ok := data["roleType"]; ok {
		role.RoleType = roleType.(int)
	}
	if roleName, ok := data["roleName"]; ok {
		role.RoleName = roleName.(string)
	}
	if accessMenus, ok := data["accessMenus"]; ok {
		role.AccessMenus = accessMenus.([]int64)
	}
	if desc, ok := data["desc"]; ok {
		role.Desc = desc.(string)
	}
	if userName, ok := data["userName"]; ok {
		role.Ext.UserName = userName.(string)
	}
	if orgName, ok := data["orgName"]; ok {
		role.Ext.OrgName = orgName.(string)
	}
	if phone, ok := data["phone"]; ok {
		role.Ext.Phone = phone.(string)
	}
	if depName, ok := data["depName"]; ok {
		role.Ext.DepName = depName.(string)
	}
	if parentDepName, ok := data["parentDepName"]; ok {
		role.Ext.ParentDepName = parentDepName.(string)
	}
	if createdAt, ok := data["createdAt"]; ok {
		role.CreatedAt = createdAt.(time.Time)
	}
	if updatedAt, ok := data["updatedAt"]; ok {
		role.UpdatedAt = updatedAt.(time.Time)
	}
	return nil
}

type AccessMenusOptions struct {
	// 当前登录组织orgId
	OrgId int64 `cname:"当前登录组织Id" json:"orgId"`
	// 菜单类别 web app
	MenuCategory string `cname:"菜单类别 web app" json:"menuCategory,omitempty"`
	// 返回所有不可以用的菜单
	ALLDisableMenu int `cname:"同时返回所有不可以用的菜单 1:包含不可用的菜单 0:过滤不可用的菜单 " json:"aLLDisableMenu"`
	// 所属公司
	CompanyId int64
}

func (role *Role) IsRemoved() bool {
	if !role.DeletedAt.IsZero() {
		return false
	}
	role.DeletedAt = time.Now()
	return true
}

/*****   1.自定义函数模块  *****/
/*1.1 拷贝简单的角色信息*/

// CloneSample  拷贝简单的角色信息
func (role *Role) CloneSample() *Role {
	return &Role{
		RoleId:   role.RoleId,
		RoleName: role.RoleName,
		Ext:      role.Ext,
		RoleType: role.RoleType,
	}
}

// IsDeleted 判断角色是否已删除
func (role *Role) IsDeleted() bool {
	if role.DeletedAt.IsZero() {
		return false
	}
	return true
}

/*****   2.缓存模块  *****/

func (m *Role) CacheKeyFunc() string {
	if constant.DISABLE_REPOSITORY_CACHE {
		return ""
	}
	if m.RoleId == 0 {
		return ""
	}
	return fmt.Sprintf("%v:cache:role:id:%v", constant.CACHE_PREFIX, m.RoleId)
}

/*****   3.实现接口 AuthedData  *****/
func (m *Role) BelongOrg() int64 {
	return m.OrgId
}