import { connectDB } from "@/lib/db";
import { Order } from "@/models/Order";
import { Invoice } from "@/models/Invoice";
import { Expense } from "@/models/Expense";
import { Income } from "@/models/Income";
import { getSettings } from "@/lib/settings";

// Extrahiert aus admin/tax/page.tsx — reine Kennzahlen, keine Mutationen.
// Der EÜR-CSV-Export bleibt ein Browser-Download (siehe Kommentar im
// aufrufenden API-Route-Handler).
const KLEINUNTERNEHMER_LIMIT = 25000;

export async function getTaxStats() {
  const settings = await getSettings();
  const now = new Date();
  const yearStart = new Date(Date.UTC(now.getFullYear(), 0, 1));
  const yearEnd = new Date(Date.UTC(now.getFullYear() + 1, 0, 1));

  await connectDB();
  const [paidOrders, expenses, manualIncome, refundedOrders] = await Promise.all([
    Order.find({ paid: true, rejected: { $ne: true }, paidAt: { $gte: yearStart, $lt: yearEnd } }).select("_id").lean(),
    Expense.find({ date: { $gte: yearStart, $lt: yearEnd } }).select("amount vatAmount").lean(),
    Income.find({ date: { $gte: yearStart, $lt: yearEnd } }).select("amount").lean(),
    Order.find({ refundedAmount: { $gt: 0 }, refundedAt: { $gte: yearStart, $lt: yearEnd } }).select("refundedAmount").lean(),
  ]);
  const invoices = await Invoice.find({ orderId: { $in: paidOrders.map((o) => o._id) } })
    .select("totalAmount netAmount vatAmount")
    .lean();

  const manualIncomeTotal = manualIncome.reduce((sum, i) => sum + i.amount, 0);
  const refundedTotal = refundedOrders.reduce((sum, o) => sum + o.refundedAmount, 0);
  const income = invoices.reduce((sum, i) => sum + i.totalAmount, 0) + manualIncomeTotal - refundedTotal;
  const incomeVat = invoices.reduce((sum, i) => sum + (i.vatAmount || 0), 0);
  const incomeNet = income - incomeVat;
  const expenseTotal = expenses.reduce((sum, e) => sum + e.amount, 0);
  const expenseVat = expenses.reduce((sum, e) => sum + (e.vatAmount || 0), 0);
  const expenseNet = expenseTotal - expenseVat;
  const profit = income - expenseTotal;
  const reserve = Math.max(0, profit) * (settings.taxReserveSettings.percentage / 100);

  const kleinunternehmer = Boolean(settings.invoiceSettings?.kleinunternehmer);
  const kleinunternehmerWarningLevel =
    kleinunternehmer && income >= KLEINUNTERNEHMER_LIMIT
      ? "over"
      : kleinunternehmer && income >= KLEINUNTERNEHMER_LIMIT * 0.8
        ? "near"
        : null;

  return {
    year: now.getFullYear(),
    income,
    incomeNet,
    incomeVat,
    expenseTotal,
    expenseNet,
    expenseVat,
    profit,
    reservePercentage: settings.taxReserveSettings.percentage,
    reserve,
    refundedTotal,
    kleinunternehmer,
    kleinunternehmerWarningLevel,
    kleinunternehmerLimit: KLEINUNTERNEHMER_LIMIT,
  };
}
