import { NextResponse } from "next/server";

import {
  deleteEtablissement,
  getEtablissementById,
  updateEtablissement,
} from "@/services/reference-lookups.service";
import { requireAuth } from "@/lib/requireAuth";
import { etablissementUpdateSchema } from "@/validators/reference-lookups";

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

function parseId(idParam: string) {
  const id = Number(idParam);

  if (!Number.isInteger(id)) {
    return null;
  }

  return id;
}

export async function GET(_request: Request, { params }: RouteContext) {
  const authError = requireAuth(_request);

  if (authError) {
    return authError;
  }

  const { id: idParam } = await params;
  const id = parseId(idParam);

  if (id === null) {
    return NextResponse.json({ message: "Invalid id parameter" }, { status: 400 });
  }

  const etablissement = await getEtablissementById(id);

  if (!etablissement) {
    return NextResponse.json({ message: "Etablissement not found" }, { status: 404 });
  }

  return NextResponse.json({
    message: "Etablissement retrieved successfully",
    etablissement,
  });
}

export async function PUT(request: Request, { params }: RouteContext) {
  const authError = requireAuth(request);

  if (authError) {
    return authError;
  }

  const { id: idParam } = await params;
  const id = parseId(idParam);

  if (id === null) {
    return NextResponse.json({ message: "Invalid id parameter" }, { status: 400 });
  }

  let body: unknown;

  try {
    body = await request.json();
  } catch {
    return NextResponse.json({ message: "Invalid JSON body" }, { status: 400 });
  }

  const parsed = etablissementUpdateSchema.safeParse(body);

  if (!parsed.success) {
    return NextResponse.json(
      { message: "Invalid body parameters", issues: parsed.error.flatten() },
      { status: 400 },
    );
  }

  let etablissement;

  try {
    etablissement = await updateEtablissement(id, parsed.data);
  } catch {
    return NextResponse.json({ message: "Etablissement not found" }, { status: 404 });
  }

  return NextResponse.json({
    message: "Etablissement updated successfully",
    etablissement,
  });
}

export async function PATCH(request: Request, { params }: RouteContext) {
  const authError = requireAuth(request);

  if (authError) {
    return authError;
  }

  const { id: idParam } = await params;
  const id = parseId(idParam);

  if (id === null) {
    return NextResponse.json({ message: "Invalid id parameter" }, { status: 400 });
  }

  let body: unknown;

  try {
    body = await request.json();
  } catch {
    return NextResponse.json({ message: "Invalid JSON body" }, { status: 400 });
  }

  const parsed = etablissementUpdateSchema.safeParse(body);

  if (!parsed.success) {
    return NextResponse.json(
      { message: "Invalid body parameters", issues: parsed.error.flatten() },
      { status: 400 },
    );
  }

  let etablissement;

  try {
    etablissement = await updateEtablissement(id, parsed.data);
  } catch {
    return NextResponse.json({ message: "Etablissement not found" }, { status: 404 });
  }

  return NextResponse.json({
    message: "Etablissement patched successfully",
    etablissement,
  });
}

export async function DELETE(_request: Request, { params }: RouteContext) {
  const authError = requireAuth(_request);

  if (authError) {
    return authError;
  }

  const { id: idParam } = await params;
  const id = parseId(idParam);

  if (id === null) {
    return NextResponse.json({ message: "Invalid id parameter" }, { status: 400 });
  }

  let etablissement;

  try {
    etablissement = await deleteEtablissement(id);
  } catch {
    return NextResponse.json({ message: "Etablissement not found" }, { status: 404 });
  }

  return NextResponse.json({
    message: "Etablissement deleted successfully",
    etablissement,
  });
}
