export type Holiday = { id: number; academic_period_id?: number | null; name: string; start_date: string; end_date: string; region?: string | null; source_file_name?: string | null; imported_at?: string | null; }; export async function listHolidays(region?: string, academicPeriodId?: number | null) { const params = new URLSearchParams(); if (region) { params.set('region', region); } if (academicPeriodId != null) { params.set('academicPeriodId', String(academicPeriodId)); } const query = params.toString(); const url = query ? `/api/holidays?${query}` : '/api/holidays'; const res = await fetch(url); const data = await res.json(); if (!res.ok || data.error) throw new Error(data.error || 'Fehler beim Laden der Ferien'); return data as { holidays: Holiday[] }; } export async function uploadHolidaysCsv(file: File, academicPeriodId: number) { const form = new FormData(); form.append('file', file); form.append('academicPeriodId', String(academicPeriodId)); const res = await fetch('/api/holidays/upload', { method: 'POST', body: form }); const data = await res.json(); if (!res.ok || data.error) throw new Error(data.error || 'Fehler beim Import der Ferien'); return data as { success: boolean; inserted: number; updated: number; merged_overlaps?: number; skipped_duplicates?: number; conflicts?: string[]; academic_period_id?: number | null; }; } export type HolidayInput = { name: string; start_date: string; end_date: string; region?: string | null; academic_period_id?: number | null; }; export type HolidayMutationResult = { success: boolean; holiday?: Holiday; regenerated_events: number; merged?: boolean; }; export async function createHoliday(data: HolidayInput): Promise { const res = await fetch('/api/holidays', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); const json = await res.json(); if (!res.ok || json.error) throw new Error(json.error || 'Fehler beim Erstellen'); return json; } export async function updateHoliday(id: number, data: Partial): Promise { const res = await fetch(`/api/holidays/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); const json = await res.json(); if (!res.ok || json.error) throw new Error(json.error || 'Fehler beim Aktualisieren'); return json; } export async function deleteHoliday(id: number): Promise<{ success: boolean; regenerated_events: number }> { const res = await fetch(`/api/holidays/${id}`, { method: 'DELETE' }); const json = await res.json(); if (!res.ok || json.error) throw new Error(json.error || 'Fehler beim Löschen'); return json; }