import { NextResponse } from "next/server";

import {
  employeeScopeFromAccess,
  requirePermission,
} from "@/lib/authorization";
import { getEmployeByCos } from "@/services/employes.service";
import {
  getProcedureById,
  updateProcedure,
} from "@/services/procedures.service";
import { procedureRequestUpdateSchema } from "@/validators/procedures";

type RouteContext = { params: Promise<{ id: string }> };

function parseId(value: string) {
  const id = Number(value);
  return Number.isInteger(id) && id > 0 ? id : null;
}

async function loadVisibleProcedure(
  id: number,
  access: Parameters<typeof employeeScopeFromAccess>[0],
) {
  const item = await getProcedureById(id);
  if (!item) return null;
  const employee = await getEmployeByCos(
    item.employee_cos,
    employeeScopeFromAccess(access),
  );
  return employee ? item : null;
}

export async function GET(request: Request, { params }: RouteContext) {
  const auth = await requirePermission(request, "autres", "read");
  if (!auth.ok) return auth.response;

  const id = parseId((await params).id);
  if (id === null) {
    return NextResponse.json({ message: "Identifiant invalide" }, { status: 400 });
  }

  const item = await loadVisibleProcedure(id, auth.access);
  return item
    ? NextResponse.json({ item })
    : NextResponse.json({ message: "Demande introuvable" }, { status: 404 });
}

export async function PUT(request: Request, { params }: RouteContext) {
  const auth = await requirePermission(request, "autres", "write");
  if (!auth.ok) return auth.response;

  const id = parseId((await params).id);
  if (id === null) {
    return NextResponse.json({ message: "Identifiant invalide" }, { status: 400 });
  }

  if (!(await loadVisibleProcedure(id, auth.access))) {
    return NextResponse.json({ message: "Demande introuvable" }, { status: 404 });
  }

  const parsed = procedureRequestUpdateSchema.safeParse(
    await request.json().catch(() => null),
  );
  if (!parsed.success) {
    return NextResponse.json(
      { message: "Formulaire invalide", issues: parsed.error.issues },
      { status: 400 },
    );
  }

  const item = await updateProcedure(id, parsed.data, auth.principal.id);
  return NextResponse.json({ item });
}
