"use server";

import { unlink } from "fs/promises";
import { revalidatePath } from "next/cache";
import { hasPermission } from "@/lib/adminAuth";
import { getSessionClientId } from "@/lib/auth";
import { connectDB } from "@/lib/db";
import { Expense, EXPENSE_CATEGORIES, type ExpenseCategory } from "@/models/Expense";
import { saveReceipt, receiptUploadPath } from "@/lib/uploads";

type ExpenseFormState = { error?: string };

export async function createExpenseAction(_prev: ExpenseFormState, formData: FormData): Promise<ExpenseFormState> {
  if (!(await hasPermission("expenses_create"))) return { error: "Keine Berechtigung." };
  const createdBy = await getSessionClientId();
  if (!createdBy) return { error: "Nicht eingeloggt." };

  const dateRaw = String(formData.get("date") || "");
  const date = dateRaw ? new Date(dateRaw) : null;
  const description = String(formData.get("description") || "").trim();
  const amount = Number(formData.get("amount") || 0);
  const vatAmount = Number(formData.get("vatAmount") || 0);
  const categoryRaw = String(formData.get("category") || "other");
  const category = (EXPENSE_CATEGORIES.includes(categoryRaw as ExpenseCategory) ? categoryRaw : "other") as ExpenseCategory;

  if (!date || Number.isNaN(date.getTime())) return { error: "Bitte ein gültiges Datum angeben." };
  if (!description) return { error: "Bitte eine Beschreibung angeben." };
  if (!Number.isFinite(amount) || amount <= 0) return { error: "Bitte einen gültigen Betrag angeben." };

  await connectDB();
  const expense = await Expense.create({
    date,
    category,
    description,
    amount,
    vatAmount: Number.isFinite(vatAmount) && vatAmount > 0 ? vatAmount : 0,
    createdBy,
  });

  const receiptFile = formData.get("receipt");
  if (receiptFile instanceof File && receiptFile.size > 0) {
    try {
      const { storedName } = await saveReceipt(String(expense._id), receiptFile);
      expense.receiptFilename = receiptFile.name.slice(0, 200);
      expense.receiptStoredName = storedName;
      await expense.save();
    } catch (err) {
      return { error: err instanceof Error ? err.message : "Beleg-Upload fehlgeschlagen." };
    }
  }

  revalidatePath("/de/admin/expenses");
  revalidatePath("/de/admin/statistics");
  return {};
}

export async function deleteExpenseAction(expenseId: string) {
  if (!(await hasPermission("expenses_delete"))) return;
  await connectDB();
  const expense = await Expense.findById(expenseId);
  if (!expense) return;

  if (expense.receiptStoredName) {
    try {
      await unlink(receiptUploadPath(String(expense._id), expense.receiptStoredName));
    } catch {
      // Datei war schon weg — nicht schlimm.
    }
  }
  await expense.deleteOne();
  revalidatePath("/de/admin/expenses");
  revalidatePath("/de/admin/statistics");
}
