import { auth } from "@/lib/auth";
import { db } from "@/lib/db";
import { pagos, historialCambios } from "@/lib/schema";
import { eq } from "drizzle-orm";

export async function PUT(req: Request, { params }: { params: Promise<{ id: string }> }) {
  const session = await auth();
  if (!session) return Response.json({ error: "Unauthorized" }, { status: 401 });
  if (session.user.role !== "admin") return Response.json({ error: "Forbidden" }, { status: 403 });

  const { id } = await params;
  const numId = parseInt(id);
  if (isNaN(numId) || numId <= 0) return Response.json({ error: "Invalid ID" }, { status: 400 });

  const body = await req.json();
  const { periodo, monto, fechaPago, notas } = body;

  const [existing] = await db.select({
    id: pagos.id,
    periodo: pagos.periodo,
    monto: pagos.monto,
    fechaPago: pagos.fechaPago,
    notas: pagos.notas,
  }).from(pagos).where(eq(pagos.id, numId)).limit(1);

  if (!existing) return Response.json({ error: "Not found" }, { status: 404 });

  const changes = [
    { field: 'periodo', old: existing.periodo, new: periodo },
    { field: 'monto', old: existing.monto, new: monto },
    { field: 'fechaPago', old: existing.fechaPago, new: fechaPago },
    { field: 'notas', old: existing.notas, new: notas },
  ];

  for (const c of changes) {
    if (c.new !== undefined && c.new !== c.old) {
      await db.insert(historialCambios).values({
        tabla: 'pagos',
        registroId: numId,
        campo: c.field,
        valorAnterior: String(c.old ?? ''),
        valorNuevo: String(c.new ?? ''),
        usuario: session.user.name,
      });
    }
  }

  const [updated] = await db.update(pagos)
    .set({ periodo, monto, fechaPago, notas })
    .where(eq(pagos.id, numId))
    .returning({
      id: pagos.id,
      periodo: pagos.periodo,
      monto: pagos.monto,
      fechaPago: pagos.fechaPago,
      notas: pagos.notas,
    });

  return Response.json(updated);
}

export async function DELETE(req: Request, { params }: { params: Promise<{ id: string }> }) {
  const session = await auth();
  if (!session) return Response.json({ error: "Unauthorized" }, { status: 401 });
  if (session.user.role !== "admin") return Response.json({ error: "Forbidden" }, { status: 403 });

  const { id } = await params;
  const numId = parseInt(id);
  if (isNaN(numId) || numId <= 0) return Response.json({ error: "Invalid ID" }, { status: 400 });

  const [existing] = await db.select({
    id: pagos.id,
    periodo: pagos.periodo,
    monto: pagos.monto,
  }).from(pagos).where(eq(pagos.id, numId)).limit(1);

  if (!existing) return Response.json({ error: "Not found" }, { status: 404 });

  await db.insert(historialCambios).values({
    tabla: 'pagos',
    registroId: numId,
    campo: 'eliminado',
    valorAnterior: `${existing.periodo} - $${existing.monto}`,
    valorNuevo: '',
    usuario: session.user.name,
  });

  await db.delete(pagos).where(eq(pagos.id, numId));
  return Response.json({ success: true });
}
