"use server";

import { revalidatePath } from "next/cache";
import { prisma } from "@/lib/prisma";
import { logActivity } from "@/lib/activity";
import { actor, removing } from "./guard";

export async function saveAgent(formData: FormData) {
  const id = String(formData.get("id") ?? "");
  const user = await actor("fleet", id ? "edit" : "create", formData);
  const data = {
    firstName: String(formData.get("firstName") ?? "").trim(),
    lastName: String(formData.get("lastName") ?? "").trim(),
    phone: String(formData.get("phone") ?? "").trim(),
    region: String(formData.get("region") ?? ""),
    address: String(formData.get("address") ?? "").trim(),
    latitude: formData.get("latitude") ? Number(formData.get("latitude")) : null,
    longitude: formData.get("longitude") ? Number(formData.get("longitude")) : null,
    vehicleId: String(formData.get("vehicleId") ?? "") || null,
    active: formData.get("active") === "on" || !id,
  };
  if (id) {
    await prisma.deliveryAgent.update({ where: { id }, data });
    await logActivity(user, "fleet", "edit", `${data.firstName} ${data.lastName}`, id);
    revalidatePath(`/fleet/${id}`);
  } else {
    const created = await prisma.deliveryAgent.create({ data });
    await logActivity(user, "fleet", "create", `${data.firstName} ${data.lastName}`, created.id);
  }
  revalidatePath("/fleet");
}

export async function toggleAgent(id: string, active: boolean, formData: FormData) {
  const user = await actor("fleet", "edit", formData);
  const agent = await prisma.deliveryAgent.update({ where: { id }, data: { active } });
  await logActivity(user, "fleet", "edit", `${agent.firstName} ${agent.lastName}`, id, String(!active), String(active));
  revalidatePath("/fleet");
}

export async function deleteAgent(id: string, formData: FormData) {
  const user = await actor("fleet", "delete", formData);
  const existing = await prisma.deliveryAgent.findUnique({ where: { id } });
  const agent = await removing(`${existing?.firstName} ${existing?.lastName}`, () =>
    prisma.deliveryAgent.delete({ where: { id } }),
  );
  await logActivity(user, "fleet", "delete", `${agent.firstName} ${agent.lastName}`, id);
  revalidatePath("/fleet");
}

export async function saveVehicle(formData: FormData) {
  const id = String(formData.get("id") ?? "");
  const user = await actor("fleet", id ? "edit" : "create", formData);
  const data = {
    type: String(formData.get("type") ?? ""),
    make: String(formData.get("make") ?? ""),
    registration: String(formData.get("registration") ?? "").trim(),
    capacity: String(formData.get("capacity") ?? ""),
    active: formData.get("active") === "on" || !id,
  };
  if (id) {
    const previous = await prisma.vehicle.findUnique({ where: { id } });
    await prisma.vehicle.update({ where: { id }, data });
    const before = previous ? `${previous.type} · ${previous.make} · ${previous.registration} · ${previous.capacity}` : undefined;
    await logActivity(user, "fleet", "edit", data.registration, id, before, `${data.type} · ${data.make} · ${data.registration} · ${data.capacity}`);
    revalidatePath(`/fleet/trucks/${id}`);
  } else {
    const created = await prisma.vehicle.create({ data });
    await logActivity(user, "fleet", "create", data.registration, created.id);
  }
  revalidatePath("/fleet");
}

export async function toggleVehicle(id: string, active: boolean, formData: FormData) {
  const user = await actor("fleet", "edit", formData);
  const vehicle = await prisma.vehicle.update({ where: { id }, data: { active } });
  await logActivity(user, "fleet", "edit", vehicle.registration, id, String(!active), String(active));
  revalidatePath("/fleet");
  revalidatePath(`/fleet/trucks/${id}`);
}

export async function deleteVehicle(id: string, formData: FormData) {
  const user = await actor("fleet", "delete", formData);
  const existing = await prisma.vehicle.findUnique({ where: { id } });
  const vehicle = await removing(existing?.registration ?? "This truck", () =>
    prisma.vehicle.delete({ where: { id } }),
  );
  await logActivity(user, "fleet", "delete", vehicle.registration, id);
  revalidatePath("/fleet");
}
