import { count, eq } from 'drizzle-orm'
import { createPgliteClient } from '@platform-modules/db/pglite'
import { pushSchema as pushCatalogSchema } from '@platform-modules/commerce-catalog'
import { createOrder } from '@platform-modules/commerce-orders'
import { pushSchema as pushOrdersSchema } from '@platform-modules/commerce-orders'
import type { Actor, NewOrder } from '@platform-modules/commerce-orders'
import { marketplaceDbSchema, vendor } from './schema.js'
import { pushSchema as pushMarketplaceSchema } from './migrate.js'
import { approveVendor, applyAsVendor } from './vendor.js'

export const USER_A = 'aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'
export const USER_B = 'bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb'
export const USER_C = 'cccccccc-cccc-4ccc-8ccc-cccccccccccc'
export const BUYER = 'dddddddd-dddd-4ddd-8ddd-dddddddddddd'
export const VARIANT = '11111111-1111-4111-8111-111111111111'
export const ADMIN: Actor = { isAdmin: true }

export async function freshDb() {
  const db = createPgliteClient({ schema: marketplaceDbSchema })
  await pushMarketplaceSchema(db)
  await pushCatalogSchema(db)
  await pushOrdersSchema(db)
  return db
}

export async function vendorCount(db: Awaited<ReturnType<typeof freshDb>>) {
  const [row] = await db.select({ count: count() }).from(vendor)
  return row?.count ?? 0
}

export async function seedApprovedVendor(
  db: Awaited<ReturnType<typeof freshDb>>,
  ownerUserId: string,
  name: string,
) {
  const created = await db.transaction((tx) =>
    applyAsVendor(tx, { ownerUserId, name }),
  )
  await db.transaction((tx) => approveVendor(tx, created.id, ADMIN))
  return created
}

export function baseOrder(buyerId: string, vendorId: string | null): NewOrder {
  return {
    idempotencyKey: crypto.randomUUID(),
    buyerRef: { userId: buyerId },
    currency: 'USD',
    priceMode: 'exclusive',
    subtotal: 1000n,
    tax: 100n,
    discount: 0n,
    total: 1100n,
    lines: [
      {
        variantId: VARIANT,
        kind: 'physical',
        qty: 2,
        unitPrice: 500n,
        lineTotal: 1000n,
        currency: 'USD',
        vendorId,
      },
    ],
    splits: [{ vendorId, amount: 1100n, funder: vendorId ? 'vendor' : 'platform' }],
  }
}

export async function seedVendorOrder(
  db: Awaited<ReturnType<typeof freshDb>>,
  buyerId: string,
  vendorId: string,
) {
  return db.transaction((tx) => createOrder(tx, baseOrder(buyerId, vendorId)))
}
