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

// GET - Generar reporte completo de un alumno
export async function GET(request: NextRequest) {
  try {
    const session = await getServerSession(authOptions);
    
    if (!session?.user) {
      return NextResponse.json(
        { success: false, error: 'No autorizado' },
        { status: 401 }
      );
    }
    
    const { searchParams } = new URL(request.url);
    const alumnoId = searchParams.get('alumnoId');
    
    if (!alumnoId) {
      return NextResponse.json(
        { success: false, error: 'alumnoId es requerido' },
        { status: 400 }
      );
    }
    
    // Obtener datos del alumno con todas sus relaciones
    const alumnoData = await prisma.alumno.findUnique({
      where: { id: alumnoId },
      include: {
        usuario: {
          include: {
            escuela: true,
            asistencias: {
              orderBy: { fecha: 'desc' },
              take: 20,
              include: {
                evento: true
              }
            }
          }
        },
        apoderado: true,
        evaluacionesFisicas: {
          orderBy: { fecha: 'desc' },
          take: 5,
          include: {
            evaluador: true
          }
        },
        evaluacionesDeportivas: {
          orderBy: { fecha: 'desc' },
          take: 5,
          include: {
            evaluador: true
          }
        },
        objetivos: {
          orderBy: { fechaCreacion: 'desc' },
          include: {
            profesor: true
          }
        },
        pagos: {
          orderBy: { fecha: 'desc' },
          take: 10
        }
      }
    });
    
    if (!alumnoData) {
      return NextResponse.json(
        { success: false, error: 'Alumno no encontrado' },
        { status: 404 }
      );
    }
    
    // Cast to any for complex nested types
    const alumno = alumnoData as any;
    
    // Calcular estadísticas
    const asistencias = alumno.usuario?.asistencias || [];
    const totalAsistencias = asistencias.length;
    const asistenciasPresente = asistencias.filter((a: any) => a.presente).length;
    const porcentajeAsistencia = totalAsistencias > 0 
      ? Math.round((asistenciasPresente / totalAsistencias) * 100) 
      : 0;
    
    const objetivosArr = alumno.objetivos || [];
    const objetivosCompletados = objetivosArr.filter((o: any) => o.completado).length;
    const totalObjetivos = objetivosArr.length;
    
    const evaluacionesFisicas = alumno.evaluacionesFisicas || [];
    const evaluacionesDeportivas = alumno.evaluacionesDeportivas || [];
    const ultimaEvalFisica = evaluacionesFisicas[0];
    const ultimaEvalDeportiva = evaluacionesDeportivas[0];
    
    // Calcular total pagado
    const pagos = alumno.pagos || [];
    const totalPagado = pagos.reduce((sum: number, p: any) => sum + (p.monto || 0), 0);
    
    // Datos de salud están directamente en el modelo Alumno
    const datosSalud = {
      centroSaludNombre: alumno.centroSaludNombre,
      centroSaludUbicacion: alumno.centroSaludUbicacion,
      alergias: alumno.alergias,
      condicionesPreexistentes: alumno.condicionesPreexistentes,
      lesiones: alumno.lesiones,
      electrocardiogramaFecha: alumno.electrocardiogramaFecha,
      seguroEscolar: alumno.seguroEscolar
    };
    
    const usuario = alumno.usuario || {};
    const apoderado = alumno.apoderado;
    const escuela = usuario.escuela || {};
    
    return NextResponse.json({
      success: true,
      reporte: {
        datosPersonales: {
          nombres: usuario.nombres || '',
          apellidos: usuario.apellidos || '',
          rut: usuario.rut || '',
          fechaNacimiento: usuario.fechaNacimiento,
          email: usuario.email || '',
          telefono: usuario.telefono || [],
          direccion: `${usuario.direccionCalle || ''} ${usuario.direccionNumero || ''}, ${usuario.direccionComuna || ''}`,
          categoria: alumno.categoria,
          posicionPreferida: alumno.posicionPrincipal,
          pieHabil: alumno.piernaHabil,
          fechaIngreso: usuario.fechaIngreso
        },
        apoderado: apoderado ? {
          nombre: apoderado.nombre,
          telefono: apoderado.telefonos?.[0] || '',
          email: apoderado.email,
          relacion: apoderado.parentesco
        } : null,
        datosSalud,
        estadisticas: {
          porcentajeAsistencia,
          totalAsistencias,
          asistenciasPresente,
          objetivosCompletados,
          totalObjetivos,
          totalPagado
        },
        ultimaEvaluacionFisica: ultimaEvalFisica ? {
          fecha: ultimaEvalFisica.fecha,
          puntajeAgilidad: ultimaEvalFisica.puntajeAgilidad,
          tiempoVelocidad: ultimaEvalFisica.tiempoVelocidad,
          saltoVertical: ultimaEvalFisica.saltoVertical,
          saltoHorizontal: ultimaEvalFisica.saltoHorizontal,
          evaluador: ultimaEvalFisica.evaluador?.nombres
        } : null,
        ultimaEvaluacionDeportiva: ultimaEvalDeportiva ? {
          fecha: ultimaEvalDeportiva.fecha,
          tecnica: ultimaEvalDeportiva.tecnica,
          fuerza: ultimaEvalDeportiva.fuerza,
          ataque: ultimaEvalDeportiva.ataque,
          defensa: ultimaEvalDeportiva.defensa,
          resistencia: ultimaEvalDeportiva.resistencia,
          velocidad: ultimaEvalDeportiva.velocidad,
          puntajeTotal: ultimaEvalDeportiva.puntajeTotal,
          posicionesPreferentes: ultimaEvalDeportiva.posicionesPreferentes,
          evaluador: ultimaEvalDeportiva.evaluador?.nombres
        } : null,
        objetivos: objetivosArr.map((o: any) => ({
          tipo: o.tipo,
          objetivoFinal: o.objetivoFinal,
          progreso: o.progreso,
          completado: o.completado,
          profesor: o.profesor?.nombres
        })),
        escuela: {
          nombre: escuela.nombre || '',
          telefono: escuela.telefono || '',
          email: escuela.email || ''
        }
      }
    });
    
  } catch (error) {
    console.error('Error generando reporte de alumno:', error);
    return NextResponse.json(
      { success: false, error: 'Error generando reporte' },
      { status: 500 }
    );
  }
}
