/**
 * 用户模块常量定义
 *
 * 功能描述：
 * - 定义用户模块中使用的常量值
 * - 避免魔法数字，提高代码可维护性
 * - 集中管理配置参数
 *
 * 职责分离：
 * - 常量定义：用户角色、字段限制、查询限制等常量值
 * - 错误消息：统一的错误消息定义和管理
 * - 工具类：性能监控和验证工具的封装
 *
 * 最近修改：
 * - 2026-01-15: 代码规范优化 - 补充职责分离描述 (修改者: moyin)
 * - 2026-01-09: 代码质量优化 - 提取魔法数字为常量定义 (修改者: moyin)
 *
 * @author moyin
 * @version 1.0.1
 * @since 2026-01-09
 * @lastModified 2026-01-15
 */

import { ValidationError } from 'class-validator';

/**
 * 用户角色常量
 */
export const USER_ROLES = {
  /** 普通用户角色 */
  NORMAL_USER: 1,
  /** 管理员角色 */
  ADMIN: 9
} as const;

/**
 * 字段长度限制常量
 */
export const FIELD_LIMITS = {
  /** 用户名最大长度 */
  USERNAME_MAX_LENGTH: 50,
  /** 昵称最大长度 */
  NICKNAME_MAX_LENGTH: 50,
  /** 邮箱最大长度 */
  EMAIL_MAX_LENGTH: 100,
  /** 手机号最大长度 */
  PHONE_MAX_LENGTH: 30,
  /** GitHub ID最大长度 */
  GITHUB_ID_MAX_LENGTH: 100,
  /** 头像URL最大长度 */
  AVATAR_URL_MAX_LENGTH: 255,
  /** 密码哈希最大长度 */
  PASSWORD_HASH_MAX_LENGTH: 255,
  /** 用户状态最大长度 */
  STATUS_MAX_LENGTH: 20
} as const;

/**
 * 查询限制常量
 */
export const QUERY_LIMITS = {
  /** 默认查询限制 */
  DEFAULT_LIMIT: 100,
  /** 默认搜索限制 */
  DEFAULT_SEARCH_LIMIT: 20,
  /** 最大查询限制 */
  MAX_LIMIT: 1000
} as const;

/**
 * 系统配置常量
 */
export const SYSTEM_CONFIG = {
  /** ID生成超时时间（毫秒） */
  ID_GENERATION_TIMEOUT: 5000,
  /** 锁等待间隔（毫秒） */
  LOCK_WAIT_INTERVAL: 1
} as const;

/**
 * 数据库常量
 */
export const DATABASE_CONSTANTS = {
  /** 排序方向 */
  ORDER_DESC: 'DESC' as const,
  ORDER_ASC: 'ASC' as const,
  /** 数据库默认值 */
  CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP' as const,
  /** 锁键名 */
  ID_GENERATION_LOCK_KEY: 'id_generation' as const
} as const;

/**
 * 测试常量
 */
export const TEST_CONSTANTS = {
  /** 测试用的不存在用户ID */
  NON_EXISTENT_USER_ID: 99999,
  /** 测试用的无效角色 */
  INVALID_ROLE: 999,
  /** 测试用的用户名长度限制 */
  USERNAME_LENGTH_LIMIT: 51,
  /** 测试用的批量操作数量 */
  BATCH_TEST_SIZE: 50,
  /** 测试用的性能测试数量 */
  PERFORMANCE_TEST_SIZE: 50,
  /** 测试用的分页大小 */
  TEST_PAGE_SIZE: 20,
  /** 测试用的查询偏移量 */
  TEST_OFFSET: 10
} as const;

/**
 * 错误消息常量
 */
export const ERROR_MESSAGES = {
  /** 用户创建失败 */
  USER_CREATE_FAILED: '用户创建失败，请稍后重试',
  /** 用户更新失败 */
  USER_UPDATE_FAILED: '用户更新失败，请稍后重试',
  /** 用户删除失败 */
  USER_DELETE_FAILED: '用户删除失败，请稍后重试',
  /** 用户不存在 */
  USER_NOT_FOUND: '用户不存在',
  /** 数据验证失败 */
  VALIDATION_FAILED: '数据验证失败',
  /** ID生成超时 */
  ID_GENERATION_TIMEOUT: 'ID生成超时，可能存在死锁',
  /** 用户名已存在 */
  USERNAME_EXISTS: '用户名已存在',
  /** 邮箱已存在 */
  EMAIL_EXISTS: '邮箱已存在',
  /** 手机号已存在 */
  PHONE_EXISTS: '手机号已存在',
  /** GitHub ID已存在 */
  GITHUB_ID_EXISTS: 'GitHub ID已存在'
} as const;

/**
 * 性能监控工具类
 */
export class PerformanceMonitor {
  private startTime: number;

  constructor() {
    this.startTime = Date.now();
  }

  /**
   * 获取执行时长
   * @returns 执行时长（毫秒）
   */
  getDuration(): number {
    return Date.now() - this.startTime;
  }

  /**
   * 重置计时器
   */
  reset(): void {
    this.startTime = Date.now();
  }

  /**
   * 创建新的性能监控实例
   * @returns 性能监控实例
   */
  static create(): PerformanceMonitor {
    return new PerformanceMonitor();
  }
}

/**
 * 验证工具类
 */
export class ValidationUtils {
  /**
   * 格式化验证错误消息
   *
   * @param validationErrors 验证错误数组
   * @returns 格式化后的错误消息字符串
   */
  static formatValidationErrors(validationErrors: ValidationError[]): string {
    return validationErrors.map(error =>
      Object.values(error.constraints || {}).join(', ')
    ).join('; ');
  }
}