package service

import (
	"errors"
	"fmt"

	sysUserModel "nms_nbi/features/sys_user/model"
	sysuserrole "nms_nbi/features/sys_user_role"
)

// 实例化服务层 ServiceSysUser 结构体
var NewServiceSysUser = &ServiceSysUser{
	sysUserRepository:     NewRepoSysUser,
	sysUserRoleRepository: sysuserrole.NewRepoSysUserRole,
}

// ServiceSysUser 用户 服务层处理
type ServiceSysUser struct {
	// 用户服务
	sysUserRepository *RepoSysUser
	// 用户与角色服务
	sysUserRoleRepository *sysuserrole.RepoSysUserRole
}

// SelectUserPage 根据条件分页查询用户列表
func (r *ServiceSysUser) SelectUserPage(query map[string]any) map[string]any {
	return r.sysUserRepository.SelectUserPage(query)
}

// SelectUserList 根据条件查询用户列表
func (r *ServiceSysUser) SelectUserList(sysUser sysUserModel.SysUser) []sysUserModel.SysUser {
	return []sysUserModel.SysUser{}
}

// SelectAllocatedPage 根据条件分页查询分配用户角色列表
func (r *ServiceSysUser) SelectAllocatedPage(query map[string]any) map[string]any {
	return r.sysUserRepository.SelectAllocatedPage(query)
}

// SelectUserByUserName 通过用户名查询用户
func (r *ServiceSysUser) SelectUserByUserName(userName string) sysUserModel.SysUser {
	return r.sysUserRepository.SelectUserByUserName(userName)
}

// SelectUserById 通过用户ID查询用户
func (r *ServiceSysUser) SelectUserById(userId string) sysUserModel.SysUser {
	if userId == "" {
		return sysUserModel.SysUser{}
	}
	users := r.sysUserRepository.SelectUserByIds([]string{userId})
	if len(users) > 0 {
		return users[0]
	}
	return sysUserModel.SysUser{}
}

// InsertUser 新增用户信息
func (r *ServiceSysUser) InsertUser(sysUser sysUserModel.SysUser) string {
	// 新增用户信息
	insertId := r.sysUserRepository.InsertUser(sysUser)
	if insertId != "" {
		// 新增用户角色信息
		r.insertUserRole(insertId, sysUser.RoleIDs)
	}
	return insertId
}

// insertUserRole 新增用户角色信息
func (r *ServiceSysUser) insertUserRole(userId string, roleIds []string) int64 {
	if userId == "" || len(roleIds) <= 0 {
		return 0
	}

	sysUserRoles := []sysuserrole.SysUserRole{}
	for _, roleId := range roleIds {
		// 管理员角色禁止操作，只能通过配置指定用户ID分配
		if roleId == "" || roleId == "1" {
			continue
		}
		sysUserRoles = append(sysUserRoles, sysuserrole.NewSysUserRole(userId, roleId))
	}

	return r.sysUserRoleRepository.BatchUserRole(sysUserRoles)
}

// UpdateUser 修改用户信息
func (r *ServiceSysUser) UpdateUser(sysUser sysUserModel.SysUser) int64 {
	return r.sysUserRepository.UpdateUser(sysUser)
}

// UpdateUserAndRolePost 修改用户信息同时更新角色和岗位
func (r *ServiceSysUser) UpdateUserAndRolePost(sysUser sysUserModel.SysUser) int64 {
	userId := fmt.Sprint(sysUser.Id)
	// 删除用户与角色关联
	r.sysUserRoleRepository.DeleteUserRole([]string{userId})
	// 新增用户角色信息
	r.insertUserRole(userId, sysUser.RoleIDs)
	return r.sysUserRepository.UpdateUser(sysUser)
}

// DeleteUserByIds 批量删除用户信息
func (r *ServiceSysUser) DeleteUserByIds(userIds []string) (int64, error) {
	// 检查是否存在
	users := r.sysUserRepository.SelectUserByIds(userIds)
	if len(users) <= 0 {
		return 0, errors.New("no permission to access user data")
	}
	if len(users) == len(userIds) {
		// 删除用户与角色关联
		r.sysUserRoleRepository.DeleteUserRole(userIds)
		// ... 注意其他userId进行关联的表
		// 删除用户
		rows := r.sysUserRepository.DeleteUserByIds(userIds)
		return rows, nil
	}
	return 0, errors.New("failed to delete user information")
}

// CheckUniqueUserName 校验用户名称是否唯一
func (r *ServiceSysUser) CheckUniqueUserName(accountId, userId string) bool {
	uniqueId := r.sysUserRepository.CheckUniqueUser(sysUserModel.SysUser{
		AccountId: accountId,
	})
	if uniqueId == userId {
		return true
	}
	return uniqueId == ""
}

// CheckUniquePhone 校验手机号码是否唯一
func (r *ServiceSysUser) CheckUniquePhone(phonenumber, userId string) bool {
	uniqueId := r.sysUserRepository.CheckUniqueUser(sysUserModel.SysUser{
		Phone: phonenumber,
	})
	if uniqueId == userId {
		return true
	}
	return uniqueId == ""
}

// CheckUniqueEmail 校验email是否唯一
func (r *ServiceSysUser) CheckUniqueEmail(email, userId string) bool {
	uniqueId := r.sysUserRepository.CheckUniqueUser(sysUserModel.SysUser{
		Email: email,
	})
	if uniqueId == userId {
		return true
	}
	return uniqueId == ""
}
