// src/routes/api/admin/zeitraeume/+server.ts
import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { prisma } from '$lib/prisma';

// Hilfsfunktion: Erstelle ZeitraumPlaetze-Einträge für einen neuen Zeitraum
async function createZeitraumPlaetzeForZeitraum(zeitraumId: number) {
	const dienststellen = await prisma.dienststelle.findMany();

	// Erstelle für jede existierende Dienststelle einen Eintrag mit 1 Platz
	for (const dienststelle of dienststellen) {
		await prisma.zeitraumPlaetze.create({
			data: {
				zeitraumId: zeitraumId,
				dienststelleId: dienststelle.id,
				plaetze: 1 // Standardwert: 1 Platz pro Dienststelle
			}
		});
	}
}

export const GET: RequestHandler = async ({ cookies }) => {
	const adminAuth = cookies.get('admin-auth');
	if (adminAuth !== 'authenticated') {
		return json({ error: 'Nicht autorisiert' }, { status: 401 });
	}

	try {
		const zeitraeume = await prisma.praktikumszeitraum.findMany({
			orderBy: { startDatum: 'desc' }
		});
		return json(zeitraeume);
	} catch (error) {
		console.error('Fehler beim Laden der Zeiträume:', error);
		return json({ error: 'Serverfehler' }, { status: 500 });
	}
};

export const POST: RequestHandler = async ({ request, cookies }) => {
	const adminAuth = cookies.get('admin-auth');
	if (adminAuth !== 'authenticated') {
		return json({ error: 'Nicht autorisiert' }, { status: 401 });
	}

	try {
		const { bezeichnung, startDatum, endDatum } = await request.json();

		if (!bezeichnung || !startDatum || !endDatum) {
			return json({ error: 'Alle Felder sind erforderlich' }, { status: 400 });
		}

		const start = new Date(startDatum);
		const end = new Date(endDatum);

		if (end <= start) {
			return json({ error: 'Enddatum muss nach dem Startdatum liegen' }, { status: 400 });
		}

		const zeitraum = await prisma.praktikumszeitraum.create({
			data: {
				bezeichnung,
				startDatum: start,
				endDatum: end
			}
		});

		// Automatisch ZeitraumPlaetze für alle existierenden Dienststellen erstellen (mit 1 Platz)
		await createZeitraumPlaetzeForZeitraum(zeitraum.id);

		return json(zeitraum);
	} catch (error: any) {
		console.error('Fehler beim Erstellen des Zeitraums:', error);
		if (error.code === 'P2002') {
			return json(
				{ error: 'Ein Zeitraum mit dieser Bezeichnung existiert bereits' },
				{ status: 400 }
			);
		}
		return json({ error: 'Serverfehler' }, { status: 500 });
	}
};

export const PATCH: RequestHandler = async ({ request, cookies }) => {
	const adminAuth = cookies.get('admin-auth');
	if (adminAuth !== 'authenticated') {
		return json({ error: 'Nicht autorisiert' }, { status: 401 });
	}

	try {
		const { id, bezeichnung, startDatum, endDatum } = await request.json();

		if (!id || !bezeichnung || !startDatum || !endDatum) {
			return json({ error: 'Alle Felder sind erforderlich' }, { status: 400 });
		}

		const start = new Date(startDatum);
		const end = new Date(endDatum);

		if (end <= start) {
			return json({ error: 'Enddatum muss nach dem Startdatum liegen' }, { status: 400 });
		}

		const zeitraum = await prisma.praktikumszeitraum.update({
			where: { id: parseInt(id) },
			data: {
				bezeichnung,
				startDatum: start,
				endDatum: end
			}
		});

		return json(zeitraum);
	} catch (error: any) {
		console.error('Fehler beim Aktualisieren des Zeitraums:', error);
		if (error.code === 'P2002') {
			return json(
				{ error: 'Ein Zeitraum mit dieser Bezeichnung existiert bereits' },
				{ status: 400 }
			);
		}
		return json({ error: 'Serverfehler' }, { status: 500 });
	}
};

export const DELETE: RequestHandler = async ({ url, cookies }) => {
	const adminAuth = cookies.get('admin-auth');
	if (adminAuth !== 'authenticated') {
		return json({ error: 'Nicht autorisiert' }, { status: 401 });
	}

	try {
		const id = url.searchParams.get('id');
		if (!id) {
			return json({ error: 'ID erforderlich' }, { status: 400 });
		}

		// ZeitraumPlaetze werden automatisch durch onDelete: Cascade gelöscht
		await prisma.praktikumszeitraum.delete({
			where: { id: parseInt(id) }
		});

		return json({ success: true });
	} catch (error) {
		console.error('Fehler beim Löschen des Zeitraums:', error);
		return json({ error: 'Serverfehler' }, { status: 500 });
	}
};
