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

export async function GET(
  request: NextRequest,
  { params }: { params: { id: string } }
) {
  try {
    const session = await getServerSession(authOptions)
    
    if (!session?.user) {
      return NextResponse.json({ error: 'No autorizado' }, { status: 401 })
    }

    const { id } = params
    const userRole = (session.user as { rol?: string }).rol
    const userRut = (session.user as { rut?: string }).rut

    // Obtener el alumno con toda su información
    const alumno = await prisma.alumno.findUnique({
      where: { id },
      include: {
        usuario: {
          include: {
            escuela: true
          }
        },
        apoderado: true,
        evaluacionesFisicas: {
          orderBy: { fecha: 'desc' },
          take: 10,
          include: {
            evaluador: true
          }
        },
        evaluacionesDeportivas: {
          orderBy: { fecha: 'desc' },
          take: 10,
          include: {
            evaluador: true
          }
        },
        objetivos: {
          orderBy: { fechaCreacion: 'desc' },
          include: {
            profesor: true
          }
        },
        pagos: {
          orderBy: { fecha: 'desc' },
          take: 20
        }
      }
    })

    if (!alumno) {
      return NextResponse.json({ error: 'Alumno no encontrado' }, { status: 404 })
    }

    // Verificar permisos: COORDINADOR, PROFESOR, o el propio alumno/apoderado
    const isCoordinadorOrProfesor = userRole === 'COORDINADOR' || userRole === 'PROFESOR'
    const isOwnProfile = alumno.usuario.rut === userRut
    const isApoderado = alumno.apoderado.rut === userRut

    if (!isCoordinadorOrProfesor && !isOwnProfile && !isApoderado) {
      return NextResponse.json({ error: 'No tiene permisos para ver este perfil' }, { status: 403 })
    }

    // Obtener estadísticas de asistencia
    const asistencias = await prisma.asistencia.findMany({
      where: { usuarioId: alumno.usuarioId },
      include: {
        evento: true
      }
    })

    const estadisticasAsistencia = {
      total: asistencias.length,
      presentes: asistencias.filter(a => a.presente).length,
      ausentes: asistencias.filter(a => !a.presente).length,
      porTipo: {
        entrenamientos: {
          total: asistencias.filter(a => a.evento.tipo === 'ENTRENAMIENTO').length,
          presentes: asistencias.filter(a => a.evento.tipo === 'ENTRENAMIENTO' && a.presente).length
        },
        amistosos: {
          total: asistencias.filter(a => a.evento.tipo === 'AMISTOSO').length,
          presentes: asistencias.filter(a => a.evento.tipo === 'AMISTOSO' && a.presente).length
        },
        campeonatos: {
          total: asistencias.filter(a => a.evento.tipo === 'CAMPEONATO').length,
          presentes: asistencias.filter(a => a.evento.tipo === 'CAMPEONATO' && a.presente).length
        }
      }
    }

    // Calcular resumen de pagos
    const resumenPagos = {
      totalPagado: alumno.pagos.reduce((sum, p) => sum + p.monto, 0),
      cantidadPagos: alumno.pagos.length,
      ultimoPago: alumno.pagos[0] || null
    }

    // Calcular promedios de evaluaciones
    const promedioFisico = alumno.evaluacionesFisicas.length > 0
      ? alumno.evaluacionesFisicas.reduce((sum, e) => sum + (e.puntajeTotal || 0), 0) / alumno.evaluacionesFisicas.length
      : null

    const promedioDeportivo = alumno.evaluacionesDeportivas.length > 0
      ? alumno.evaluacionesDeportivas.reduce((sum, e) => sum + e.puntajeTotal, 0) / alumno.evaluacionesDeportivas.length
      : null

    // Objetivos activos y completados
    const objetivosActivos = alumno.objetivos.filter(o => !o.completado).length
    const objetivosCompletados = alumno.objetivos.filter(o => o.completado).length

    return NextResponse.json({
      alumno,
      estadisticasAsistencia,
      resumenPagos,
      promedios: {
        fisico: promedioFisico,
        deportivo: promedioDeportivo
      },
      objetivosResumen: {
        activos: objetivosActivos,
        completados: objetivosCompletados,
        total: alumno.objetivos.length
      },
      permisos: {
        esPropio: isOwnProfile,
        esApoderado: isApoderado,
        esProfesorCoordinador: isCoordinadorOrProfesor
      }
    })

  } catch (error) {
    console.error('Error al obtener perfil del alumno:', error)
    return NextResponse.json(
      { error: 'Error interno del servidor' },
      { status: 500 }
    )
  }
}
