import { sql } from 'drizzle-orm'
import type { Querier } from '@platform-modules/db'
import type { MarketplaceSchema } from './schema.js'

export class MarketplaceMigrateError extends Error {
  override readonly name = 'MarketplaceMigrateError'
  readonly code = 'MARKETPLACE_MIGRATE' as const

  constructor(readonly detail: string) {
    super(`marketplace migrate: ${detail}`)
  }
}

export function isMarketplaceMigrateError(e: unknown): e is MarketplaceMigrateError {
  return (
    typeof e === 'object' &&
    e !== null &&
    (e as { name?: unknown }).name === 'MarketplaceMigrateError' &&
    (e as { code?: unknown }).code === 'MARKETPLACE_MIGRATE'
  )
}

const MIGRATION_STATEMENTS = [
  sql`
    CREATE TABLE IF NOT EXISTS vendor (
      id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
      owner_user_id text NOT NULL,
      name text NOT NULL,
      status text NOT NULL DEFAULT 'pending',
      commission_bps integer NOT NULL,
      created_at timestamptz NOT NULL DEFAULT NOW(),
      updated_at timestamptz NOT NULL DEFAULT NOW()
    )
  `,
  sql`
    CREATE UNIQUE INDEX IF NOT EXISTS vendor_owner_user_id_uq
    ON vendor (owner_user_id)
  `,
]

export async function pushSchema(db: Querier<MarketplaceSchema>): Promise<void> {
  try {
    for (const statement of MIGRATION_STATEMENTS) {
      await db.execute(statement)
    }
  } catch (e) {
    throw new MarketplaceMigrateError(e instanceof Error ? e.message : String(e))
  }
}
