/**
 * Provider-specific error codes for structured error detection.
 *
 * These codes identify known error conditions from external providers.
 * Used by provider error classes in the BFF to replace brittle string matching.
 */

export const WhmcsProviderError = {
  // Authentication
  AUTH_FAILED: "WHMCS_AUTH_FAILED",
  INVALID_CREDENTIALS: "WHMCS_INVALID_CREDENTIALS",

  // Not found
  CLIENT_NOT_FOUND: "WHMCS_CLIENT_NOT_FOUND",
  INVOICE_NOT_FOUND: "WHMCS_INVOICE_NOT_FOUND",
  PRODUCT_NOT_FOUND: "WHMCS_PRODUCT_NOT_FOUND",

  // Validation
  VALIDATION_ERROR: "WHMCS_VALIDATION_ERROR",

  // Network/Infrastructure
  TIMEOUT: "WHMCS_TIMEOUT",
  NETWORK_ERROR: "WHMCS_NETWORK_ERROR",
  RATE_LIMITED: "WHMCS_RATE_LIMITED",
  HTTP_ERROR: "WHMCS_HTTP_ERROR",

  // Generic
  API_ERROR: "WHMCS_API_ERROR",
} as const;

export type WhmcsProviderErrorCode = (typeof WhmcsProviderError)[keyof typeof WhmcsProviderError];

export const SalesforceProviderError = {
  // Authentication
  SESSION_EXPIRED: "SF_SESSION_EXPIRED",
  AUTH_FAILED: "SF_AUTH_FAILED",

  // Query
  QUERY_ERROR: "SF_QUERY_ERROR",
  RECORD_NOT_FOUND: "SF_RECORD_NOT_FOUND",

  // Validation
  VALIDATION_ERROR: "SF_VALIDATION_ERROR",
  DUPLICATE_RECORD: "SF_DUPLICATE_RECORD",
  ACCESS_DENIED: "SF_ACCESS_DENIED",
  STORAGE_LIMIT: "SF_STORAGE_LIMIT",

  // Network/Infrastructure
  TIMEOUT: "SF_TIMEOUT",
  NETWORK_ERROR: "SF_NETWORK_ERROR",
  RATE_LIMITED: "SF_RATE_LIMITED",

  // Generic
  API_ERROR: "SF_API_ERROR",
} as const;

export type SalesforceProviderErrorCode =
  (typeof SalesforceProviderError)[keyof typeof SalesforceProviderError];

export const FreebitProviderError = {
  // Not found
  ACCOUNT_NOT_FOUND: "FREEBIT_ACCOUNT_NOT_FOUND",

  // Authentication
  AUTH_FAILED: "FREEBIT_AUTH_FAILED",

  // Validation
  VALIDATION_ERROR: "FREEBIT_VALIDATION_ERROR",

  // Network/Infrastructure
  TIMEOUT: "FREEBIT_TIMEOUT",
  NETWORK_ERROR: "FREEBIT_NETWORK_ERROR",
  RATE_LIMITED: "FREEBIT_RATE_LIMITED",

  // Generic
  API_ERROR: "FREEBIT_API_ERROR",
} as const;

export type FreebitProviderErrorCode =
  (typeof FreebitProviderError)[keyof typeof FreebitProviderError];
