import { z } from 'zod';
import type { OutboxHandler } from '../types.js';
import {
  processCartCompensation,
  processCartCompensationCleanup,
  processCartCheckoutFulfillment,
  processCartHoldRelease,
} from '../../cart-checkout-compensation.js';
const payloadSchema = z.looseObject({
  checkoutKey: z.string().optional(),
  compensationId: z.uuid().optional(),
  captureId: z.uuid().optional(),
  action: z.enum(['refund', 'release', 'cleanup']).default('refund'),
});
type Payload = z.infer<typeof payloadSchema>;
export const cartCheckoutCompensation: OutboxHandler<Payload> = {
  type: 'cart.checkout.compensation',
  payloadSchema,
  handle: async (ctx, payload) =>
    payload.action === 'release' && payload.captureId
      ? processCartHoldRelease(ctx, payload.captureId)
      : payload.compensationId
        ? processCartCompensation(ctx, payload.compensationId)
        : undefined,
};
export const cartCheckoutCompensationCleanup: OutboxHandler<Payload> = {
  type: 'cart.checkout.compensation.cleanup',
  payloadSchema,
  handle: async (ctx, payload) =>
    payload.checkoutKey ? processCartCompensationCleanup(ctx, payload.checkoutKey) : undefined,
};

export const cartCheckoutFulfillment: OutboxHandler<Payload> = {
  type: 'cart.checkout.fulfillment',
  payloadSchema,
  handle: async (ctx, payload) => {
    if (!payload.checkoutKey) throw new Error('cart checkout fulfillment missing checkout key');
    await processCartCheckoutFulfillment(ctx, payload.checkoutKey);
  },
};
