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

export interface SkuQtyTierRow {
  minQty: number;
  discountPercent: number;
}

/** Map of dealSkuId -> tiers (ordered by sortOrder) for the given SKUs. */
export async function getQtyTiersForSkus(
  db: DrizzleClient,
  dealSkuIds: string[],
): Promise<Map<string, SkuQtyTierRow[]>> {
  const map = new Map<string, SkuQtyTierRow[]>();
  if (dealSkuIds.length === 0) return map;
  const rows = await db
    .select({
      dealSkuId: skuQtyTiers.dealSkuId,
      minQty: skuQtyTiers.minQty,
      discountPercent: skuQtyTiers.discountPercent,
    })
    .from(skuQtyTiers)
    .where(inArray(skuQtyTiers.dealSkuId, dealSkuIds))
    .orderBy(asc(skuQtyTiers.sortOrder));
  for (const r of rows) {
    const list = map.get(r.dealSkuId) ?? [];
    list.push({ minQty: r.minQty, discountPercent: r.discountPercent });
    map.set(r.dealSkuId, list);
  }
  return map;
}

/** Replace all tiers for a SKU in one transaction (vendor self-serve save). */
export async function replaceQtyTiersForSku(
  db: DrizzleClient,
  dealSkuId: string,
  tiers: SkuQtyTierRow[],
): Promise<void> {
  await db.delete(skuQtyTiers).where(eq(skuQtyTiers.dealSkuId, dealSkuId));
  if (tiers.length === 0) return;
  await db.insert(skuQtyTiers).values(
    tiers.map((t, i) => ({
      dealSkuId,
      minQty: t.minQty,
      discountPercent: t.discountPercent,
      sortOrder: i,
    })),
  );
}
