/**
 * Report generator dispatch — scheduled-reports (wave-15).
 *
 * generateReport(schedule, period, db, env) → ReportData
 * Dispatches to type-specific generators via REPORT_GENERATOR_REGISTRY.
 */
import type { Db } from '@zync/db/queries'
import type { Env } from '@zync/types'
import type { ReportScheduleRow } from '@zync/db/queries'
import type { ReportPeriod } from '../schedule-math'

export class ReportTypeUnavailableError extends Error {
  constructor(reportType: string) {
    super(`Report type '${reportType}' is not available for scheduled delivery`)
    this.name = 'ReportTypeUnavailableError'
  }
}

export interface ReportSection {
  heading: string
  columns: string[]
  rows: (string | number)[][]
}

export interface ReportData {
  reportType: string
  period: ReportPeriod
  title: string
  sections: ReportSection[]
}

type ReportGenerator = (
  schedule: ReportScheduleRow,
  period: ReportPeriod,
  db: Db,
  env: Env,
) => Promise<ReportData>

import { generateFinancialReport } from './financial'

const REPORT_GENERATOR_REGISTRY: Record<string, ReportGenerator> = {
  pnl: generateFinancialReport,
  cashflow: generateFinancialReport,
  revenue: generateFinancialReport,
  expenses: generateFinancialReport,
}

/**
 * Generate report data for the given schedule and period.
 * Throws ReportTypeUnavailableError if no generator is registered.
 */
export async function generateReport(
  schedule: ReportScheduleRow,
  period: ReportPeriod,
  db: Db,
  env: Env,
): Promise<ReportData> {
  const generator = REPORT_GENERATOR_REGISTRY[schedule.reportType]
  if (!generator) {
    throw new ReportTypeUnavailableError(schedule.reportType)
  }
  return generator(schedule, period, db, env)
}
