import { NextResponse } from "next/server";

import {
  employeeScopeFromAccess,
  requirePermission,
} from "@/lib/authorization";
import { getEmployeByCos } from "@/services/employes.service";
import {
  createProcedure,
  listProceduresForEmployee,
} from "@/services/procedures.service";
import { procedureRequestCreateSchema } from "@/validators/procedures";

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

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

async function visibleEmployee(cos: number, access: Parameters<typeof employeeScopeFromAccess>[0]) {
  return getEmployeByCos(cos, employeeScopeFromAccess(access));
}

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

  const cos = parseCos((await params).cos);
  if (cos === null) {
    return NextResponse.json({ message: "COS invalide" }, { status: 400 });
  }

  if (!(await visibleEmployee(cos, auth.access))) {
    return NextResponse.json({ message: "Salarié introuvable" }, { status: 404 });
  }

  const items = await listProceduresForEmployee(cos);
  return NextResponse.json({ items });
}

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

  const cos = parseCos((await params).cos);
  if (cos === null) {
    return NextResponse.json({ message: "COS invalide" }, { status: 400 });
  }

  if (!(await visibleEmployee(cos, auth.access))) {
    return NextResponse.json({ message: "Salarié introuvable" }, { status: 404 });
  }

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

  const item = await createProcedure(cos, parsed.data, auth.principal.id);
  return NextResponse.json({ item }, { status: 201 });
}
