import { sql } from 'drizzle-orm'
import { afterAll, beforeAll, describe, expect, it } from 'vitest'
import type { TransactionalDatabase } from '@platform-modules/db'
import { startPg } from '../pg-harness.js'
import type { FulfillmentSchema } from '../schema.js'
import type { Address } from '../types.js'
import { createMemoryCarrierAdapter } from '../testing.js'
import { createShipment } from './shipment.js'
import { trackShipment } from './track.js'

const ORDER_ID = 'eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee'

const ADDRESS: Address = {
  line1: '3 Track Ter',
  city: 'Transit Town',
  postalCode: '60606',
  country: 'US',
}

function firstRow(res: unknown): Record<string, unknown> | undefined {
  const rows = (Array.isArray(res) ? res : (res as { rows?: Record<string, unknown>[] }).rows) ?? []
  return rows[0]
}

describe('trackShipment', () => {
  let db: TransactionalDatabase<FulfillmentSchema>
  let stop: (() => Promise<void>) | undefined

  beforeAll(async () => {
    const pgResult = await startPg()
    db = pgResult.db
    stop = pgResult.stop
  }, 120_000)

  afterAll(async () => {
    await stop?.()
  }, 30_000)

  it('updates shipment status from carrier.track result', async () => {
    const shipment = await db.transaction((tx) =>
      createShipment(tx, {
        orderId: ORDER_ID,
        lineIds: ['line-physical-4'],
        address: ADDRESS,
      }),
    )

    await db.execute(sql`
      UPDATE shipment
      SET status = 'labeled',
          tracking_number = 'TRACK-CRON-001',
          label_id = 'label-cron-1',
          carrier_kind = 'memory',
          updated_at = NOW()
      WHERE id = ${shipment.id}::uuid
    `)

    const carrier = createMemoryCarrierAdapter({
      track: async (trackingNumber) => ({
        trackingNumber,
        status: 'delivered',
      }),
    })

    const result = await trackShipment(db, shipment.id, carrier)

    expect(result.status).toBe('delivered')
    expect(result.trackingNumber).toBe('TRACK-CRON-001')

    const statusRes = await db.execute(sql`
      SELECT status FROM shipment WHERE id = ${shipment.id}::uuid
    `)
    expect(String(firstRow(statusRes)?.status)).toBe('delivered')
  })
})
