/**
 * Data export schema — data-export-gdpr (wave-10 leaf 8).
 * Postgres / Neon via Hyperdrive.
 *
 * Tables:
 *  - export_jobs: one row per export request; tracks status + download URL
 *
 * DB conventions:
 *  - UUID PK .defaultRandom()
 *  - TIMESTAMPTZ via timestamp(col, { withTimezone: true })
 *  - Enums: text() + check(... IN (...)) — NEVER pgEnum
 *  - FKs to tenants/users via .references()
 *
 * export_jobs.status:
 *   'pending' | 'processing' | 'completed' | 'failed'
 */
import {
  pgTable,
  uuid,
  text,
  timestamp,
  index,
  check,
} from 'drizzle-orm/pg-core'
import { sql } from 'drizzle-orm'
import { tenants } from './tenants'
import { users } from './users'

// ── export_jobs ───────────────────────────────────────────────────────────────

export const exportJobs = pgTable(
  'export_jobs',
  {
    id: uuid('id').primaryKey().defaultRandom(),
    tenantId: uuid('tenant_id')
      .notNull()
      .references(() => tenants.id, { onDelete: 'cascade' }),
    createdBy: uuid('created_by')
      .notNull()
      .references(() => users.id, { onDelete: 'restrict' }),
    status: text('status').notNull().default('pending'),
    downloadUrl: text('download_url'),
    errorMessage: text('error_message'),
    createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
    completedAt: timestamp('completed_at', { withTimezone: true }),
  },
  (t) => ({
    tenantCreatedIdx: index('idx_export_jobs_tenant_created').on(t.tenantId, t.createdAt),
    statusCheck: check(
      'export_jobs_status_check',
      sql`${t.status} IN ('pending','processing','completed','failed')`,
    ),
  }),
)

export type ExportJobRow = typeof exportJobs.$inferSelect
export type NewExportJob = typeof exportJobs.$inferInsert
