/**
 * Orders Domain - Contract
 * 
 * Business types and provider-specific mapping types.
 * Validated types are derived from schemas (see schema.ts).
 */

import type { SalesforceProductFieldMap } from "../catalog/contract";
import type { SalesforceAccountFieldMap } from "../customer/index";
import type { UserIdMapping } from "../mappings/contract";
import type { SalesforceOrderRecord } from "./providers/salesforce/raw.types";
import type { OrderConfigurations } from "./schema";

// ============================================================================
// Order Type Constants
// ============================================================================

/**
 * Order types available in the system
 */
export const ORDER_TYPE = {
  INTERNET: "Internet",
  SIM: "SIM",
  VPN: "VPN",
  OTHER: "Other",
} as const;

export type OrderTypeValue = (typeof ORDER_TYPE)[keyof typeof ORDER_TYPE];

// ============================================================================
// Order Status Constants
// ============================================================================

/**
 * Possible order statuses
 */
export const ORDER_STATUS = {
  DRAFT: "Draft",
  ACTIVATED: "Activated",
  PENDING: "Pending",
  FAILED: "Failed",
  CANCELLED: "Cancelled",
} as const;

export type OrderStatusValue = (typeof ORDER_STATUS)[keyof typeof ORDER_STATUS];

// ============================================================================
// Activation Type Constants
// ============================================================================

/**
 * Order activation types
 */
export const ACTIVATION_TYPE = {
  IMMEDIATE: "Immediate",
  SCHEDULED: "Scheduled",
} as const;

export type ActivationTypeValue = (typeof ACTIVATION_TYPE)[keyof typeof ACTIVATION_TYPE];

// ============================================================================
// SIM Type Constants
// ============================================================================

/**
 * SIM card types
 */
export const SIM_TYPE = {
  ESIM: "eSIM",
  PHYSICAL: "Physical SIM",
} as const;

export type SimTypeValue = (typeof SIM_TYPE)[keyof typeof SIM_TYPE];

// ============================================================================
// Internet Access Mode Constants
// ============================================================================

/**
 * Internet access mode types for connection configuration
 */
export const ACCESS_MODE = {
  IPOE_BYOR: "IPoE-BYOR",
  IPOE_HGW: "IPoE-HGW",
  PPPOE: "PPPoE",
} as const;

export type AccessModeValue = (typeof ACCESS_MODE)[keyof typeof ACCESS_MODE];

// ============================================================================
// Order Fulfillment Error Codes
// ============================================================================

/**
 * Error codes for order fulfillment operations
 * These represent business-level error categories
 */
export const ORDER_FULFILLMENT_ERROR_CODE = {
  PAYMENT_METHOD_MISSING: "PAYMENT_METHOD_MISSING",
  ORDER_NOT_FOUND: "ORDER_NOT_FOUND",
  WHMCS_ERROR: "WHMCS_ERROR",
  MAPPING_ERROR: "MAPPING_ERROR",
  VALIDATION_ERROR: "VALIDATION_ERROR",
  SALESFORCE_ERROR: "SALESFORCE_ERROR",
  PROVISIONING_ERROR: "PROVISIONING_ERROR",
} as const;

export type OrderFulfillmentErrorCode = 
  (typeof ORDER_FULFILLMENT_ERROR_CODE)[keyof typeof ORDER_FULFILLMENT_ERROR_CODE];

// ============================================================================
// Business Types (used internally, not validated at API boundary)
// ============================================================================

/**
 * Order creation type used for order creation flows
 */
export type OrderCreationType = "Internet" | "SIM" | "VPN" | "Other";

/**
 * Order status (string literal for flexibility)
 */
export type OrderStatus = string;

/**
 * Order type (string literal for flexibility)
 */
export type OrderType = string;

/**
 * User mapping for order creation (subset of UserIdMapping)
 */
export type UserMapping = Pick<UserIdMapping, "userId" | "whmcsClientId" | "sfAccountId">;

// ============================================================================
// Checkout Types
// ============================================================================

/**
 * Individual item in checkout cart
 */
export interface CheckoutItem {
  id: string;
  sku: string;
  name: string;
  description?: string;
  monthlyPrice?: number;
  oneTimePrice?: number;
  quantity: number;
  itemType: 'plan' | 'installation' | 'addon' | 'activation' | 'vpn';
  autoAdded?: boolean;
}

/**
 * Checkout totals calculation
 */
export interface CheckoutTotals {
  monthlyTotal: number;
  oneTimeTotal: number;
}

/**
 * Complete checkout cart with items, totals, and configuration
 */
export interface CheckoutCart {
  items: CheckoutItem[];
  totals: CheckoutTotals;
  configuration: OrderConfigurations;
}

/**
 * Order creation response from BFF
 */
export interface OrderCreateResponse {
  sfOrderId: string;
  status: string;
  message: string;
}

/**
 * Order fulfillment validation result
 */
export interface OrderFulfillmentValidationResult {
  sfOrder: SalesforceOrderRecord;
  clientId: number;
  isAlreadyProvisioned: boolean;
  whmcsOrderId?: string;
}

// ============================================================================
// Re-export Types from Schema (Schema-First Approach)
// ============================================================================

export type {
  // Order item types
  OrderItemSummary,
  OrderItemDetails,
  // Order types
  OrderSummary,
  OrderDetails,
  // Query and creation types
  OrderQueryParams,
  OrderConfigurationsAddress,
  OrderConfigurations,
  CreateOrderRequest,
  OrderBusinessValidation,
  SfOrderIdParam,
} from './schema';
