/**
 * Write boundary for vendor_payout_releases status transitions
 * (settlements queue consumer).
 */

import { inArray, sql } from 'drizzle-orm';
import type { DrizzleClient } from '../client';
import { vendorPayoutReleases } from '../schema';

export async function claimReleasesForPayout(db: DrizzleClient, ids: string[]): Promise<void> {
  await db
    .update(vendorPayoutReleases)
    .set({
      status: 'releasing',
      claimedAt: new Date(),
      claimAttempts: sql`claim_attempts + 1`,
    })
    .where(inArray(vendorPayoutReleases.id, ids));
}

export async function markReleasesHeld(
  db: DrizzleClient,
  ids: string[],
  lastError: string,
): Promise<void> {
  await db
    .update(vendorPayoutReleases)
    .set({ status: 'held', lastError })
    .where(inArray(vendorPayoutReleases.id, ids));
}

export async function markReleasesEnqueued(
  db: DrizzleClient,
  ids: string[],
  lastError: string,
): Promise<void> {
  await db
    .update(vendorPayoutReleases)
    .set({ status: 'enqueued', lastError })
    .where(inArray(vendorPayoutReleases.id, ids));
}

export async function markReleasesReleased(
  db: DrizzleClient,
  ids: string[],
  payoutId: string,
): Promise<void> {
  await db
    .update(vendorPayoutReleases)
    .set({
      status: 'released',
      releasedAt: new Date(),
      payoutId,
      lastError: null,
    })
    .where(inArray(vendorPayoutReleases.id, ids));
}
