import type { ReturnStatus } from '@/lib/enums/return-status';
export type { ReturnStatus };

export type ReturnReason =
  | 'defective'
  | 'damaged_in_transit'
  | 'not_as_described'
  | 'wrong_item_received'
  | 'changed_mind'
  | 'wrong_size'
  | 'arrived_late'
  | 'other';

export type ReturnState = {
  status: ReturnStatus;
  reason: ReturnReason;
  liability: 'vendor' | 'buyer';
  refundAmountAgorot: number;
  restockingFeeAgorot: number;
  shippingReimbursementAgorot: number;
};

export type Command =
  | { kind: 'vendor.approve'; actorId: string }
  | { kind: 'vendor.deny'; actorId: string; reason: string }
  | { kind: 'buyer.cancel'; actorId: string }
  | { kind: 'buyer.enter_tracking'; actorId: string; carrier: string; tracking: string }
  | { kind: 'vendor.confirm_receipt'; actorId: string }
  | { kind: 'vendor.inspect_approve'; actorId: string }
  | { kind: 'vendor.inspect_dispute'; actorId: string; reason: string }
  | { kind: 'sla.vendor_respond_timeout' }
  | { kind: 'sla.buyer_ship_timeout' }
  | { kind: 'sla.vendor_inspect_timeout' }
  | { kind: 'admin.override_refund'; actorId: string; reason: string }
  | { kind: 'admin.override_close'; actorId: string; reason: string };

export type Event =
  | { kind: 'approved'; actorType: 'vendor' | 'system'; actorId: string | null; reason?: string }
  | { kind: 'denied'; actorType: 'vendor' | 'admin'; actorId: string; reason: string }
  | { kind: 'cancelled'; actorType: 'buyer' | 'admin'; actorId: string }
  | {
      kind: 'tracking_entered';
      actorType: 'buyer';
      actorId: string;
      carrier: string;
      tracking: string;
    }
  | { kind: 'received'; actorType: 'vendor'; actorId: string }
  | {
      kind: 'refund_executed';
      actorType: 'vendor' | 'system' | 'admin';
      actorId: string | null;
      reason?: string;
    }
  | { kind: 'expired'; actorType: 'system'; actorId: null; reason: string };

export function decide(state: ReturnState, cmd: Command): Event[] {
  const invalid = (): never => {
    throw new Error(`invalid transition: ${cmd.kind} from ${state.status}`);
  };
  switch (state.status) {
    case 'requested':
      if (cmd.kind === 'vendor.approve')
        return [{ kind: 'approved', actorType: 'vendor', actorId: cmd.actorId }];
      if (cmd.kind === 'vendor.deny')
        return [{ kind: 'denied', actorType: 'vendor', actorId: cmd.actorId, reason: cmd.reason }];
      if (cmd.kind === 'buyer.cancel')
        return [{ kind: 'cancelled', actorType: 'buyer', actorId: cmd.actorId }];
      if (cmd.kind === 'sla.vendor_respond_timeout')
        return [{ kind: 'approved', actorType: 'system', actorId: null, reason: 'sla_timeout' }];
      return invalid();
    case 'approved':
      if (cmd.kind === 'buyer.enter_tracking')
        return [
          {
            kind: 'tracking_entered',
            actorType: 'buyer',
            actorId: cmd.actorId,
            carrier: cmd.carrier,
            tracking: cmd.tracking,
          },
        ];
      if (cmd.kind === 'buyer.cancel')
        return [{ kind: 'cancelled', actorType: 'buyer', actorId: cmd.actorId }];
      if (cmd.kind === 'sla.buyer_ship_timeout')
        return [
          { kind: 'expired', actorType: 'system', actorId: null, reason: 'buyer_ship_timeout' },
        ];
      return invalid();
    case 'in_transit':
      if (cmd.kind === 'vendor.confirm_receipt')
        return [{ kind: 'received', actorType: 'vendor', actorId: cmd.actorId }];
      return invalid();
    case 'received':
      if (cmd.kind === 'vendor.inspect_approve')
        return [{ kind: 'refund_executed', actorType: 'vendor', actorId: cmd.actorId }];
      if (cmd.kind === 'vendor.inspect_dispute')
        return [{ kind: 'denied', actorType: 'vendor', actorId: cmd.actorId, reason: cmd.reason }];
      if (cmd.kind === 'sla.vendor_inspect_timeout')
        return [
          { kind: 'refund_executed', actorType: 'system', actorId: null, reason: 'sla_timeout' },
        ];
      return invalid();
    case 'denied':
    case 'cancelled':
    case 'expired':
      if (cmd.kind === 'admin.override_refund')
        return [
          { kind: 'refund_executed', actorType: 'admin', actorId: cmd.actorId, reason: cmd.reason },
        ];
      if (cmd.kind === 'admin.override_close')
        return [{ kind: 'cancelled', actorType: 'admin', actorId: cmd.actorId }];
      return invalid();
    case 'refunded':
      // Terminal post-refund: no double-refund, no re-close. Compensating payouts go through credit_ledger, not this machine.
      return invalid();
  }
}
