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

let prismaPromise: Promise<any> | null = null;

async function getPrismaClient() {
  if (!prismaPromise) {
    prismaPromise = import('@prisma/client').then(({ PrismaClient }) => new PrismaClient());
  }
  return prismaPromise;
}

export const GET: RequestHandler = async ({ url }) => {
  const prisma = await getPrismaClient();
  const zeitraumId = url.searchParams.get('zeitraumId');

  if (zeitraumId) {
    // Dienststellen mit freien Plätzen für einen bestimmten Zeitraum
    const zeitraumIdInt = parseInt(zeitraumId);

    const dienststellen = await prisma.dienststelle.findMany({
      orderBy: { name: 'asc' },
      include: {
        zeitraumPlaetze: {
          where: { zeitraumId: zeitraumIdInt }
        },
        _count: {
          select: {
            zugewiesene: {
              where: {
                praktikumId: zeitraumIdInt,
                status: 'ANGENOMMEN'
              }
            }
          }
        }
      }
    });

    // Berechne freie Plätze pro Dienststelle
    const result = dienststellen.map(d => {
      const gesamtPlaetze = d.zeitraumPlaetze[0]?.plaetze ?? 0;
      const belegtePlaetze = d._count.zugewiesene;
      const freiePlaetze = Math.max(0, gesamtPlaetze - belegtePlaetze);

      return {
        id: d.id,
        name: d.name,
        plaetze: freiePlaetze,
        gesamtPlaetze: gesamtPlaetze,
        belegtePlaetze: belegtePlaetze
      };
    });

    return json(result);
  }

  // Fallback: Alle Dienststellen ohne Zeitraum-Filter (für Admin-Bereich etc.)
  const dienststellen = await prisma.dienststelle.findMany({
    orderBy: { name: 'asc' },
    select: {
      id: true,
      name: true,
      plaetze: true
    }
  });

  return json(dienststellen);
};