import { voucher } from '@platform-modules/commerce-fulfillment';
import type { SQL } from 'drizzle-orm';
import type { DrizzleClient } from '../client.js';
import * as schema from '../schema.js';

type SeedUserInsert = Omit<typeof schema.users.$inferInsert, 'email' | 'phone'> & {
  email?: SQL | string | null;
  phone?: SQL | string | null;
};

export async function insertSeedDemoAdminUser(
  db: DrizzleClient,
  values: SeedUserInsert,
): Promise<void> {
  await db.insert(schema.users).values(values);
}

export async function insertSeedDemoUser(
  db: DrizzleClient,
  values: SeedUserInsert,
): Promise<{ id: string }> {
  const [row] = await db.insert(schema.users).values(values).returning({ id: schema.users.id });
  return row!;
}

export async function insertSeedDemoAddress(
  db: DrizzleClient,
  values: typeof schema.addresses.$inferInsert,
): Promise<void> {
  await db.insert(schema.addresses).values(values);
}

export async function insertSeedDemoPaymentMethod(
  db: DrizzleClient,
  values: typeof schema.paymentMethods.$inferInsert,
): Promise<void> {
  await db.insert(schema.paymentMethods).values(values);
}

export async function insertSeedDemoVendor(
  db: DrizzleClient,
  values: typeof schema.vendors.$inferInsert,
): Promise<{ id: string }> {
  const [row] = await db.insert(schema.vendors).values(values).returning({ id: schema.vendors.id });
  return row!;
}

export async function insertSeedDemoBusinessHours(
  db: DrizzleClient,
  values: typeof schema.businessHours.$inferInsert,
): Promise<void> {
  await db.insert(schema.businessHours).values(values);
}

export async function insertSeedDemoVendorAddress(
  db: DrizzleClient,
  values: typeof schema.vendorAddresses.$inferInsert,
): Promise<void> {
  await db.insert(schema.vendorAddresses).values(values);
}

export async function insertSeedDemoDeal(
  db: DrizzleClient,
  values: typeof schema.deals.$inferInsert,
): Promise<{ id: string }> {
  const [row] = await db.insert(schema.deals).values(values).returning({ id: schema.deals.id });
  return row!;
}

export async function insertSeedDemoDealSku(
  db: DrizzleClient,
  values: typeof schema.dealSkus.$inferInsert,
): Promise<{ id: string }> {
  const [row] = await db
    .insert(schema.dealSkus)
    .values(values)
    .returning({ id: schema.dealSkus.id });
  return row!;
}

export async function insertSeedDemoDealImage(
  db: DrizzleClient,
  values: typeof schema.dealImages.$inferInsert,
): Promise<void> {
  await db.insert(schema.dealImages).values(values);
}

export async function insertSeedDemoPurchaseOrder(
  db: DrizzleClient,
  values: typeof schema.order.$inferInsert,
): Promise<{ id: string }> {
  const [row] = await db.insert(schema.order).values(values).returning({ id: schema.order.id });
  return row!;
}

export async function insertSeedDemoPurchaseLine(
  db: DrizzleClient,
  values: typeof schema.orderLine.$inferInsert,
): Promise<{ id: string }> {
  const [row] = await db
    .insert(schema.orderLine)
    .values(values)
    .returning({ id: schema.orderLine.id });
  return row!;
}

export async function insertSeedDemoVoucher(
  db: DrizzleClient,
  values: typeof voucher.$inferInsert,
): Promise<void> {
  await db.insert(voucher).values(values);
}

export async function insertSeedDemoVoucherExtension(
  db: DrizzleClient,
  values: typeof schema.orderLineVoucherExt.$inferInsert,
): Promise<void> {
  await db.insert(schema.orderLineVoucherExt).values(values);
}

export async function insertSeedDemoReview(
  db: DrizzleClient,
  values: typeof schema.reviews.$inferInsert,
): Promise<void> {
  await db.insert(schema.reviews).values(values);
}

export async function insertSeedDemoClubMembership(
  db: DrizzleClient,
  values: typeof schema.clubMemberships.$inferInsert,
): Promise<void> {
  await db.insert(schema.clubMemberships).values(values).onConflictDoNothing();
}
