import { sql } from 'drizzle-orm'
import { createPgliteClient } from '@platform-modules/db/pglite'
import type { TransactionalDatabase } from '@platform-modules/db'
import { pushSchema } from './migrate.js'
import { inventorySchema, type InventorySchema } from './schema.js'

export const TENANT_ID = '10000000-0000-4000-8000-000000000001'
export const FIFO_ITEM_ID = '10000000-0000-4000-8000-000000000002'
export const AVG_ITEM_ID = '10000000-0000-4000-8000-000000000003'
export const LOCATION_A = '10000000-0000-4000-8000-000000000004'
export const LOCATION_B = '10000000-0000-4000-8000-000000000005'
export const NOW = new Date('2026-07-04T12:00:00.000Z')

export function firstRows(result: unknown): Array<Record<string, unknown>> {
  return (Array.isArray(result)
    ? result
    : (result as { rows?: Array<Record<string, unknown>> }).rows) ?? []
}

export async function freshDb(): Promise<TransactionalDatabase<InventorySchema>> {
  const db = createPgliteClient({ schema: inventorySchema })
  await pushSchema(db)
  return db
}

export async function seedLocation(
  db: TransactionalDatabase<InventorySchema>,
  locationId: string,
  name = locationId,
): Promise<void> {
  await db.execute(sql`
    INSERT INTO stock_location (id, tenant_id, name, code)
    VALUES (${locationId}::uuid, ${TENANT_ID}::uuid, ${name}, ${name})
  `)
}

export async function seedItem(
  db: TransactionalDatabase<InventorySchema>,
  itemId: string,
  method: 'fifo' | 'weighted_average',
): Promise<void> {
  await db.execute(sql`
    INSERT INTO stock_item (id, tenant_id, name, method)
    VALUES (${itemId}::uuid, ${TENANT_ID}::uuid, ${itemId}, ${method})
  `)
}
