package domain

import (
	"fmt"
	"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/constant"
	"time"
)

const (
	StatusEnable  int64 = 1 //启用
	StatusDisable int64 = 2 //禁用
)

//  管理员类型 1.超级管理员  10:企业管理员 100:普通用户
const (
	SuperAdministrator      = 1   //超级管理员
	EnterpriseAdministrator = 10  //企业管理员
	NormalUser              = 100 //普通用户
)

// UserType
const (
	Manager = 1 //高管
	Partner = 2 //合伙人
	Guest   = 3 //游客
)

// 用户实体
type User struct {
	// 用户id
	UserId int64 `json:"userId"`
	// 1.高管 2.合伙人 4:游客
	UserType int `json:"userType"`
	//用户账号(手机号)
	UserAccount string `json:"userAccount"`
	// 用户权限
	Permissions []int `json:"permissions"`
	// 公司Id
	CompanyId int64 `json:"companyId"`
	// 用户信息
	UserInfo *UserInfo `json:"userInfo"`
	// 合伙人信息
	PartnerInfo *PartnerInfo `json:"partnerInfo"`
	// 状态 1正常 2禁用
	Status int64 `json:"status"`
	// 管理员类型 1.超级管理员  10:企业管理员 100:普通用户
	AdminType int `json:"adminType"`
	// 合伙人列表 用户类型为高管时有效
	AccessPartners []int64 `json:"accessPartners"`
	// 创建时间
	CreateAt time.Time `json:"createAt"`
	// 更新时间
	UpdateAt time.Time `json:"updateAt"`
	// 删除时间
	DeleteAt time.Time `json:"deleteAt"`
}

type UserRepository interface {
	Save(user *User) (*User, error)
	Remove(user *User) (*User, error)
	FindOne(queryOptions map[string]interface{}) (*User, error)
	Find(queryOptions map[string]interface{}) (int64, []*User, error)
}

func (user *User) Identify() interface{} {
	if user.UserId == 0 {
		return nil
	}
	return user.UserId
}

func (user *User) SetPermission(permissions []int) error {
	user.Permissions = permissions
	return nil
}

func (user *User) CovertUserStatus(status int64) error {
	if !(status == StatusEnable || status == StatusDisable) {
		return fmt.Errorf("status options value (%v,%v) , invalid %v", StatusEnable, StatusDisable, status)
	}
	user.Status = status
	return nil
}

func (user *User) Update(data map[string]interface{}) error {
	if userType, ok := data["userType"]; ok {
		user.UserType = userType.(int)
	}
	if permissions, ok := data["permissions"]; ok {
		user.Permissions = permissions.([]int)
	}
	if userInfo, ok := data["userInfo"]; ok {
		user.UserInfo = userInfo.(*UserInfo)
	}
	if partnerAccount, ok := data["partnerAccount"]; ok {
		user.PartnerInfo.PartnerAccount = partnerAccount.(string)
	}
	if partnerName, ok := data["partnerName"]; ok {
		user.PartnerInfo.PartnerName = partnerName.(string)
	}
	if regionName, ok := data["regionName"]; ok {
		user.PartnerInfo.RegionInfo.RegionName = regionName.(string)
	}
	if status, ok := data["status"]; ok {
		user.PartnerInfo.Status = status.(int64)
	}
	user.UpdateAt = time.Now()
	return nil
}

//添加/编辑高管

func CheckAdminUserType(dm *User) (*User, error) {
	if dm.UserInfo.Uid == int64(0) {
		return nil, fmt.Errorf("高管的uid不能为空")
	}
	if dm.UserInfo.Email == "" {
		return nil, fmt.Errorf("高管的Email不能为空")
	}
	if dm.UserInfo.EntryTime.IsZero() {
		return nil, fmt.Errorf("高管的入职时间不能为空")
	}
	if dm.UserInfo.Workplace == "" {
		return nil, fmt.Errorf("高管的工作地不能为空")
	}
	if dm.UserInfo.JobNumber == "" {
		return nil, fmt.Errorf("高管的工号不能为空")
	}
	return dm, nil
}

//添加/编辑合伙人
type PartnerUserType struct{}

func CheckPartnerUserType(dm *User) (*User, error) {
	if dm.PartnerInfo.Status == 0 {
		return nil, fmt.Errorf("合伙人的状态不能为空")
	}
	if dm.PartnerInfo.PartnerAccount == "" {
		return nil, fmt.Errorf("合伙人账号不能为空")
	}
	if dm.PartnerInfo.PartnerName == "" {
		return nil, fmt.Errorf("合伙人姓名不能为空")
	}
	if len(dm.PartnerInfo.PartnerCategories) == 0 {
		return nil, fmt.Errorf("合伙人类别不能为空")
	}
	if len(dm.PartnerInfo.Salesmen) == 0 {
		return nil, fmt.Errorf("合伙人查看合伙人账号不能为空")
	}
	return dm, nil
}

func (m *User) CacheKeyFunc() string {
	if m.UserId == 0 {
		return ""
	}
	return fmt.Sprintf("%v:cache:Users:id:%v", constant.POSTGRESQL_DB_NAME, m.UserId)
}