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<HolidayMutationResult> {
  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<HolidayInput>): Promise<HolidayMutationResult> {
  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;
}
