// src/routes/api/admin/export/+server.ts

import { json } from '@sveltejs/kit';
import { PrismaClient } from '@prisma/client';
import ExcelJS from 'exceljs';

const prisma = new PrismaClient();

export async function GET({ url }) {
	try {
		const zeitraumId = url.searchParams.get('zeitraumId');

		if (!zeitraumId) {
			return json({ error: 'Zeitraum-ID erforderlich' }, { status: 400 });
		}

		// Zeitraum laden für Dateinamen
		const zeitraum = await prisma.praktikumszeitraum.findUnique({
			where: { id: parseInt(zeitraumId) }
		});

		if (!zeitraum) {
			return json({ error: 'Zeitraum nicht gefunden' }, { status: 404 });
		}

		// Angenommene Anmeldungen für diesen Zeitraum laden
		const anmeldungen = await prisma.anmeldung.findMany({
			where: {
				praktikumId: parseInt(zeitraumId),
				status: 'ANGENOMMEN'
			},
			include: {
				zugewiesen: true,
				praktikum: true
			},
			orderBy: [{ zugewiesen: { name: 'asc' } }, { nachname: 'asc' }]
		});

		// Excel-Datei erstellen
		const workbook = new ExcelJS.Workbook();
		workbook.creator = 'Praktikumsverwaltung';
		workbook.created = new Date();

		const worksheet = workbook.addWorksheet('Angenommene Anmeldungen');

		// Spalten definieren (inkl. Notfallkontakt)
		worksheet.columns = [
			{ header: 'Dienststelle', key: 'dienststelle', width: 30 },
			{ header: 'Anrede', key: 'anrede', width: 10 },
			{ header: 'Vorname', key: 'vorname', width: 15 },
			{ header: 'Nachname', key: 'nachname', width: 15 },
			{ header: 'Geburtsdatum', key: 'geburtsdatum', width: 12 },
			{ header: 'Alter', key: 'alter', width: 8 },
			{ header: 'Straße', key: 'strasse', width: 20 },
			{ header: 'Hausnr.', key: 'hausnummer', width: 10 },
			{ header: 'PLZ', key: 'plz', width: 8 },
			{ header: 'Ort', key: 'ort', width: 15 },
			{ header: 'Telefon', key: 'telefon', width: 18 },
			{ header: 'E-Mail', key: 'email', width: 30 },
			{ header: 'Schulart', key: 'schulart', width: 15 },
			{ header: 'Klasse', key: 'schulklasse', width: 8 },
			{ header: 'Note Deutsch', key: 'noteDeutsch', width: 12 },
			{ header: 'Note Mathe', key: 'noteMathe', width: 12 },
			{ header: 'Sozialverhalten', key: 'sozialverhalten', width: 35 },
			{ header: 'Notfall Vorname', key: 'notfallVorname', width: 15 },
			{ header: 'Notfall Nachname', key: 'notfallNachname', width: 15 },
			{ header: 'Notfall Telefon', key: 'notfallTelefon', width: 18 },
			{ header: 'Angenommen am', key: 'processedAt', width: 15 }
		];

		// Header-Zeile formatieren
		const headerRow = worksheet.getRow(1);
		headerRow.font = { bold: true, color: { argb: 'FFFFFFFF' } };
		headerRow.fill = {
			type: 'pattern',
			pattern: 'solid',
			fgColor: { argb: 'FF4472C4' }
		};
		headerRow.alignment = { vertical: 'middle', horizontal: 'center' };
		headerRow.height = 25;

		// Notfallkontakt-Spalten orange hervorheben
		['R1', 'S1', 'T1'].forEach((cell) => {
			worksheet.getCell(cell).fill = {
				type: 'pattern',
				pattern: 'solid',
				fgColor: { argb: 'FFED7D31' }
			};
		});

		// Daten einfügen
		anmeldungen.forEach((anmeldung) => {
			worksheet.addRow({
				dienststelle: anmeldung.zugewiesen?.name || 'Nicht zugewiesen',
				anrede: anmeldung.anrede,
				vorname: anmeldung.vorname,
				nachname: anmeldung.nachname,
				geburtsdatum: anmeldung.geburtsdatum,
				alter: anmeldung.alter,
				strasse: anmeldung.strasse,
				hausnummer: anmeldung.hausnummer,
				plz: anmeldung.plz,
				ort: anmeldung.ort,
				telefon: anmeldung.telefon,
				email: anmeldung.email,
				schulart: formatSchulart(anmeldung.schulart),
				schulklasse: anmeldung.schulklasse,
				noteDeutsch: anmeldung.noteDeutsch,
				noteMathe: anmeldung.noteMathe,
				sozialverhalten: anmeldung.sozialverhalten || '-',
				notfallVorname: anmeldung.notfallVorname || '-',
				notfallNachname: anmeldung.notfallNachname || '-',
				notfallTelefon: anmeldung.notfallTelefon || '-',
				processedAt: anmeldung.processedAt
					? new Date(anmeldung.processedAt).toLocaleDateString('de-DE')
					: '-'
			});
		});

		// Datenzeilen formatieren
		for (let i = 2; i <= anmeldungen.length + 1; i++) {
			const row = worksheet.getRow(i);
			row.alignment = { vertical: 'middle' };

			// Abwechselnde Zeilenfarben
			if (i % 2 === 0) {
				row.fill = {
					type: 'pattern',
					pattern: 'solid',
					fgColor: { argb: 'FFF2F2F2' }
				};
			}
		}

		// Rahmen für alle Zellen
		worksheet.eachRow((row, rowNumber) => {
			row.eachCell((cell) => {
				cell.border = {
					top: { style: 'thin', color: { argb: 'FFD0D0D0' } },
					left: { style: 'thin', color: { argb: 'FFD0D0D0' } },
					bottom: { style: 'thin', color: { argb: 'FFD0D0D0' } },
					right: { style: 'thin', color: { argb: 'FFD0D0D0' } }
				};
			});
		});

		// Filter aktivieren (angepasst auf neue Spaltenanzahl: A bis U = 21 Spalten)
		worksheet.autoFilter = {
			from: 'A1',
			to: `U${anmeldungen.length + 1}`
		};

		// Zusammenfassung am Ende
		const summaryRow = worksheet.addRow([]);
		const totalRow = worksheet.addRow([
			`Gesamt: ${anmeldungen.length} angenommene Anmeldungen`,
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			'',
			''
		]);
		totalRow.font = { bold: true };

		// Excel-Datei als Buffer generieren
		const buffer = await workbook.xlsx.writeBuffer();

		// Dateiname generieren
		const dateiname = `Praktikanten_${zeitraum.bezeichnung.replace(/[^a-zA-Z0-9]/g, '_')}_${new Date().toISOString().split('T')[0]}.xlsx`;

		// Als Download zurückgeben
		return new Response(buffer, {
			status: 200,
			headers: {
				'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
				'Content-Disposition': `attachment; filename="${dateiname}"`,
				'Content-Length': buffer.byteLength.toString()
			}
		});
	} catch (error) {
		console.error('Fehler beim Exportieren:', error);
		return json(
			{ error: 'Fehler beim Exportieren', details: (error as Error).message },
			{ status: 500 }
		);
	}
}

// Hilfsfunktion: Schulart formatieren
function formatSchulart(schulart: string): string {
	const schulartMap: Record<string, string> = {
		Gymnasium: 'Gymnasium',
		KGS_Gymnasialzweig: 'KGS Gymnasialzweig',
		Fachoberschule: 'Fachoberschule',
		Realschule: 'Realschule',
		KGSR: 'KGS Realschulzweig',
		IGSR: 'IGS Realschulzweig'
	};

	return schulartMap[schulart] || schulart;
}
