// apps/web/src/server/db/queries/mock-payment-events.ts
// Ledger writer + mock_scenario setters for the MockPaymentProvider (dev/test only).
import { eq } from 'drizzle-orm';
import { getDb } from '../client.js';
import { mockPaymentEvents, groupReservations, vendors } from '../schema.js';
import { asStockReservationId } from '../../platform-seams/ids.js';

export interface MockEventInput {
  op: string;
  orderLineId?: string | null;
  reservationId?: string | null;
  vendorId?: string | null;
  scenario: string;
  outcomeCode: string;
}

/** Append a ledger row for every MockPaymentProvider operation. */
export async function recordMockEvent(databaseUrl: string, input: MockEventInput): Promise<void> {
  const db = getDb({ DATABASE_URL: databaseUrl });
  await db.insert(mockPaymentEvents).values({
    op: input.op,
    orderLineId: input.orderLineId ?? null,
    reservationId: input.reservationId ? asStockReservationId(input.reservationId) : null,
    vendorId: input.vendorId ?? null,
    scenario: input.scenario,
    outcomeCode: input.outcomeCode,
  });
}

/** Persist a mock scenario onto a group_reservation row (call once at request boundary). */
export async function setReservationMockScenario(
  databaseUrl: string,
  reservationId: string,
  scenario: string,
): Promise<void> {
  const db = getDb({ DATABASE_URL: databaseUrl });
  await db
    .update(groupReservations)
    .set({ mockScenario: scenario })
    .where(eq(groupReservations.id, reservationId));
}

/** Persist a mock scenario onto a vendor row (call once at onboard request boundary). */
export async function setVendorMockScenario(
  databaseUrl: string,
  vendorId: string,
  scenario: string,
): Promise<void> {
  const db = getDb({ DATABASE_URL: databaseUrl });
  await db.update(vendors).set({ mockScenario: scenario }).where(eq(vendors.id, vendorId));
}
