import { NextResponse } from "next/server";
import { requireAuth } from "@/lib/requireAuth";
import {
  createAlerte,
  deleteAlerte,
  getAlertesBySalarieId,
  updateAlerte,
} from "@/services/alertes.service";
import {
  alerteCreateSchema,
  alerteUpdateSchema,
} from "@/validators/alertes.validator";

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

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

  if (!Number.isInteger(id) || id <= 0) {
    return null;
  }

  return id;
}

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

  if (authError) {
    return authError;
  }

  const { cos } = await params;
const idSalarie = parseId(cos);

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

  const alertes = await getAlertesBySalarieId(idSalarie);

  return NextResponse.json({
    items: alertes,
  });
}

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

  if (authError) {
    return authError;
  }

  const { cos } = await params;
  const idSalarie = parseId(cos);

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

  const body = await request.json();

  const result = alerteCreateSchema.safeParse({
    ...body,
    id_salarie: idSalarie,
  });

  if (!result.success) {
    return NextResponse.json(
      {
        message: "Invalid alerte data",
        errors: result.error.flatten(),
      },
      { status: 400 },
    );
  }

  const alerte = await createAlerte(idSalarie, {
  libalerte: result.data.libalerte,
  fait: result.data.fait ?? false,
  dateajout: result.data.dateajout ?? new Date(),
});

  return NextResponse.json(
    {
      item: alerte,
    },
    { status: 201 },
  );
}

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

  if (authError) {
    return authError;
  }

  const body = await request.json();
  const id = parseId(String(body.id));

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

  const result = alerteUpdateSchema.safeParse(body);

  if (!result.success) {
    return NextResponse.json(
      {
        message: "Invalid alerte data",
        errors: result.error.flatten(),
      },
      { status: 400 }
    );
  }

  const alerte = await updateAlerte(id, result.data);

  return NextResponse.json({
    item: alerte,
  });
}

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

  if (authError) {
    return authError;
  }

  const { searchParams } = new URL(request.url);
  const id = parseId(searchParams.get("id") ?? "");

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

  await deleteAlerte(id);

  return NextResponse.json({
    message: "Alerte deleted",
  });
}