"use server";

import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { prisma } from "@/lib/prisma";
import { requirePermission } from "@/lib/permissions";

const INVENTORY_BASE = "/iv-manage-84x2/inventory";

export async function createWarehouse(formData: FormData) {
  await requirePermission("inventory", "add");
  const name = String(formData.get("name") ?? "").trim();
  const location = String(formData.get("location") ?? "").trim() || null;
  const notes = String(formData.get("notes") ?? "").trim() || null;
  if (!name) redirect(`${INVENTORY_BASE}/warehouses?error=Name+is+required`);

  await prisma.warehouse.create({ data: { name, location, notes } });
  revalidatePath(`${INVENTORY_BASE}/warehouses`);
  revalidatePath(`${INVENTORY_BASE}/transfers`);
  redirect(`${INVENTORY_BASE}/warehouses?success=Warehouse+added.`);
}

export async function deleteWarehouse(id: string) {
  await requirePermission("inventory", "delete");
  await prisma.warehouse.delete({ where: { id } });
  revalidatePath(`${INVENTORY_BASE}/warehouses`);
  revalidatePath(`${INVENTORY_BASE}/transfers`);
  redirect(`${INVENTORY_BASE}/warehouses?success=Warehouse+deleted.`);
}

export async function adjustStock(formData: FormData) {
  await requirePermission("inventory", "add");
  const productId = String(formData.get("productId") ?? "");
  const delta = Math.trunc(Number(formData.get("delta") ?? 0));
  const reason = String(formData.get("reason") ?? "").trim() || null;

  if (!productId || !delta) {
    redirect(`${INVENTORY_BASE}/adjustments?error=Pick+a+product+and+a+non-zero+quantity`);
  }

  const product = await prisma.product.findUnique({ where: { id: productId } });
  if (!product) redirect(`${INVENTORY_BASE}/adjustments?error=Product+not+found`);

  const currentStock = product!.stock ?? 0;
  const newStock = Math.max(0, currentStock + delta);

  await prisma.$transaction([
    prisma.product.update({ where: { id: productId }, data: { stock: newStock } }),
    prisma.stockMovement.create({
      data: { productId, type: "adjustment", quantity: delta, reason },
    }),
  ]);

  revalidatePath(`${INVENTORY_BASE}/adjustments`);
  revalidatePath(`${INVENTORY_BASE}`);
  revalidatePath(`${INVENTORY_BASE}/low-stock`);
  revalidatePath("/iv-manage-84x2/stock");
  redirect(`${INVENTORY_BASE}/adjustments?success=Stock+adjusted.`);
}

export async function markDamagedStock(formData: FormData) {
  await requirePermission("inventory", "add");
  const productId = String(formData.get("productId") ?? "");
  const quantity = Math.max(0, Math.trunc(Number(formData.get("quantity") ?? 0)));
  const reason = String(formData.get("reason") ?? "").trim() || null;

  if (!productId || !quantity) {
    redirect(`${INVENTORY_BASE}/damaged?error=Pick+a+product+and+a+quantity+greater+than+0`);
  }

  const product = await prisma.product.findUnique({ where: { id: productId } });
  if (!product) redirect(`${INVENTORY_BASE}/damaged?error=Product+not+found`);

  const currentStock = product!.stock ?? 0;
  const newStock = Math.max(0, currentStock - quantity);

  await prisma.$transaction([
    prisma.product.update({ where: { id: productId }, data: { stock: newStock } }),
    prisma.stockMovement.create({
      data: { productId, type: "damaged", quantity: -quantity, reason },
    }),
  ]);

  revalidatePath(`${INVENTORY_BASE}/damaged`);
  revalidatePath(`${INVENTORY_BASE}`);
  revalidatePath(`${INVENTORY_BASE}/low-stock`);
  revalidatePath("/iv-manage-84x2/stock");
  redirect(`${INVENTORY_BASE}/damaged?success=Damaged+stock+recorded.`);
}

export async function transferStock(formData: FormData) {
  await requirePermission("inventory", "add");
  const productId = String(formData.get("productId") ?? "");
  const quantity = Math.max(0, Math.trunc(Number(formData.get("quantity") ?? 0)));
  const fromWarehouseId = String(formData.get("fromWarehouseId") ?? "").trim() || null;
  const toWarehouseId = String(formData.get("toWarehouseId") ?? "").trim() || null;
  const reason = String(formData.get("reason") ?? "").trim() || null;

  if (!productId || !quantity || !fromWarehouseId || !toWarehouseId) {
    redirect(`${INVENTORY_BASE}/transfers?error=Fill+in+product%2C+quantity%2C+and+both+warehouses`);
  }
  if (fromWarehouseId === toWarehouseId) {
    redirect(`${INVENTORY_BASE}/transfers?error=From+and+to+warehouse+must+be+different`);
  }

  await prisma.stockMovement.create({
    data: { productId, type: "transfer", quantity, reason, fromWarehouseId, toWarehouseId },
  });

  revalidatePath(`${INVENTORY_BASE}/transfers`);
  redirect(`${INVENTORY_BASE}/transfers?success=Stock+transfer+recorded.`);
}
