import type { IconName } from '@/components/ui/icons/Icon/Icon';

/** Canonical ordered tuple — the ONE place deal types are enumerated. */
export const DEAL_TYPES = ['COUPON', 'GROUP', 'ITEM'] as const;
export type DealType = (typeof DEAL_TYPES)[number];

/** Behavior each type exposes as data — backend reads these, never the string literal. */
export interface DealTypeCaps {
  allowsVariants: boolean;
  hasShipping: boolean;
  requiresPickupHours: boolean;
  settlementHold: 'event' | 'perpetual';
  settlementTrigger: 'coupon_redeemed' | 'group_threshold_met' | 'item_delivered';
  configTable: 'group_deals' | 'deal_item_config' | null;
}

export interface DealTypeMeta {
  key: DealType;
  order: number;
  icon: IconName;
  labelKey: 'coupon' | 'group' | 'item';
  descKey: 'coupon_desc' | 'group_desc' | 'item_desc';
  caps: DealTypeCaps;
}

export const DEAL_TYPE_META: Record<DealType, DealTypeMeta> = {
  COUPON: {
    key: 'COUPON', order: 0, icon: 'ShoppingBag', labelKey: 'coupon', descKey: 'coupon_desc',
    caps: { allowsVariants: true, hasShipping: false, requiresPickupHours: true,
      settlementHold: 'event', settlementTrigger: 'coupon_redeemed', configTable: null },
  },
  GROUP: {
    key: 'GROUP', order: 1, icon: 'Users', labelKey: 'group', descKey: 'group_desc',
    caps: { allowsVariants: false, hasShipping: false, requiresPickupHours: false,
      settlementHold: 'event', settlementTrigger: 'group_threshold_met', configTable: 'group_deals' },
  },
  ITEM: {
    key: 'ITEM', order: 2, icon: 'ShoppingCart', labelKey: 'item', descKey: 'item_desc',
    caps: { allowsVariants: true, hasShipping: true, requiresPickupHours: false,
      settlementHold: 'perpetual', settlementTrigger: 'item_delivered', configTable: 'deal_item_config' },
  },
};

export const DEAL_TYPES_ORDERED: DealTypeMeta[] = DEAL_TYPES
  .map((k) => DEAL_TYPE_META[k])
  .sort((a, b) => a.order - b.order);

export function dealTypeMeta(t: DealType): DealTypeMeta { return DEAL_TYPE_META[t]; }
export function dealTypeCaps(t: DealType): DealTypeCaps { return DEAL_TYPE_META[t].caps; }
export function isDealType(v: string): v is DealType {
  return (DEAL_TYPES as readonly string[]).includes(v);
}
