import { NextRequest, NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "../../../../auth/[...nextauth]/route";
import { prisma } from "@/lib/prisma";

// PUT /api/categories/config/payment-methods/[id]
export async function PUT(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await getServerSession(authOptions);
    if (!session || !session.user || session.user.role !== "ADMIN") {
      return NextResponse.json({ error: "No autorizado" }, { status: 403 });
    }

    const { id } = await params;
    const { name } = await request.json();

    if (!name || name.trim() === "") {
      return NextResponse.json({ error: "El nombre es obligatorio" }, { status: 400 });
    }

    // Check if name already exists for a different ID
    const existing = await prisma.paymentMethod.findUnique({
      where: { name: name.trim() }
    });

    if (existing && existing.id !== id) {
      return NextResponse.json({ error: "Ya existe esta forma de pago" }, { status: 400 });
    }

    const updatedMethod = await prisma.paymentMethod.update({
      where: { id },
      data: { name: name.trim() }
    });

    return NextResponse.json(updatedMethod);
  } catch (error) {
    return NextResponse.json(
      { error: "Error al actualizar forma de pago" },
      { status: 500 }
    );
  }
}

// DELETE /api/categories/config/payment-methods/[id]
export async function DELETE(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await getServerSession(authOptions);
    if (!session || !session.user || session.user.role !== "ADMIN") {
      return NextResponse.json({ error: "No autorizado" }, { status: 403 });
    }

    const { id } = await params;
    const paymentMethod = await prisma.paymentMethod.findUnique({ where: { id } });

    if (!paymentMethod) {
      return NextResponse.json({ error: "Forma de pago no encontrada" }, { status: 404 });
    }

    const inUseCount = await prisma.category.count({
      where: { paymentMethod: paymentMethod.name }
    });

    if (inUseCount > 0) {
      return NextResponse.json(
        { error: `No se puede eliminar. Está en uso por ${inUseCount} categoría(s)` },
        { status: 409 }
      );
    }

    await prisma.paymentMethod.delete({
      where: { id }
    });

    return NextResponse.json({ success: true });
  } catch (error) {
    return NextResponse.json(
      { error: "Error al eliminar forma de pago" },
      { status: 500 }
    );
  }
}
