import { RoleVO } from '@/api/system/role/types';
import { PostVO } from '@/api/system/post/types';
import { MenuTreeOption } from '@/api/system/menu/types';

/**
 * 用户状态枚举 - 与字典数据保持一致
 */
export enum UserStatus {
  /** 激活 */
  ACTIVE = '0',
  /** 锁定 */
  LOCKED = '1',
  /** 待激活 */
  PENDING = '2',
  /** 休眠 */
  DORMANT = '3',
  /** 注销 */
  CANCELLED = '4'
}

/**
 * 用户角色类型枚举 - 与字典数据保持一致，去掉业务管理员
 */
export enum UserRoleType {
  /** 系统管理员 */
  SYSTEM_ADMIN = '1',
  /** 审计管理员 */
  AUDIT_ADMIN = '3',
  /** 审批管理员 */
  APPROVAL_ADMIN = '4',
  /** 业务配置员 */
  BUSINESS_CONFIGURATOR = '5',
  /** 业务操作员 */
  BUSINESS_OPERATOR = '6'
}

/**
 * 系统内置类型枚举
 */
export enum SysType {
  /** 是 */
  YES = 'Y',
  /** 否 */
  NO = 'N'
}

/**
 * 用户状态标签映射
 */
export const USER_STATUS_LABELS = {
  [UserStatus.ACTIVE]: '激活',
  [UserStatus.LOCKED]: '锁定',
  [UserStatus.PENDING]: '待激活',
  [UserStatus.DORMANT]: '休眠',
  [UserStatus.CANCELLED]: '注销'
} as const;

/**
 * 用户角色类型标签映射
 */
export const USER_ROLE_TYPE_LABELS = {
  [UserRoleType.SYSTEM_ADMIN]: '系统管理员',
  [UserRoleType.AUDIT_ADMIN]: '审计管理员',
  [UserRoleType.APPROVAL_ADMIN]: '审批管理员',
  [UserRoleType.BUSINESS_CONFIGURATOR]: '业务配置员',
  [UserRoleType.BUSINESS_OPERATOR]: '业务操作员'
} as const;

/**
 * 系统内置类型标签映射
 */
export const SYS_TYPE_LABELS = {
  [SysType.YES]: '是',
  [SysType.NO]: '否'
} as const;

/**
 * 用户信息
 */
export interface UserInfo {
  user: UserVO;
  roles: string[];
  permissions: string[];
  pwdFlag?: boolean; // 密码是否需要修改
  realAuth?: boolean; // 账号是否已实名
  forcePwdFlag?: boolean; // 强制修改密码标志
}

/**
 * 用户查询对象类型
 */
export interface UserQuery extends PageQuery {
  userName?: string;
  phonenumber?: string;
  status?: string;
  roleType?: string; // 角色类型查询
  deptId?: string | number;
  roleId?: string | number;
  userIds?: string;
}

/**
 * 用户返回对象
 */
export interface UserVO extends BaseEntity {
  userId: string | number;
  tenantId: string;
  deptId: number;
  userName: string;
  nickName: string;
  userType: string;
  email: string;
  phonenumber: string;
  sex: string;
  avatar: string;
  status: string;
  delFlag: string;
  loginIp: string;
  loginDate: string;
  remark: string;
  deptName: string;
  roleType?: string; // 用户角色类型
  roles: RoleVO[];
  roleIds: any;
  postIds: any;
  roleId: any;
  admin: boolean;
  branchType?: string; // 渠道类型
  idNo?: string; // 证件号码
  bindIp?: string; // 账号绑定IP
  accessStartTime?: string; // 允许访问时间开始
  accessEndTime?: string; // 允许访问时间结束
  accType?: number; // 账户类型
  validStartDate?: string; // 账户有效起期
  validEndDate?: string; // 账户有效止期
  realName?: string; // 真实姓名
  sysType?: string; // 系统内置
  manageCom?: string; // 管理机构
  lastPwdUpdateTime?: string; // 最后一次密码修改时间
  authTime?: string; // 实名认证时间
  faceAuthRequired?: string; // 是否需要人脸识别（0-不需要 1-需要）
}

/**
 * 用户表单类型
 */
export interface UserForm {
  id?: string;
  userId?: string;
  deptId?: number;
  manageCom?: string;
  userName: string;
  nickName?: string;
  password: string;
  phonenumber?: string;
  email?: string;
  sex?: string;
  status: string;
  remark?: string;
  postIds: string[];
  roleIds: string[];
  roleType?: string; // 用户角色类型
  branchType?: string; // 渠道类型
  idNo?: string; // 证件号码
  bindIp?: string; // 账号绑定IP
  accessTime?: string[]; // 允许访问时间[开始, 结束]
  accType?: number; // 账户类型
  validDate?: string[]; // 账户有效期[起期, 止期]
  realName?: string; // 真实姓名
  sysType?: string; // 系统内置 Y/N
  authTime?: string;
  faceAuthRequired?: string; // 是否需要人脸识别（0-不需要 1-需要）
}

export interface UserInfoVO {
  user: UserVO;
  roles: RoleVO[];
  roleIds: string[];
  posts: PostVO[];
  postIds: string[];
  roleGroup: string;
  postGroup: string;
  pwdFlag?: boolean; // 密码是否需要修改
  realAuth?: boolean; // 账号是否已实名
}

/**
 * 二次验证结果接口
 */
export interface VerifyResult {
  operationType: string;
  verifyType: number;
  success: boolean;
}

/**
 * 密码验证请求参数
 */
export interface PasswordVerify {
  password: string;
}

/**
 * 验证码验证请求参数
 */
export interface CodeVerify {
  authCodeType: number;
  authCode: string;
}

/**
 * 工具函数：检查是否为内置用户
 */
export const isBuiltInUser = (user: UserVO | UserForm): boolean => {
  return user.sysType === SysType.YES;
};

/**
 * 工具函数：检查是否为注销用户
 */
export const isCancelledUser = (user: UserVO | UserForm): boolean => {
  return user.status === UserStatus.CANCELLED;
};

/**
 * 工具函数：检查用户是否只读（注销用户）
 */
export const isUserReadOnly = (user: UserVO | UserForm): boolean => {
  return isCancelledUser(user);
};

/**
 * 工具函数：获取用户状态标签
 */
export const getUserStatusLabel = (status: string): string => {
  return USER_STATUS_LABELS[status as keyof typeof USER_STATUS_LABELS] || '未知';
};

/**
 * 工具函数：获取用户角色类型标签
 */
export const getUserRoleTypeLabel = (roleType: string): string => {
  return USER_ROLE_TYPE_LABELS[roleType as keyof typeof USER_ROLE_TYPE_LABELS] || '未知';
};

/**
 * 工具函数：检查角色是否可以设置渠道
 */
export const canRoleHaveBranch = (roleType: string): boolean => {
  return [UserRoleType.SYSTEM_ADMIN, UserRoleType.BUSINESS_CONFIGURATOR, UserRoleType.BUSINESS_OPERATOR].includes(roleType as UserRoleType);
};

/**
 * 工具函数：检查角色是否可以管理其他用户
 */
export const canRoleManageUsers = (roleType: string): boolean => {
  return [UserRoleType.SYSTEM_ADMIN, UserRoleType.APPROVAL_ADMIN].includes(roleType as UserRoleType);
};

/**
 * 工具函数：检查是否为系统管理员
 */
export const isSystemAdmin = (roleType: string): boolean => {
  return roleType === UserRoleType.SYSTEM_ADMIN;
};

/**
 * 工具函数：获取内置用户可编辑字段列表
 */
export const getBuiltInUserEditableFields = (): string[] => {
  return [
    'nickName', // 用户昵称
    'phonenumber', // 手机号码
    'sex', // 性别
    'email', // 邮箱
    'remark', // 备注
    'bindIp', // 绑定IP
    'faceAuthRequired' // 人脸识别
  ];
};
