import { and, eq } from 'drizzle-orm';
import type { DrizzleClient } from '../client.js';
import { vendorPayoutReleases } from '../schema.js';

export type PayoutReleaseStatus = typeof vendorPayoutReleases.$inferSelect.status;

export async function cancelEnqueuedPayoutRelease(
  db: DrizzleClient,
  id: typeof vendorPayoutReleases.$inferSelect.id,
) {
  return db
    .update(vendorPayoutReleases)
    .set({ status: 'cancelled', cancelledAt: new Date() })
    .where(and(eq(vendorPayoutReleases.id, id), eq(vendorPayoutReleases.status, 'enqueued')))
    .returning({ id: vendorPayoutReleases.id });
}

export async function claimPayoutReleaseForRefund(
  db: DrizzleClient,
  id: typeof vendorPayoutReleases.$inferSelect.id,
  status: PayoutReleaseStatus,
) {
  return db
    .update(vendorPayoutReleases)
    .set({ status: 'refunded' })
    .where(and(eq(vendorPayoutReleases.id, id), eq(vendorPayoutReleases.status, status)))
    .returning({ id: vendorPayoutReleases.id });
}

export async function stampPayoutRefund(
  db: DrizzleClient,
  id: typeof vendorPayoutReleases.$inferSelect.id,
  refundId: string,
): Promise<void> {
  await db.update(vendorPayoutReleases).set({ refundId }).where(eq(vendorPayoutReleases.id, id));
}

export async function revertPayoutRefundClaim(
  db: DrizzleClient,
  id: typeof vendorPayoutReleases.$inferSelect.id,
  status: PayoutReleaseStatus,
): Promise<void> {
  await db
    .update(vendorPayoutReleases)
    .set({ status })
    .where(and(eq(vendorPayoutReleases.id, id), eq(vendorPayoutReleases.status, 'refunded')));
}
