import { NextResponse } from "next/server";

import { createAvenantFeed, getAvenantsFeed } from "@/server/avenants.server";
import { requireAuth } from "@/lib/requireAuth";
import { avenantCreateSchema, avenantListQuerySchema } from "@/validators/avenants";

export async function GET(request: Request) {
  const authError = requireAuth(request);

  if (authError) {
    return authError;
  }
  const url = new URL(request.url);
  const parsed = avenantListQuerySchema.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 getAvenantsFeed(parsed.data.limit, parsed.data.offset);

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

export async function POST(request: Request) {
  const authError = requireAuth(request);

  if (authError) {
    return authError;
  }
  let body: unknown;

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

  const parsed = avenantCreateSchema.safeParse(body);

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

  const data = await createAvenantFeed(parsed.data);

  if (!data.avenant && data.error === "CONTRAT_NOT_FOUND") {
    return NextResponse.json(
      { message: "Contrat not found for the provided id_contrat" },
      { status: 404 },
    );
  }

  return NextResponse.json(
    {
      message: "Avenant created successfully",
      ...data,
    },
    { status: 201 },
  );
}
