package domain

import "time"

// 用户类型
const (
	UserTypeEmployee     = 1
	UserTypeCooperation  = 2
	UserTypeCompanyAdmin = 1024
)

// 用户状态
const (
	UserStatusEnable  UserStatus = 1
	UserStatusDisable UserStatus = 2
	UserStatusDestroy UserStatus = 3
)

// 用户
type User struct {
	// 用户Id 用户唯一标识
	UserId int64 `json:"userId,omitempty"`
	// 企业id
	CompanyId int64 `json:"companyId,omitempty"`
	// 用户基础数据id
	UserBaseId int64 `json:"userBaseId,omitempty"`
	// 用户类型  1:企业内部用户(内部添加) 2:共创用户   1024:企业注册用户(注册添加)
	UserType int `json:"userType,omitempty"`
	// 用户编号 企业内标识
	UserCode string `json:"userCode,omitempty"`
	// 组织机构
	OrganizationId int64 `json:"organizationId,omitempty"`
	// 组织机构
	Organization *Org `json:"org,omitempty"`
	// 所属部门
	DepartmentId int64 `json:"departmentId,omitempty"`
	// 部门
	Department *Department `json:"department,omitempty"`
	// 用户信息 (冗余,数据存在userBase里面)
	UserInfo *UserInfo `json:"userInfo,omitempty"`
	// 用户关联的组织
	UserOrg []*Org `json:"userOrg,omitempty"`
	// 用户关联的角色
	UserRole []*Role `json:"userRole,omitempty"`
	// 收藏的菜单(工作台)(菜单编码列表)
	FavoriteMenus []string `json:"favoriteMenus,omitempty"`
	// 共创信息 (共创用户有效)
	CooperationInfo *CooperationInfo `json:"cooperationInfo,omitempty"`
	// 状态(1:启用  2:禁用  3:注销)
	EnableStatus int `json:"enableStatus,omitempty"`
	// 扩展数据
	Ext *Ext `json:"ext,omitempty"`
	// 创建时间
	CreatedAt time.Time `json:"createdAt,omitempty"`
	// 更新时间
	UpdatedAt time.Time `json:"updatedAt,omitempty"`
}

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) Update(data map[string]interface{}) error {
	if userId, ok := data["userId"]; ok {
		user.UserId = userId.(int64)
	}
	if companyId, ok := data["companyId"]; ok {
		user.CompanyId = companyId.(int64)
	}
	if userBaseId, ok := data["userBaseId"]; ok {
		user.UserBaseId = userBaseId.(int64)
	}
	if userType, ok := data["userType"]; ok {
		user.UserType = userType.(int)
	}
	if userCode, ok := data["userCode"]; ok {
		user.UserCode = userCode.(string)
	}
	if organizationId, ok := data["organizationId"]; ok {
		user.OrganizationId = organizationId.(int64)
	}
	if departmentId, ok := data["departmentId"]; ok {
		user.DepartmentId = departmentId.(int64)
	}
	if userName, ok := data["userName"]; ok {
		user.UserInfo.UserName = userName.(string)
	}
	if phone, ok := data["phone"]; ok {
		user.UserInfo.Phone = phone.(string)
	}
	if avatar, ok := data["avatar"]; ok {
		user.UserInfo.Avatar = avatar.(string)
	}
	if email, ok := data["email"]; ok {
		user.UserInfo.Email = email.(string)
	}
	if userOrg, ok := data["userOrg"]; ok {
		user.UserOrg = userOrg.([]*Org)
	}
	if userRole, ok := data["userRole"]; ok {
		user.UserRole = userRole.([]*Role)
	}
	if favoriteMenus, ok := data["favoriteMenus"]; ok {
		user.FavoriteMenus = favoriteMenus.([]string)
	}
	if cooperationCompany, ok := data["cooperationCompany"]; ok {
		user.CooperationInfo.CooperationCompany = cooperationCompany.(string)
	}
	if cooperationDeadline, ok := data["cooperationDeadline"]; ok {
		user.CooperationInfo.CooperationDeadline = cooperationDeadline.(time.Time)
	}
	if enableStatus, ok := data["enableStatus"]; ok {
		user.EnableStatus = enableStatus.(int)
	}
	if userName, ok := data["userName"]; ok {
		user.Ext.UserName = userName.(string)
	}
	if orgName, ok := data["orgName"]; ok {
		user.Ext.OrgName = orgName.(string)
	}
	if phone, ok := data["phone"]; ok {
		user.Ext.Phone = phone.(string)
	}
	if depName, ok := data["depName"]; ok {
		user.Ext.DepName = depName.(string)
	}
	if parentDepName, ok := data["parentDepName"]; ok {
		user.Ext.ParentDepName = parentDepName.(string)
	}
	if createdAt, ok := data["createdAt"]; ok {
		user.CreatedAt = createdAt.(time.Time)
	}
	if updatedAt, ok := data["updatedAt"]; ok {
		user.UpdatedAt = updatedAt.(time.Time)
	}
	return nil
}

type UserStatus int