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 tipo = searchParams.get('tipo');
    const mes = searchParams.get('mes');
    const ano = searchParams.get('ano');
    const categoria = searchParams.get('categoria');

    const where: any = {};
    
    if (tipo) where.tipo = tipo;
    if (categoria) where.categoria = categoria;
    if (mes) where.mes = parseInt(mes);
    if (ano) where.ano = parseInt(ano);

    const registros = await prisma.registroFinanciero.findMany({
      where,
      include: {
        escuela: true,
        evento: true,
        registrador: {
          select: {
            nombres: true,
            apellidos: true
          }
        }
      },
      orderBy: { fecha: 'desc' }
    });

    // Calcular resumen
    const ingresos = registros.filter((r: { tipo: string }) => r.tipo === 'INGRESO').reduce((sum: number, r: { monto: number }) => sum + r.monto, 0);
    const egresos = registros.filter((r: { tipo: string }) => r.tipo === 'EGRESO').reduce((sum: number, r: { monto: number }) => sum + r.monto, 0);
    const balance = ingresos - egresos;

    return NextResponse.json({
      registros,
      resumen: {
        ingresos,
        egresos,
        balance,
        totalRegistros: registros.length
      }
    });
  } catch (error) {
    console.error('Error fetching registros financieros:', error);
    return NextResponse.json({ error: 'Error al obtener registros' }, { 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 (userRol !== 'COORDINADOR') {
      return NextResponse.json({ error: 'Solo el coordinador puede registrar movimientos financieros' }, { status: 403 });
    }

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

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

    const usuario = await prisma.usuario.findUnique({
      where: { rut: (session.user as any).rut }
    });

    if (!usuario) {
      return NextResponse.json({ error: 'Usuario no encontrado' }, { status: 404 });
    }

    const fechaObj = new Date(fecha);

    const registro = await prisma.registroFinanciero.create({
      data: {
        escuelaId: usuario.escuelaId,
        tipo,
        categoria,
        concepto,
        monto: parseFloat(monto),
        fecha: fechaObj,
        mes: fechaObj.getMonth() + 1,
        ano: fechaObj.getFullYear(),
        metodoPago,
        eventoId,
        alumnoId,
        registradoPor: usuario.id
      },
      include: {
        registrador: {
          select: {
            nombres: true,
            apellidos: true
          }
        }
      }
    });

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