"use server";

import { revalidatePath } from "next/cache";
import { hasPermission } from "@/lib/adminAuth";
import { getSessionClientId } from "@/lib/auth";
import { connectDB } from "@/lib/db";
import { Income } from "@/models/Income";

type IncomeFormState = { error?: string };

function revalidateIncomePaths() {
  revalidatePath("/de/admin/expenses");
  revalidatePath("/de/admin/statistics");
  revalidatePath("/de/admin/tax");
}

// Nutzt bewusst dieselbe Berechtigung wie Ausgaben (expenses_*) statt eines
// eigenen Bereichs — dieselben Leute, die Ausgaben pflegen, sollen auch
// manuelle Einnahmen erfassen können, eine eigene Berechtigung dafür wäre
// hier nur zusätzliche Komplexität ohne echten Nutzen.
export async function createIncomeAction(_prev: IncomeFormState, formData: FormData): Promise<IncomeFormState> {
  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);

  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();
  await Income.create({ date, description, amount, createdBy });

  revalidateIncomePaths();
  return {};
}

export async function deleteIncomeAction(incomeId: string) {
  if (!(await hasPermission("expenses_delete"))) return;
  await connectDB();
  const income = await Income.findById(incomeId);
  if (!income) return;
  await income.deleteOne();
  revalidateIncomePaths();
}
