import { connectDB } from "@/lib/db";
import { Expense } from "@/models/Expense";
import { Income } from "@/models/Income";
import type { ExpenseCategory } from "@/lib/expenseConstants";

// Extrahiert aus admin/expenses/page.tsx.
export async function getFinanceEntries() {
  await connectDB();
  const [expenses, incomeEntries] = await Promise.all([Expense.find({}).sort({ date: -1 }).lean(), Income.find({}).sort({ date: -1 }).lean()]);

  const incomeTotal = incomeEntries.reduce((sum, i) => sum + i.amount, 0);
  const expenseTotal = expenses.reduce((sum, e) => sum + e.amount, 0);
  const profit = incomeTotal - expenseTotal;

  const now = new Date();
  const thisMonthKey = now.toISOString().slice(0, 7);
  const incomeThisMonth = incomeEntries
    .filter((i) => new Date(i.date).toISOString().slice(0, 7) === thisMonthKey)
    .reduce((sum, i) => sum + i.amount, 0);
  const expenseThisMonth = expenses
    .filter((e) => new Date(e.date).toISOString().slice(0, 7) === thisMonthKey)
    .reduce((sum, e) => sum + e.amount, 0);
  const profitThisMonth = incomeThisMonth - expenseThisMonth;

  const entries = [
    ...incomeEntries.map((i) => ({
      _id: String(i._id),
      kind: "income" as const,
      date: new Date(i.date).toISOString(),
      description: i.description,
      amount: i.amount,
      category: null as ExpenseCategory | null,
      receiptUrl: null as string | null,
    })),
    ...expenses.map((e) => ({
      _id: String(e._id),
      kind: "expense" as const,
      date: new Date(e.date).toISOString(),
      description: e.description,
      amount: e.amount,
      category: (e.category as ExpenseCategory) || null,
      receiptUrl: e.receiptStoredName ? `/api/receipts/${e._id}/${e.receiptStoredName}` : null,
    })),
  ].sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());

  return { entries, incomeTotal, expenseTotal, profit, profitThisMonth };
}
