import { NextRequest, NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
import { prisma } from '@/lib/db';

// GET - Obtener lista completa de emergencias por categoría
export async function GET(request: NextRequest) {
  try {
    const session = await getServerSession(authOptions);
    if (!session?.user) {
      return NextResponse.json({ error: 'No autorizado' }, { status: 401 });
    }

    const { searchParams } = new URL(request.url);
    const categoria = searchParams.get('categoria');

    // Obtener alumnos con sus contactos de emergencia y datos de salud
    const alumnosQuery: Record<string, unknown> = {
      usuario: {
        activo: true,
      },
    };
    if (categoria) alumnosQuery.categoria = categoria;

    const alumnos = await prisma.alumno.findMany({
      where: alumnosQuery,
      include: {
        usuario: {
          select: {
            nombres: true,
            apellidos: true,
            telefono: true,
            foto: true,
          },
        },
        apoderado: {
          select: {
            nombres: true,
            apellidos: true,
            telefono: true,
            email: true,
            relacionConAlumno: true,
            otroContactoNombre: true,
            otroContactoTelefono: true,
          },
        },
        contactosEmergencia: {
          orderBy: [{ esPrincipal: 'desc' }, { nombre: 'asc' }],
        },
      },
      orderBy: [
        { categoria: 'asc' },
        { usuario: { apellidos: 'asc' } },
      ],
    });

    // Obtener centros de salud activos
    const centrosSalud = await prisma.centroSalud.findMany({
      where: { activo: true },
      orderBy: { nombre: 'asc' },
    });

    // Formatear respuesta
    const listaEmergencias = alumnos.map((alumno) => ({
      alumnoId: alumno.id,
      nombreCompleto: `${alumno.usuario.nombres} ${alumno.usuario.apellidos}`,
      foto: alumno.usuario.foto,
      categoria: alumno.categoria,
      telefonosAlumno: alumno.usuario.telefono,
      // Datos de salud
      datosSalud: {
        centroSalud: alumno.centroSaludNombre,
        ubicacionCentro: alumno.centroSaludUbicacion,
        alergias: alumno.alergias,
        condiciones: alumno.condicionesPreexistentes,
        lesiones: alumno.lesiones,
        seguroEscolar: alumno.seguroEscolar,
      },
      // Apoderado
      apoderado: {
        nombre: `${alumno.apoderado.nombres} ${alumno.apoderado.apellidos}`,
        relacion: alumno.apoderado.relacionConAlumno,
        telefonos: alumno.apoderado.telefono,
        emails: alumno.apoderado.email,
        contactoAdicional: alumno.apoderado.otroContactoNombre
          ? {
              nombre: alumno.apoderado.otroContactoNombre,
              telefono: alumno.apoderado.otroContactoTelefono,
            }
          : null,
      },
      // Contactos de emergencia adicionales
      contactosEmergencia: alumno.contactosEmergencia.map((c) => ({
        id: c.id,
        nombre: c.nombre,
        relacion: c.relacion,
        telefonoPrincipal: c.telefonoPrincipal,
        telefonoSecundario: c.telefonoSecundario,
        email: c.email,
        esPrincipal: c.esPrincipal,
      })),
    }));

    // Agrupar por categoría
    const porCategoria = listaEmergencias.reduce(
      (acc: Record<string, typeof listaEmergencias>, alumno) => {
        if (!acc[alumno.categoria]) {
          acc[alumno.categoria] = [];
        }
        acc[alumno.categoria].push(alumno);
        return acc;
      },
      {}
    );

    return NextResponse.json({
      listaEmergencias,
      porCategoria,
      centrosSalud,
      totalAlumnos: alumnos.length,
    });
  } catch (error) {
    console.error('Error al obtener lista de emergencias:', error);
    return NextResponse.json({ error: 'Error interno del servidor' }, { status: 500 });
  }
}
