"use server";

import { revalidatePath } from "next/cache";
import { hasPermission } from "@/lib/adminAuth";
import { getSessionClientId } from "@/lib/auth";
import { connectDB } from "@/lib/db";
import { Order } from "@/models/Order";
import { bookCredit } from "@/lib/creditLedger";
import { logTeamActivity } from "@/lib/teamActivity";

type FormState = { error?: string; success?: boolean };

export async function manualCreditBookingAction(clientId: string, _prev: FormState, formData: FormData): Promise<FormState> {
  // Bewusst eine eigene, enge Berechtigung — siehe Kommentar bei
  // "credit_booking" in lib/permissions.ts.
  if (!(await hasPermission("credit_booking"))) return { error: "Keine Berechtigung." };

  const amount = Number(String(formData.get("amount") || "").replace(",", "."));
  const reason = String(formData.get("reason") || "").trim();
  const relatedOrderId = String(formData.get("relatedOrderId") || "").trim() || null;

  if (!Number.isFinite(amount) || amount === 0) return { error: "Bitte einen gültigen Betrag ungleich 0 eingeben." };
  if (!reason) return { error: "Bitte einen Grund angeben." };

  await connectDB();

  if (relatedOrderId) {
    const order = await Order.findOne({ _id: relatedOrderId, clientId }).select("_id").lean();
    if (!order) return { error: "Der ausgewählte Auftrag gehört nicht zu diesem Kunden." };
  }

  const staffId = await getSessionClientId();
  const result = await bookCredit({
    clientId,
    amount,
    // Ein verknüpfter Auftrag ist in der Praxis immer eine Storno-
    // Rückerstattung (die andere Buchungsart hier ist die freie manuelle
    // Korrektur/Gutschrift ohne Auftragsbezug).
    type: relatedOrderId ? "cancellation_refund" : "manual_admin",
    reason,
    createdByClientId: staffId,
    relatedOrderId,
  });
  if (result.error) return { error: result.error };

  await logTeamActivity(
    amount > 0 ? "Guthaben gutgeschrieben" : "Guthaben abgebucht",
    `${reason} (${amount > 0 ? "+" : ""}${amount.toFixed(2)} €)`
  );

  revalidatePath(`/de/admin/clients/${clientId}`);
  return { success: true };
}
