/**
 * EN: Centralized error codes for consistent error handling
 * VI: Error codes tập trung để xử lý lỗi nhất quán
 */
export enum ErrorCode {
  // EN: Authentication & Authorization Errors
  // VI: Lỗi Authentication & Authorization
  UNAUTHORIZED = 'AUTH_001',
  FORBIDDEN = 'AUTH_002',
  INVALID_TOKEN = 'AUTH_003',
  TOKEN_EXPIRED = 'AUTH_004',
  MISSING_PERMISSIONS = 'AUTH_005',

  // EN: Validation Errors
  // VI: Lỗi Validation
  VALIDATION_ERROR = 'VALIDATION_001',
  INVALID_FORMAT = 'VALIDATION_002',
  REQUIRED_FIELD = 'VALIDATION_003',
  INVALID_VALUE = 'VALIDATION_004',

  // EN: Resource Errors
  // VI: Lỗi Resource
  NOT_FOUND = 'RESOURCE_001',
  ALREADY_EXISTS = 'RESOURCE_002',
  CONFLICT = 'RESOURCE_003',
  DELETED = 'RESOURCE_004',

  // EN: Business Logic Errors
  // VI: Lỗi Business Logic
  INVALID_OPERATION = 'BUSINESS_001',
  INSUFFICIENT_FUNDS = 'BUSINESS_002',
  LIMIT_EXCEEDED = 'BUSINESS_003',
  EXPIRED = 'BUSINESS_004',

  // EN: External Service Errors
  // VI: Lỗi External Service
  EXTERNAL_SERVICE_ERROR = 'EXTERNAL_001',
  SERVICE_UNAVAILABLE = 'EXTERNAL_002',
  TIMEOUT = 'EXTERNAL_003',
  NETWORK_ERROR = 'EXTERNAL_004',

  // EN: Database Errors
  // VI: Lỗi Database
  DATABASE_ERROR = 'DB_001',
  CONNECTION_ERROR = 'DB_002',
  QUERY_ERROR = 'DB_003',
  CONSTRAINT_VIOLATION = 'DB_004',

  // EN: System Errors
  // VI: Lỗi System
  INTERNAL_ERROR = 'SYS_001',
  CONFIGURATION_ERROR = 'SYS_002',
  RATE_LIMIT_EXCEEDED = 'SYS_003',
  MAINTENANCE_MODE = 'SYS_004',

  // EN: Health Check Errors
  // VI: Lỗi Health Check
  HEALTH_CHECK_FAILED = 'HEALTH_001',
  DATABASE_UNHEALTHY = 'HEALTH_002',
  CACHE_UNHEALTHY = 'HEALTH_003',
  EXTERNAL_DEPENDENCY_UNHEALTHY = 'HEALTH_004',

  // EN: Feature-Specific Errors
  // VI: Lỗi Feature-Specific
  FEATURE_NOT_ENABLED = 'FEATURE_001',
  FEATURE_CONFIG_INVALID = 'FEATURE_002',
  FEATURE_DEPENDENCY_MISSING = 'FEATURE_003',
}

/**
 * EN: Error code to HTTP status mapping
 * VI: Mapping error code sang HTTP status
 */
export const ERROR_CODE_TO_STATUS: Record<ErrorCode, number> = {
  // Auth errors
  [ErrorCode.UNAUTHORIZED]: 401,
  [ErrorCode.FORBIDDEN]: 403,
  [ErrorCode.INVALID_TOKEN]: 401,
  [ErrorCode.TOKEN_EXPIRED]: 401,
  [ErrorCode.MISSING_PERMISSIONS]: 403,

  // Validation errors
  [ErrorCode.VALIDATION_ERROR]: 422,
  [ErrorCode.INVALID_FORMAT]: 422,
  [ErrorCode.REQUIRED_FIELD]: 422,
  [ErrorCode.INVALID_VALUE]: 422,

  // Resource errors
  [ErrorCode.NOT_FOUND]: 404,
  [ErrorCode.ALREADY_EXISTS]: 409,
  [ErrorCode.CONFLICT]: 409,
  [ErrorCode.DELETED]: 410,

  // Business errors
  [ErrorCode.INVALID_OPERATION]: 422,
  [ErrorCode.INSUFFICIENT_FUNDS]: 422,
  [ErrorCode.LIMIT_EXCEEDED]: 422,
  [ErrorCode.EXPIRED]: 410,

  // External service errors
  [ErrorCode.EXTERNAL_SERVICE_ERROR]: 502,
  [ErrorCode.SERVICE_UNAVAILABLE]: 503,
  [ErrorCode.TIMEOUT]: 504,
  [ErrorCode.NETWORK_ERROR]: 502,

  // Database errors
  [ErrorCode.DATABASE_ERROR]: 500,
  [ErrorCode.CONNECTION_ERROR]: 503,
  [ErrorCode.QUERY_ERROR]: 500,
  [ErrorCode.CONSTRAINT_VIOLATION]: 422,

  // System errors
  [ErrorCode.INTERNAL_ERROR]: 500,
  [ErrorCode.CONFIGURATION_ERROR]: 500,
  [ErrorCode.RATE_LIMIT_EXCEEDED]: 429,
  [ErrorCode.MAINTENANCE_MODE]: 503,

  // Health errors
  [ErrorCode.HEALTH_CHECK_FAILED]: 503,
  [ErrorCode.DATABASE_UNHEALTHY]: 503,
  [ErrorCode.CACHE_UNHEALTHY]: 503,
  [ErrorCode.EXTERNAL_DEPENDENCY_UNHEALTHY]: 503,

  // Feature errors
  [ErrorCode.FEATURE_NOT_ENABLED]: 403,
  [ErrorCode.FEATURE_CONFIG_INVALID]: 500,
  [ErrorCode.FEATURE_DEPENDENCY_MISSING]: 500,
};

/**
 * EN: Get HTTP status from error code
 * VI: Lấy HTTP status từ error code
 */
export function getStatusFromErrorCode(errorCode: ErrorCode): number {
  return ERROR_CODE_TO_STATUS[errorCode] || 500;
}

/**
 * EN: Check if error code represents an operational error (not a programming error)
 * VI: Kiểm tra error code có phải operational error (không phải programming error)
 */
export function isOperationalError(errorCode: ErrorCode): boolean {
  const operationalCodes = [
    // Auth errors
    ErrorCode.UNAUTHORIZED,
    ErrorCode.FORBIDDEN,
    ErrorCode.INVALID_TOKEN,
    ErrorCode.TOKEN_EXPIRED,
    ErrorCode.MISSING_PERMISSIONS,

    // Validation errors
    ErrorCode.VALIDATION_ERROR,
    ErrorCode.INVALID_FORMAT,
    ErrorCode.REQUIRED_FIELD,
    ErrorCode.INVALID_VALUE,

    // Resource errors
    ErrorCode.NOT_FOUND,
    ErrorCode.ALREADY_EXISTS,
    ErrorCode.CONFLICT,
    ErrorCode.DELETED,

    // Business errors
    ErrorCode.INVALID_OPERATION,
    ErrorCode.INSUFFICIENT_FUNDS,
    ErrorCode.LIMIT_EXCEEDED,
    ErrorCode.EXPIRED,

    // External service errors
    ErrorCode.EXTERNAL_SERVICE_ERROR,
    ErrorCode.SERVICE_UNAVAILABLE,
    ErrorCode.TIMEOUT,
    ErrorCode.NETWORK_ERROR,

    // System errors
    ErrorCode.RATE_LIMIT_EXCEEDED,
    ErrorCode.MAINTENANCE_MODE,

    // Health errors
    ErrorCode.HEALTH_CHECK_FAILED,
    ErrorCode.DATABASE_UNHEALTHY,
    ErrorCode.CACHE_UNHEALTHY,
    ErrorCode.EXTERNAL_DEPENDENCY_UNHEALTHY,

    // Feature errors
    ErrorCode.FEATURE_NOT_ENABLED,
  ];

  return operationalCodes.includes(errorCode);
}