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

// GET: Listar todos los alumnos
export async function GET(request: NextRequest) {
  try {
    const session = await getServerSession(authOptions);
    
    if (!session || !session.user) {
      return NextResponse.json({ error: 'No autorizado' }, { status: 401 });
    }

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

    const whereClause: any = {};
    if (escuelaId) {
      whereClause.usuario = { escuelaId };
    }
    if (categoria) {
      whereClause.categoria = categoria;
    }

    const alumnos = await prisma.alumno.findMany({
      where: whereClause,
      include: {
        usuario: {
          select: {
            id: true,
            nombres: true,
            apellidos: true,
            nombreCorto: true,
            rut: true,
            email: true,
            telefono: true,
            foto: true,
            activo: true
          }
        },
        apoderado: {
          select: {
            id: true,
            nombres: true,
            apellidos: true,
            telefono: true,
            email: true,
            relacionConAlumno: true
          }
        }
      },
      orderBy: {
        usuario: {
          nombreCorto: 'asc'
        }
      }
    });

    return NextResponse.json({ alumnos, total: alumnos.length });
  } catch (error: any) {
    console.error('Error al obtener alumnos:', error);
    return NextResponse.json({ error: error.message }, { status: 500 });
  }
}

// POST: Crear nuevo alumno
export async function POST(request: NextRequest) {
  try {
    const session = await getServerSession(authOptions);
    
    if (!session || !session.user) {
      return NextResponse.json({ error: 'No autorizado' }, { status: 401 });
    }

    // Solo coordinadores pueden crear alumnos
    if (session.user.rol !== 'COORDINADOR') {
      return NextResponse.json({ error: 'Permisos insuficientes' }, { status: 403 });
    }

    const data = await request.json();
    const { usuario: usuarioData, alumno: alumnoData, apoderado: apoderadoData } = data;

    // Validar datos requeridos
    if (!usuarioData || !alumnoData || !apoderadoData) {
      return NextResponse.json({ error: 'Datos incompletos' }, { status: 400 });
    }

    // Crear alumno con usuario y apoderado en una transacción
    const nuevoAlumno = await prisma.$transaction(async (tx: any) => {
      // Verificar si el RUT ya existe
      const rutExistente = await tx.usuario.findUnique({
        where: { rut: usuarioData.rut }
      });

      if (rutExistente) {
        throw new Error('El RUT ya está registrado');
      }

      // Crear o buscar apoderado
      let apoderado;
      if (apoderadoData.id) {
        apoderado = await tx.apoderado.findUnique({
          where: { id: apoderadoData.id }
        });
      } else {
        apoderado = await tx.apoderado.create({
          data: {
            nombres: apoderadoData.nombres,
            apellidos: apoderadoData.apellidos,
            rut: apoderadoData.rut,
            fechaNacimiento: new Date(apoderadoData.fechaNacimiento),
            direccionCalle: apoderadoData.direccionCalle,
            direccionNumero: apoderadoData.direccionNumero,
            direccionDepto: apoderadoData.direccionDepto,
            direccionComuna: apoderadoData.direccionComuna,
            direccionRegion: apoderadoData.direccionRegion,
            telefono: apoderadoData.telefono,
            email: apoderadoData.email,
            relacionConAlumno: apoderadoData.relacionConAlumno
          }
        });
      }

      // Crear usuario
      const usuario = await tx.usuario.create({
        data: {
          escuelaId: session.user.escuelaId!,
          rut: usuarioData.rut,
          nombres: usuarioData.nombres,
          apellidos: usuarioData.apellidos,
          nombreCorto: `${usuarioData.nombres.split(' ')[0]} ${usuarioData.apellidos.split(' ')[0]}`,
          fechaNacimiento: new Date(usuarioData.fechaNacimiento),
          telefono: usuarioData.telefono || [],
          email: usuarioData.email,
          direccionCalle: usuarioData.direccionCalle,
          direccionNumero: usuarioData.direccionNumero,
          direccionDepto: usuarioData.direccionDepto,
          direccionComuna: usuarioData.direccionComuna,
          direccionRegion: usuarioData.direccionRegion,
          rol: 'ALUMNO',
          clave: usuarioData.clave
        }
      });

      // Crear alumno
      const alumno = await tx.alumno.create({
        data: {
          usuarioId: usuario.id,
          apoderadoId: apoderado.id,
          categoria: alumnoData.categoria,
          apodo: alumnoData.apodo,
          peso: alumnoData.peso,
          altura: alumnoData.altura,
          piernaHabil: alumnoData.piernaHabil,
          tallaCamiseta: alumnoData.tallaCamiseta,
          tallaPantalon: alumnoData.tallaPantalon,
          posicionPrincipal: alumnoData.posicionPrincipal,
          posicionesSecundarias: alumnoData.posicionesSecundarias || [],
          modalidadesFutbol11: alumnoData.modalidadesFutbol11 || [],
          modalidadesFutbol9: alumnoData.modalidadesFutbol9 || [],
          modalidadesFutbol7: alumnoData.modalidadesFutbol7 || [],
          modalidadesFutbol5: alumnoData.modalidadesFutbol5 || [],
          modalidadPago: alumnoData.modalidadPago,
          estadoPagoMatricula: alumnoData.estadoPagoMatricula || 'PENDIENTE'
        },
        include: {
          usuario: true,
          apoderado: true
        }
      });

      return alumno;
    });

    return NextResponse.json({ 
      alumno: nuevoAlumno, 
      message: 'Alumno creado exitosamente' 
    }, { status: 201 });

  } catch (error: any) {
    console.error('Error al crear alumno:', error);
    return NextResponse.json({ error: error.message }, { status: 500 });
  }
}
