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) {
  try {
    const session = await getServerSession(authOptions);
    if (!session) {
      return NextResponse.json({ error: 'No autorizado' }, { status: 401 });
    }

    const { searchParams } = new URL(request.url);
    const alumnoId = searchParams.get('alumnoId');
    const mes = searchParams.get('mes');
    const ano = searchParams.get('ano');

    const where: any = {};
    
    if (alumnoId) where.alumnoId = alumnoId;
    if (mes && ano) {
      const startDate = new Date(parseInt(ano), parseInt(mes) - 1, 1);
      const endDate = new Date(parseInt(ano), parseInt(mes), 0);
      where.fecha = {
        gte: startDate,
        lte: endDate
      };
    } else if (ano) {
      const startDate = new Date(parseInt(ano), 0, 1);
      const endDate = new Date(parseInt(ano), 11, 31);
      where.fecha = {
        gte: startDate,
        lte: endDate
      };
    }

    const pagos = await prisma.pagoDetalle.findMany({
      where,
      include: {
        alumno: {
          include: {
            usuario: {
              select: {
                nombres: true,
                apellidos: true,
                rut: true
              }
            }
          }
        }
      },
      orderBy: { fecha: 'desc' }
    });

    // Calcular totales
    const totalRecaudado = pagos.reduce((sum: number, p: { monto: number }) => sum + p.monto, 0);

    return NextResponse.json({
      pagos,
      totalRecaudado,
      cantidadPagos: pagos.length
    });
  } catch (error) {
    console.error('Error fetching pagos:', error);
    return NextResponse.json({ error: 'Error al obtener pagos' }, { status: 500 });
  }
}

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

    const userRol = (session.user as any).rol;
    if (!['COORDINADOR', 'PROFESOR'].includes(userRol)) {
      return NextResponse.json({ error: 'No tienes permisos para registrar pagos' }, { status: 403 });
    }

    const body = await request.json();
    const { alumnoId, monto, concepto, metodoPago, fecha } = body;

    if (!alumnoId || !monto || !concepto || !metodoPago) {
      return NextResponse.json({ error: 'Faltan campos requeridos' }, { status: 400 });
    }

    const pago = await prisma.pagoDetalle.create({
      data: {
        alumnoId,
        monto: parseFloat(monto),
        concepto,
        metodoPago,
        fecha: fecha ? new Date(fecha) : new Date()
      },
      include: {
        alumno: {
          include: {
            usuario: {
              select: {
                nombres: true,
                apellidos: true
              }
            }
          }
        }
      }
    });

    return NextResponse.json(pago, { status: 201 });
  } catch (error) {
    console.error('Error creating pago:', error);
    return NextResponse.json({ error: 'Error al registrar pago' }, { status: 500 });
  }
}
