import type { ReportMeta, ReportResult, WorksheetData, ForecastReportData, WeeklyActualData } from './types' const BASE = '/reports/api' async function request(path: string, opts: RequestInit = {}): Promise { const res = await fetch(`${BASE}${path}`, { credentials: 'include', headers: { 'Content-Type': 'application/json', ...opts.headers }, ...opts, }) if (res.status === 401) { ;(window.top ?? window).location.href = '/login' throw new Error('Unauthenticated') } if (!res.ok) { const err = await res.json().catch(() => ({ error: res.statusText })) throw new Error((err as { error?: string }).error || `Request failed: ${res.status}`) } return res.json() } export function fetchReports(): Promise { return request('/reports') } export function runReport(id: string, dateFrom: string, dateTo: string): Promise { return request(`/reports/${encodeURIComponent(id)}/run`, { method: 'POST', body: JSON.stringify({ dateFrom, dateTo }), }) } // ── Weekly Actuals API ────────────────────────────────────────────────────── export function getWeeklyActual(weekEnding: string): Promise { return request(`/weekly-actual/${weekEnding}`) } // ── Directors Forecast API ────────────────────────────────────────────────── export function dfGetWorksheet(year: number, month: number, dowAlign = true): Promise { return request(`/directors-forecast/worksheet/${year}/${month}?dow_align=${dowAlign}`) } export function dfSaveWorksheet(year: number, month: number, data: { pickup_avg_rate: number; overrides: object[] }): Promise<{ ok: boolean }> { return request<{ ok: boolean }>(`/directors-forecast/worksheet/${year}/${month}`, { method: 'PUT', body: JSON.stringify(data), }) } export function dfGetReport(year: number, month: number, dowAlign = true): Promise { return request(`/directors-forecast/report/${year}/${month}?dow_align=${dowAlign}`) } export function dfSaveSnapshot(year: number, month: number, data: object) { return request(`/directors-forecast/report/${year}/${month}/snapshot`, { method: 'POST', body: JSON.stringify(data), }) } export function dfDeleteSnapshot(year: number, month: number, id: number) { return request(`/directors-forecast/report/${year}/${month}/snapshot/${id}`, { method: 'DELETE', }) } // ── Settings ────────────────────────────────────────────────────────────────── export type AppSetting = { key: string; value: string; updated_at: string } export function getSettings(): Promise<{ settings: AppSetting[] }> { return request('/settings') } export function saveSettings(settings: { key: string; value: string }[]): Promise<{ ok: boolean }> { return request('/settings', { method: 'PUT', body: JSON.stringify({ settings }) }) }