import request from '@/utils/request';
import { AxiosPromise } from 'axios';

/**
 * 角色授权申请相关接口
 */

// ==================== 类型定义 ====================

/**
 * 角色授权申请状态枚举
 */
export enum RoleAuthRequestStatus {
  /** 待审核 */
  PENDING = '0',
  /** 已通过 */
  APPROVED = '1',
  /** 已拒绝 */
  REJECTED = '2',
  /** 已撤销 */
  CANCELLED = '3'
}

/**
 * 申请类型枚举
 */
export enum ApplyType {
  /** 申请授权 */
  APPLY_AUTH = '1',
  /** 申请取消授权 */
  APPLY_CANCEL_AUTH = '2'
}

/**
 * 角色授权申请查询参数
 */
export interface RoleAuthRequestQuery extends PageQuery {
  /** 被申请授权的用户ID */
  userId?: number;
  /** 申请的角色ID */
  roleId?: number;
  /** 申请类型 */
  applyType?: string;
  /** 申请人ID */
  applyUserId?: number;
  /** 申请原因（模糊搜索） */
  applyReason?: string;
  /** 申请状态 */
  status?: string;
  /** 审核人ID */
  approveUserId?: number;
  /** 用户名称（查询条件） */
  userName?: string;
  /** 角色名称（查询条件） */
  roleName?: string;
  /** 申请人名称（查询条件） */
  applyUserName?: string;
  /** 申请时间范围 */
  beginApplyTime?: string;
  endApplyTime?: string;
  /** 审核时间范围 */
  beginApproveTime?: string;
  endApproveTime?: string;
  deptId?: string;
}

/**
 * 角色授权申请视图对象
 */
export interface RoleAuthRequestVO extends BaseEntity {
  /** 申请ID */
  id: number;
  /** 被申请授权的用户ID */
  userId: number;
  /** 被申请授权的用户名 */
  userName: string;
  /** 被申请授权的用户昵称 */
  nickName: string;
  /** 被申请授权的用户真实姓名 */
  realName: string;
  /** 被申请授权的用户部门名称 */
  deptName: string;
  /** 申请的角色ID */
  roleId: number;
  /** 申请的角色名称 */
  roleName: string;
  /** 申请的角色权限字符 */
  roleKey: string;
  /** 角色类型 */
  roleCategory: string;
  /** 申请类型（1-申请授权 2-申请取消授权） */
  applyType: string;
  /** 申请类型名称 */
  applyTypeName: string;
  /** 申请人ID */
  applyUserId: number;
  /** 申请人用户名 */
  applyUserName: string;
  /** 申请人昵称 */
  applyUserNickName: string;
  /** 申请原因 */
  applyReason: string;
  /** 申请时间 */
  applyTime: Date;
  /** 申请状态 */
  status: string;
  /** 申请状态名称 */
  statusName: string;
  /** 审核人ID */
  approveUserId?: number;
  /** 审核人用户名 */
  approveUserName?: string;
  /** 审核人昵称 */
  approveUserNickName?: string;
  /** 审核时间 */
  approveTime?: Date;
  /** 审核意见 */
  approveRemark?: string;
  /** 是否为本人申请 */
  isSelfApply?: boolean;
  /** 用户是否已拥有该角色 */
  hasRole?: boolean;
}

/**
 * 批量角色授权申请表单
 */
export interface RoleAuthBatchRequestForm {
  /** 用户ID列表 */
  userIds: number[];
  /** 申请的角色ID */
  roleId: number | string;
  /** 申请原因 */
  applyReason: string;
}

/**
 * 批量角色授权申请审批表单
 */
export interface RoleAuthBatchApprovalForm {
  /** 申请ID列表 */
  ids: number[];
  /** 是否通过 */
  approve: boolean;
  /** 审批意见 */
  approveRemark?: string;
}

// ==================== API接口 ====================

/**
 * 分页查询角色授权申请列表
 * @param query 查询参数
 */
export const listRoleAuthRequests = (query: RoleAuthRequestQuery): AxiosPromise<RoleAuthRequestVO[]> => {
  return request({
    url: '/system/user/approval/roleauth/list',
    method: 'get',
    params: query
  });
};

/**
 * 批量申请角色授权
 * @param data 批量申请数据
 */
export const batchApplyRoleAuth = (data: RoleAuthBatchRequestForm) => {
  return request({
    url: '/system/user/approval/roleauth/batchApply',
    method: 'post',
    data: data
  });
};

/**
 * 批量申请取消角色授权
 * @param data 批量申请数据
 */
export const batchApplyRoleCancelAuth = (data: RoleAuthBatchRequestForm) => {
  return request({
    url: '/system/user/approval/roleauth/batchApplyCancelAuth',
    method: 'post',
    data: data
  });
};

/**
 * 批量审批角色授权申请
 * @param data 批量审批数据
 */
export const batchApproveRoleAuthRequest = (data: RoleAuthBatchApprovalForm) => {
  return request({
    url: '/system/user/approval/roleauth/batchApprove',
    method: 'post',
    data: data
  });
};

/**
 * 批量撤销角色授权申请
 * @param ids 申请ID数组
 */
export const batchCancelRoleAuthRequest = (ids: number[]) => {
  return request({
    url: '/system/user/approval/roleauth/batchCancel',
    method: 'post',
    data: ids
  });
};

/**
 * 批量删除角色授权申请记录（仅限已处理的申请）
 * @param ids 申请ID数组
 */
export const batchDeleteRoleAuthRequest = (ids: number | number[]) => {
  const idArray = Array.isArray(ids) ? ids : [ids];
  return request({
    url: `/system/user/approval/roleauth/${idArray.join(',')}`,
    method: 'delete'
  });
};

export default {
  listRoleAuthRequests,
  batchApplyRoleAuth,
  batchApplyRoleCancelAuth,
  batchApproveRoleAuthRequest,
  batchCancelRoleAuthRequest,
  batchDeleteRoleAuthRequest
};
