﻿import { NextResponse } from "next/server";

import {
  createEmployeFeed,
  getEmployesFeed,
} from "../../../server/employes.server";
import {
  employeeScopeFromAccess,
  requirePermission,
} from "@/lib/authorization";
import {
  employeCreateSchema,
  employeListQuerySchema,
} from "../../../validators/employes";

type PrismaErrorWithCode = {
  code?: string;
};

function hasPrismaCode(
  error: unknown,
  code: string,
): error is PrismaErrorWithCode {
  return (
    typeof error === "object" &&
    error !== null &&
    "code" in error &&
    (error as PrismaErrorWithCode).code === code
  );
}

export async function GET(request: Request) {
  const auth = await requirePermission(request, "dashboard", "read");

  if (!auth.ok) return auth.response;
  const url = new URL(request.url);
  const parsed = employeListQuerySchema.safeParse({
    limit: url.searchParams.get("limit") ?? undefined,
    offset: url.searchParams.get("offset") ?? undefined,
  });

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

  const data = await getEmployesFeed(
    parsed.data.limit,
    parsed.data.offset,
    employeeScopeFromAccess(auth.access),
  );

  return NextResponse.json({
    message: "Employes retrieved successfully",
    ...data,
  });
}

export async function POST(request: Request) {
  const auth = await requirePermission(request, "etat_civil", "write");

  if (!auth.ok) return auth.response;
  let body: unknown;

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

  const parsed = employeCreateSchema.safeParse(body);

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


  try {
    const data = await createEmployeFeed(parsed.data);

    return NextResponse.json(
      {
        message: "Employe created successfully",
        ...data,
      },
      { status: 201 },
    );
  } catch (error) {
    if (hasPrismaCode(error, "P2002")) {
      return NextResponse.json(
        {
          message: "Un salarié utilise déjà ce code COS.",
        },
        { status: 409 },
      );
    }

    console.error("Erreur lors de la création du salarié :", error);

    return NextResponse.json(
      {
        message: "Erreur interne lors de la création du salarié.",
      },
      { status: 500 },
    );
  }
}
