/**
 * Query helpers for uniform_export_jobs — uniform-format-export (wave-13, spec 180).
 */
import { eq, and, desc } from 'drizzle-orm'
import type { Db } from '../client'
import { uniformExportJobs } from '../schema/uniform-export-jobs'
import type { NewUniformExportJob, UniformExportJobRow } from '../schema/uniform-export-jobs'

export { uniformExportJobs }
export type { UniformExportJobRow, NewUniformExportJob }

export async function createUniformExportJob(
  db: Db,
  input: Omit<NewUniformExportJob, 'id' | 'createdAt'>,
): Promise<UniformExportJobRow> {
  const [job] = await db.insert(uniformExportJobs).values(input).returning()
  if (!job) throw new Error('Failed to create uniform export job')
  return job
}

export async function getUniformExportJob(
  db: Db,
  tenantId: string,
  jobId: string,
): Promise<UniformExportJobRow | undefined> {
  const [job] = await db
    .select()
    .from(uniformExportJobs)
    .where(and(eq(uniformExportJobs.id, jobId), eq(uniformExportJobs.tenantId, tenantId)))
    .limit(1)
  return job
}

export async function listUniformExportJobs(
  db: Db,
  tenantId: string,
  limit = 20,
): Promise<UniformExportJobRow[]> {
  return db
    .select()
    .from(uniformExportJobs)
    .where(eq(uniformExportJobs.tenantId, tenantId))
    .orderBy(desc(uniformExportJobs.createdAt))
    .limit(limit)
}

export async function setUniformExportJobRunning(
  db: Db,
  tenantId: string,
  jobId: string,
): Promise<void> {
  await db
    .update(uniformExportJobs)
    .set({ status: 'running' })
    .where(and(eq(uniformExportJobs.tenantId, tenantId), eq(uniformExportJobs.id, jobId)))
}

export async function setUniformExportJobDone(
  db: Db,
  tenantId: string,
  jobId: string,
  r2Key: string,
  recordCounts: Record<string, number>,
  downloadExpiresAt: Date,
): Promise<void> {
  await db
    .update(uniformExportJobs)
    .set({
      status: 'done',
      r2Key,
      recordCounts: recordCounts as unknown as Record<string, unknown>,
      downloadExpiresAt,
    })
    .where(and(eq(uniformExportJobs.tenantId, tenantId), eq(uniformExportJobs.id, jobId)))
}

export async function setUniformExportJobError(
  db: Db,
  tenantId: string,
  jobId: string,
  errorMessage: string,
): Promise<void> {
  await db
    .update(uniformExportJobs)
    .set({ status: 'error', errorMessage })
    .where(and(eq(uniformExportJobs.tenantId, tenantId), eq(uniformExportJobs.id, jobId)))
}

export async function updateUniformExportJobDownloadExpiry(
  db: Db,
  tenantId: string,
  jobId: string,
  downloadExpiresAt: Date,
): Promise<void> {
  await db
    .update(uniformExportJobs)
    .set({ downloadExpiresAt })
    .where(and(eq(uniformExportJobs.tenantId, tenantId), eq(uniformExportJobs.id, jobId)))
}
