import { redirect } from "next/navigation";
import Link from "next/link";
import { isAdminSession, hasPermission, getAllPermissions } from "@/lib/adminAuth";
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";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { AdminPageHeader } from "@/components/admin/AdminPageHeader";
import { EuerExportPanel } from "@/components/admin/EuerExportPanel";
import { formatEUR } from "@/lib/orderConstants";

export const dynamic = "force-dynamic";

export default async function AdminTaxPage() {
  if (!(await isAdminSession())) redirect("/de/login?next=%2Fde%2Fadmin%2Forders");
  if (!(await hasPermission("statistics"))) redirect("/de/account");

  const permissions = await getAllPermissions();
  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([
    // rejected: {$ne: true} statt rejected:false, deckt auch ältere Dokumente
    // ohne das Feld ab — analog zum "!o.rejected"-Muster in statistics/page.tsx.
    // Ein bezahlter, aber nachträglich abgelehnter/stornierter Auftrag soll
    // hier nicht als Einnahme mitgezählt werden.
    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();

  // Für den Gewinn/die Rücklage zählt weiterhin der tatsächlich geflossene
  // Bruttobetrag (Zufluss-/Abfluss-Prinzip, Standard bei der EÜR) — die
  // Netto-/USt.-Aufschlüsselung darunter ist rein informativ und ändert
  // nichts an dieser Rechnung. Manuell erfasste Einnahmen (ohne Auftrag/
  // Rechnung, z. B. Workshops) zählen mit voller USt. von 0 € dazu — wie bei
  // den auftragsbezogenen Einnahmen als Kleinunternehmer:in.
  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);

  // Kleinunternehmer-Schwellenwerte nach §19 UStG (seit 2025): 25.000 € im
  // Vorjahresumsatz und max. 100.000 € im laufenden Jahr — hier nur der
  // laufende Jahresumsatz geprüft (der einzige Wert, den diese Seite schon
  // kennt), als Frühwarnung statt vollständiger Prüfung beider Grenzen.
  const KLEINUNTERNEHMER_LIMIT = 25000;
  const kleinunternehmerWarningLevel =
    settings.invoiceSettings?.kleinunternehmer && income >= KLEINUNTERNEHMER_LIMIT
      ? "over"
      : settings.invoiceSettings?.kleinunternehmer && income >= KLEINUNTERNEHMER_LIMIT * 0.8
        ? "near"
        : null;

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <div className="max-w-3xl">
      <AdminPageHeader
        title="Steuer"
        subtitle="Alles rund um die Steuervorbereitung an einem Ort — der eigentliche Steuerbescheid/die Steuererklärung selbst läuft weiterhin über ELSTER bzw. den Steuerberater, hier gibt's die dafür aufbereiteten Zahlen."
      />

      {kleinunternehmerWarningLevel && (
        <div
          className={`rounded-2xl p-5 mb-6 border text-sm ${
            kleinunternehmerWarningLevel === "over"
              ? "border-red-400/40 bg-red-400/5 text-red-400"
              : "border-amber-400/40 bg-amber-400/5 text-amber-400"
          }`}
        >
          {kleinunternehmerWarningLevel === "over"
            ? `⚠ Der Jahresumsatz (${formatEUR(income)}) hat die Kleinunternehmer-Grenze von ${formatEUR(
                KLEINUNTERNEHMER_LIMIT
              )} bereits überschritten — ab dem Folgejahr greift voraussichtlich die Regelbesteuerung. Bitte mit dem Steuerberater klären.`
            : `Der Jahresumsatz (${formatEUR(income)}) nähert sich der Kleinunternehmer-Grenze von ${formatEUR(
                KLEINUNTERNEHMER_LIMIT
              )} — rechtzeitig im Blick behalten.`}
        </div>
      )}

      <div className="bg-[var(--rk-surface)] border border-white/10 rounded-2xl p-6 mb-8">
        <p className="text-xs uppercase tracking-[0.1em] text-[var(--rk-ink-muted)] mb-4">{now.getFullYear()} bisher</p>
        <dl className="grid grid-cols-2 sm:grid-cols-4 gap-4 text-sm">
          <div>
            <dt className="text-xs text-[var(--rk-ink-muted)] uppercase tracking-[0.08em]">Einnahmen</dt>
            <dd className="mt-1 text-base">{formatEUR(income)}</dd>
          </div>
          <div>
            <dt className="text-xs text-[var(--rk-ink-muted)] uppercase tracking-[0.08em]">Ausgaben</dt>
            <dd className="mt-1 text-base">{formatEUR(expenseTotal)}</dd>
          </div>
          <div>
            <dt className="text-xs text-[var(--rk-ink-muted)] uppercase tracking-[0.08em]">Gewinn</dt>
            <dd className={`mt-1 text-base ${profit >= 0 ? "text-emerald-400" : "text-red-400"}`}>{formatEUR(profit)}</dd>
          </div>
          <div>
            <dt className="text-xs text-[var(--rk-ink-muted)] uppercase tracking-[0.08em]">Rücklage ({settings.taxReserveSettings.percentage}%)</dt>
            <dd className="mt-1 text-base text-amber-400">{formatEUR(reserve)}</dd>
          </div>
        </dl>
        {refundedTotal > 0 && (
          <p className="text-xs text-amber-400 mt-4">
            Enthält bereits {formatEUR(refundedTotal)} Rückerstattungen aus diesem Jahr (bereits abgezogen).
          </p>
        )}
        <p className="text-xs text-[var(--rk-ink-muted)] mt-4">
          Grober Richtwert, kein Ersatz für eine steuerliche Beratung. Ausführlichere Auswertungen (Monatsverlauf,
          Zahlungsarten etc.) unter{" "}
          <Link href="/de/admin/statistics" className="underline hover:text-[var(--rk-ink)]">
            Statistiken
          </Link>
          . Prozentsatz unter{" "}
          <Link href="/de/admin/settings" className="underline hover:text-[var(--rk-ink)]">
            Einstellungen
          </Link>{" "}
          anpassbar.
        </p>
      </div>

      <div className="bg-[var(--rk-surface)] border border-white/10 rounded-2xl p-6 mb-8">
        <p className="text-xs uppercase tracking-[0.1em] text-[var(--rk-ink-muted)] mb-1">Netto-/Umsatzsteuer-Aufschlüsselung</p>
        <p className="text-xs text-[var(--rk-ink-muted)] mb-4">
          Rein informativ — der Kunde sieht immer nur den vereinbarten Gesamtpreis, nie diese Aufschlüsselung.
        </p>
        <div className="grid grid-cols-1 sm:grid-cols-2 gap-6 text-sm">
          <div>
            <p className="text-xs uppercase tracking-[0.08em] text-[var(--rk-ink-muted)] mb-2">Einnahmen</p>
            <dl className="flex flex-col gap-1">
              <div className="flex justify-between">
                <dt className="text-[var(--rk-ink-muted)]">Netto</dt>
                <dd>{formatEUR(incomeNet)}</dd>
              </div>
              <div className="flex justify-between">
                <dt className="text-[var(--rk-ink-muted)]">davon USt.</dt>
                <dd>{formatEUR(incomeVat)}</dd>
              </div>
              <div className="flex justify-between font-medium border-t border-white/10 pt-1 mt-1">
                <dt>Brutto</dt>
                <dd>{formatEUR(income)}</dd>
              </div>
            </dl>
          </div>
          <div>
            <p className="text-xs uppercase tracking-[0.08em] text-[var(--rk-ink-muted)] mb-2">Ausgaben</p>
            <dl className="flex flex-col gap-1">
              <div className="flex justify-between">
                <dt className="text-[var(--rk-ink-muted)]">Netto</dt>
                <dd>{formatEUR(expenseNet)}</dd>
              </div>
              <div className="flex justify-between">
                <dt className="text-[var(--rk-ink-muted)]">davon USt.</dt>
                <dd>{formatEUR(expenseVat)}</dd>
              </div>
              <div className="flex justify-between font-medium border-t border-white/10 pt-1 mt-1">
                <dt>Brutto</dt>
                <dd>{formatEUR(expenseTotal)}</dd>
              </div>
            </dl>
          </div>
        </div>
        <p className="text-xs text-[var(--rk-ink-muted)] mt-4">
          Da du aktuell Kleinunternehmer:in bist, wird auf Einnahmen keine Umsatzsteuer ausgewiesen (Einnahmen-USt.
          daher 0&nbsp;€) — die Ausgaben-USt. ist die Umsatzsteuer, die andere Anbieter dir in Rechnung gestellt haben
          und die du nicht als Vorsteuer geltend machen kannst.
        </p>
      </div>

      <div className="bg-[var(--rk-surface)] border border-white/10 rounded-2xl p-6 mb-8">
        <p className="text-xs uppercase tracking-[0.1em] text-[var(--rk-ink-muted)] mb-2">EÜR-Export für Steuerberater/ELSTER</p>
        <p className="text-xs text-[var(--rk-ink-muted)] mb-1">
          Einnahmen-Überschuss-Rechnung als CSV, aufbereitet nach dem Zufluss-/Abfluss-Prinzip — direkt herunterladbar,
          zum Weitergeben an den Steuerberater oder als Grundlage für die eigene Steuererklärung.
        </p>
        <EuerExportPanel />
      </div>

      <Link
        href="/de/admin/mileage"
        className="inline-flex items-center gap-1.5 text-xs border border-white/30 rounded-lg px-3 py-1.5 hover:border-white transition-colors"
      >
        🚗 Fahrtkosten / Kilometerpauschale berechnen →
      </Link>
      </div>
    </main>
  );
}
