import { DomainError } from "../../shared/errors.ts";

export type ProductKind = "game_key" | "gift_card" | "in_game_item" | "game_currency" | "dlc" | "e_money" | "digital_movie";
export type DeliveryMode = "instant_code" | "manual_trade" | "account_topup" | "licensed_stream";

export interface CatalogCapabilities {
  readonly kind: ProductKind;
  readonly enabled: boolean;
  readonly deliveryModes: ReadonlySet<DeliveryMode>;
  readonly supportedRegions: ReadonlySet<string>;
  readonly supportedServers: ReadonlySet<string>;
}

export function assertCatalogCombination(
  capabilities: CatalogCapabilities,
  requested: { deliveryMode: DeliveryMode; region: string; server?: string },
): void {
  if (!capabilities.enabled) throw new DomainError("CATALOG_DISABLED", "This marketplace capability is disabled.");
  if (!capabilities.deliveryModes.has(requested.deliveryMode)) throw new DomainError("DELIVERY_NOT_SUPPORTED", "Delivery mode is not supported.");
  if (!capabilities.supportedRegions.has(requested.region)) throw new DomainError("REGION_NOT_SUPPORTED", "Product region is not supported.");
  if (requested.server && !capabilities.supportedServers.has(requested.server)) throw new DomainError("SERVER_NOT_SUPPORTED", "Game server is not supported.");
}
