import { redirect } from "next/navigation";
import { isAdminSession, hasPermission, getAllPermissions } from "@/lib/adminAuth";
import { connectDB } from "@/lib/db";
import { Expense } from "@/models/Expense";
import { Income } from "@/models/Income";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { AdminPageHeader } from "@/components/admin/AdminPageHeader";
import { AdminEmptyState } from "@/components/admin/AdminEmptyState";
import { StatCard } from "@/components/admin/StatCard";
import { NewFinanceEntryForm } from "@/components/admin/NewFinanceEntryForm";
import { DeleteFinanceEntryButton } from "@/components/admin/DeleteFinanceEntryButton";
import { EXPENSE_CATEGORY_LABELS, type ExpenseCategory } from "@/lib/expenseConstants";
import { formatEUR, formatDateDE } from "@/lib/orderConstants";

export const dynamic = "force-dynamic";

type CombinedEntry = {
  id: string;
  kind: "income" | "expense";
  date: Date;
  description: string;
  amount: number;
  category?: ExpenseCategory;
  receiptStoredName?: string;
};

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

  if (!(await hasPermission("expenses_view"))) redirect("/de/account");

  const permissions = await getAllPermissions();

  await connectDB();
  const expenses = await Expense.find({}).sort({ date: -1 }).lean();
  const incomeEntries = await Income.find({}).sort({ date: -1 }).lean();

  const now = new Date();
  const thisMonthKey = now.toISOString().slice(0, 7);

  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 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 combinedEntries: CombinedEntry[] = [
    ...incomeEntries.map((i) => ({
      id: String(i._id),
      kind: "income" as const,
      date: i.date,
      description: i.description,
      amount: i.amount,
    })),
    ...expenses.map((e) => ({
      id: String(e._id),
      kind: "expense" as const,
      date: e.date,
      description: e.description,
      amount: e.amount,
      category: e.category as ExpenseCategory,
      receiptStoredName: e.receiptStoredName,
    })),
  ].sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <AdminPageHeader
        title="Einnahmen & Ausgaben"
        subtitle="Manuelle Einnahmen (z. B. Workshops, Print-Verkäufe) und Geschäftsausgaben über ein gemeinsames Formular erfassen — beides fließt in Statistiken, Steuer-Übersicht und EÜR-Export ein. Auftragsumsatz läuft weiterhin automatisch über bezahlte Aufträge, dafür ist hier nichts nötig."
      />

      <div className="grid grid-cols-2 sm:grid-cols-4 gap-3 mb-8">
        <StatCard label="Einnahmen gesamt" value={formatEUR(incomeTotal)} accent="emerald" />
        <StatCard label="Ausgaben gesamt" value={formatEUR(expenseTotal)} />
        <StatCard label="Gewinn" value={formatEUR(profit)} accent={profit >= 0 ? "emerald" : "red"} />
        <StatCard label="Diesen Monat" value={formatEUR(profitThisMonth)} accent={profitThisMonth >= 0 ? "emerald" : "red"} />
      </div>

      <NewFinanceEntryForm />

      <div className="flex flex-col gap-3">
        {combinedEntries.map((entry) => (
          <div
            key={`${entry.kind}-${entry.id}`}
            className="bg-[var(--rk-surface)] border border-white/10 rounded-2xl p-5 flex items-start justify-between gap-4"
          >
            <div className="min-w-0">
              <div className="flex items-center gap-2 flex-wrap">
                <span className="text-xs uppercase tracking-[0.1em] text-[var(--rk-ink-muted)]">
                  {formatDateDE(new Date(entry.date))}
                </span>
                <span
                  className={`text-xs border rounded-full px-2 py-0.5 ${
                    entry.kind === "income" ? "border-emerald-400/40 text-emerald-400" : "border-white/15 text-[var(--rk-ink-muted)]"
                  }`}
                >
                  {entry.kind === "income" ? "Einnahme" : "Ausgabe"}
                </span>
                {entry.kind === "expense" && entry.category && (
                  <span className="text-xs border border-white/15 rounded-full px-2 py-0.5 text-[var(--rk-ink-muted)]">
                    {EXPENSE_CATEGORY_LABELS[entry.category]}
                  </span>
                )}
              </div>
              <p className="text-sm mt-1">{entry.description}</p>
              {entry.kind === "expense" && entry.receiptStoredName && (
                <a
                  href={`/api/receipts/${entry.id}/${entry.receiptStoredName}`}
                  target="_blank"
                  rel="noopener noreferrer"
                  className="text-xs text-[var(--rk-ink-muted)] hover:text-[var(--rk-ink)] transition-colors underline mt-1 inline-block"
                >
                  Beleg öffnen
                </a>
              )}
            </div>
            <div className="text-right shrink-0">
              <p className={`text-sm font-medium ${entry.kind === "income" ? "text-emerald-400" : "text-[var(--rk-ink)]"}`}>
                {entry.kind === "income" ? "+" : "−"} {formatEUR(entry.amount)}
              </p>
              <div className="mt-2">
                <DeleteFinanceEntryButton kind={entry.kind} id={entry.id} />
              </div>
            </div>
          </div>
        ))}
        {combinedEntries.length === 0 && <AdminEmptyState message="Noch keine Einnahmen oder Ausgaben erfasst." />}
      </div>
    </main>
  );
}
