import { and, eq } from 'drizzle-orm';
import { taxDocuments } from '@/server/db/schema.js';
import type { DrizzleClient } from '@/server/db/client.js';

export async function getTaxDoc(db: DrizzleClient, orderLineId: string, side: string) {
  const [row] = await db
    .select()
    .from(taxDocuments)
    .where(and(eq(taxDocuments.orderLineId, orderLineId), eq(taxDocuments.side, side)))
    .limit(1);
  return row ?? null;
}

// Returns the persisted row (existing or just-inserted). ON CONFLICT DO NOTHING
// guarantees one doc per (orderLineId, side) even under concurrent finalize.
export async function upsertTaxDoc(
  db: DrizzleClient,
  row: {
    orderLineId: string;
    side: string;
    providerTaxDocId: string;
    idempotencyKey: string;
  },
) {
  await db
    .insert(taxDocuments)
    .values(row)
    .onConflictDoNothing({
      target: [taxDocuments.orderLineId, taxDocuments.side],
    });
  return getTaxDoc(db, row.orderLineId, row.side);
}
