/**
 * 绩效管理模块错误码
 * 基于 docs/modules/performance/08-error-codes.md 定义
 */

export const PERFORMANCE_ERROR_CODES = {
  // ==================== 通用错误 (COMMON) ====================
  COMMON_UNAUTHORIZED: {
    code: 'PERF_COMMON_001',
    message: '未认证或 Token 失效',
    httpStatus: 401,
  },
  COMMON_FORBIDDEN: {
    code: 'PERF_COMMON_002',
    message: '无权限访问资源',
    httpStatus: 403,
  },
  COMMON_VALIDATION_FAILED: {
    code: 'PERF_COMMON_003',
    message: '参数校验失败',
    httpStatus: 400,
  },
  COMMON_NOT_FOUND: {
    code: 'PERF_COMMON_004',
    message: '资源不存在',
    httpStatus: 404,
  },
  COMMON_INTERNAL_ERROR: {
    code: 'PERF_COMMON_005',
    message: '服务器内部错误',
    httpStatus: 500,
  },
  COMMON_DUPLICATE_OPERATION: {
    code: 'PERF_COMMON_006',
    message: '重复操作（幂等性冲突）',
    httpStatus: 409,
  },
  COMMON_CROSS_ORG_FORBIDDEN: {
    code: 'PERF_COMMON_007',
    message: '跨组织访问被拒绝',
    httpStatus: 403,
  },

  // ==================== 周期错误 (CYCLE) ====================
  CYCLE_NOT_FOUND: {
    code: 'PERF_CYCLE_001',
    message: '绩效周期不存在',
    httpStatus: 404,
  },
  CYCLE_DATE_INVALID: {
    code: 'PERF_CYCLE_002',
    message: '周期日期配置无效',
    httpStatus: 400,
  },
  CYCLE_DATE_CONFLICT: {
    code: 'PERF_CYCLE_003',
    message: '周期日期与现有周期冲突',
    httpStatus: 400,
  },
  CYCLE_STATUS_INVALID: {
    code: 'PERF_CYCLE_004',
    message: '周期状态不允许该操作',
    httpStatus: 409,
  },
  CYCLE_CANNOT_DELETE: {
    code: 'PERF_CYCLE_005',
    message: '无法删除非草稿周期',
    httpStatus: 409,
  },
  CYCLE_ARCHIVED_READONLY: {
    code: 'PERF_CYCLE_006',
    message: '周期已归档不可修改',
    httpStatus: 400,
  },
  CYCLE_INCOMPLETE_EVALUATIONS: {
    code: 'PERF_CYCLE_007',
    message: '存在未完成评估无法完成周期',
    httpStatus: 400,
  },
  CYCLE_PERMISSION_REQUIRED: {
    code: 'PERF_CYCLE_008',
    message: '无权限管理周期',
    httpStatus: 403,
  },
  CYCLE_GRADE_CONFIG_REQUIRED: {
    code: 'PERF_CYCLE_009',
    message: '发布周期需要等级配置',
    httpStatus: 400,
  },

  // ==================== KPI 错误 ====================
  KPI_NOT_FOUND: {
    code: 'PERF_KPI_001',
    message: 'KPI 不存在',
    httpStatus: 404,
  },
  KPI_ASSIGNMENT_NOT_FOUND: {
    code: 'PERF_KPI_002',
    message: 'KPI 分配不存在',
    httpStatus: 404,
  },
  KPI_ASSESSMENT_NOT_FOUND: {
    code: 'PERF_KPI_003',
    message: 'KPI 考核记录不存在',
    httpStatus: 404,
  },
  KPI_WEIGHT_SUM_INVALID: {
    code: 'PERF_KPI_004',
    message: 'KPI 权重总和必须为 100%',
    httpStatus: 400,
  },
  // PERF_KPI_005 已废弃（指标库重复分配，功能已移出）
  KPI_STATUS_INVALID: {
    code: 'PERF_KPI_006',
    message: '考核状态不允许该操作',
    httpStatus: 400,
  },
  KPI_SELF_EVAL_LOCKED: {
    code: 'PERF_KPI_007',
    message: '自评已提交不可修改',
    httpStatus: 400,
  },
  KPI_SELF_EVAL_REQUIRED: {
    code: 'PERF_KPI_008',
    message: '需先完成自评',
    httpStatus: 409,
  },
  KPI_SCORE_INVALID: {
    code: 'PERF_KPI_009',
    message: '评分超出有效范围',
    httpStatus: 400,
  },
  KPI_ONLY_MANAGER: {
    code: 'PERF_KPI_010',
    message: '只能评估直属下属',
    httpStatus: 403,
  },
  // PERF_KPI_011 已废弃（指标库权限，功能已移出）
  // PERF_KPI_012 已废弃（年度/季度目标关联功能已移出当前版本）
  // PERF_KPI_013 已废弃（年度目标缺失，功能已移出当前版本）
  KPI_NAME_DUPLICATE: {
    code: 'PERF_KPI_014',
    message: 'KPI 名称重复（同一员工同一周期）',
    httpStatus: 400,
  },
  KPI_ALREADY_SUBMITTED: {
    code: 'PERF_KPI_015',
    message: 'KPI 已提交，不可编辑',
    httpStatus: 409,
  },
  KPI_DEPENDENCY_USER_INVALID: {
    code: 'PERF_KPI_016',
    message: '跨部门依赖人不存在或不在目标组织',
    httpStatus: 400,
  },
  KPI_DEPENDENCY_ALREADY_CONFIRMED: {
    code: 'PERF_KPI_017',
    message: '依赖已确认，不可重复操作',
    httpStatus: 409,
  },
  KPI_DEPENDENCY_UNCONFIRMED: {
    code: 'PERF_KPI_018',
    message: '存在未确认依赖，无法提交全部 KPI',
    httpStatus: 409,
  },
  KPI_DEPENDENCY_NOT_FOUND: {
    code: 'PERF_KPI_019',
    message: 'KPI 依赖记录不存在',
    httpStatus: 404,
  },

  // ==================== 360 评估错误 ====================
  E360_NOT_FOUND: {
    code: 'PERF_E360_001',
    message: '360 评估不存在',
    httpStatus: 404,
  },
  E360_TASK_NOT_FOUND: {
    code: 'PERF_E360_002',
    message: '评估任务不存在',
    httpStatus: 404,
  },
  E360_STATUS_INVALID: {
    code: 'PERF_E360_003',
    message: '评估状态不允许该操作',
    httpStatus: 400,
  },
  E360_MIN_EVALUATORS_NOT_MET: {
    code: 'PERF_E360_004',
    message: '评估人数不足',
    httpStatus: 400,
  },
  E360_TEMPLATE_REQUIRED: {
    code: 'PERF_E360_005',
    message: '评估问卷未配置',
    httpStatus: 400,
  },
  E360_DEADLINE_PASSED: {
    code: 'PERF_E360_006',
    message: '评估已过截止日期',
    httpStatus: 400,
  },
  E360_ALREADY_SUBMITTED: {
    code: 'PERF_E360_007',
    message: '评估任务已提交',
    httpStatus: 400,
  },
  E360_REQUIRED_DIMENSION_MISSING: {
    code: 'PERF_E360_008',
    message: '必填评估维度未完成',
    httpStatus: 400,
  },
  E360_SCORE_INVALID: {
    code: 'PERF_E360_009',
    message: '评分超出有效范围',
    httpStatus: 400,
  },
  E360_RESULT_MINIMUM_NOT_MET: {
    code: 'PERF_E360_010',
    message: '结果未达到最低提交数',
    httpStatus: 400,
  },
  E360_FORBIDDEN_VIEW: {
    code: 'PERF_E360_011',
    message: '无权查看该评估',
    httpStatus: 403,
  },
  E360_FORBIDDEN_CREATE: {
    code: 'PERF_E360_012',
    message: '无权发起 360 评估',
    httpStatus: 403,
  },
  E360_RELATION_DUPLICATE: {
    code: 'PERF_E360_013',
    message: '评估关系已存在',
    httpStatus: 400,
  },
  E360_NO_TEMPLATE: {
    code: 'PERF_E360_014',
    message: '未配置 360 模板，无法发起评估',
    httpStatus: 400,
  },
  E360_EVALUATOR_ALREADY_SUBMITTED: {
    code: 'PERF_E360_015',
    message: '同一评估者已提交，不可重复提交',
    httpStatus: 409,
  },
  E360_DIMENSION_MISMATCH: {
    code: 'PERF_E360_016',
    message: '评估维度不匹配模板定义',
    httpStatus: 400,
  },

  // ==================== 校准错误 ====================
  // PERF_CAL_001 已废弃（校准会议不存在，校准会议功能已废弃）
  // PERF_CAL_002 已废弃（校准会议状态不允许，校准会议功能已废弃）
  CAL_ADJUSTMENT_REASON_REQUIRED: {
    code: 'PERF_CAL_003',
    message: '等级调整原因不能为空',
    httpStatus: 400,
  },
  CAL_DISTRIBUTION_INVALID: {
    code: 'PERF_CAL_004',
    message: '等级分布校验不通过',
    httpStatus: 400,
  },
  CAL_FORBIDDEN: {
    code: 'PERF_CAL_005',
    message: '无权校准',
    httpStatus: 403,
  },

  // ==================== 面谈错误（已废弃，功能已移出当前版本） ====================
  // PERF_INTERVIEW_001~004 已废弃

  // ==================== 结果错误 ====================
  RESULT_NOT_FOUND: {
    code: 'PERF_RESULT_001',
    message: '绩效结果不存在',
    httpStatus: 404,
  },
  RESULT_NOT_PUBLISHED: {
    code: 'PERF_RESULT_002',
    message: '结果未发布不可查看',
    httpStatus: 403,
  },
  RESULT_WEIGHT_INVALID: {
    code: 'PERF_RESULT_003',
    message: '权重合计必须为 100%',
    httpStatus: 400,
  },
  RESULT_KPI_INCOMPLETE: {
    code: 'PERF_RESULT_004',
    message: 'KPI 评估未完成',
    httpStatus: 400,
  },
  RESULT_ALREADY_CONFIRMED: {
    code: 'PERF_RESULT_005',
    message: '结果已确认，不可重复确认',
    httpStatus: 409,
  },
  RESULT_APPEAL_REASON_TOO_SHORT: {
    code: 'PERF_RESULT_006',
    message: '申诉原因为空或过短（<10字符）',
    httpStatus: 400,
  },
  RESULT_NOT_PUBLISHED_FOR_CONFIRM: {
    code: 'PERF_RESULT_007',
    message: '结果未发布，员工无法确认/申诉',
    httpStatus: 409,
  },
  RESULT_NOT_APPEALED: {
    code: 'PERF_RESULT_010',
    message: '该结果未处于申诉状态，无法处理申诉',
    httpStatus: 400,
  },

  // ==================== 反馈错误（已废弃，功能已移出当前版本） ====================
  // PERF_FEEDBACK_001~002 已废弃

  // ==================== 统计分析错误 ====================
  REPORT_MISSING_PARAMS: {
    code: 'PERF_REPORT_001',
    message: '缺少必要参数',
    httpStatus: 400,
  },
  REPORT_FORBIDDEN: {
    code: 'PERF_REPORT_002',
    message: '无权查看报表',
    httpStatus: 403,
  },
} as const;

export type PerformanceErrorCode = keyof typeof PERFORMANCE_ERROR_CODES;
