import { redirect } from "next/navigation";
import Link from "next/link";
import { isAdminSession, getAllPermissions } from "@/lib/adminAuth";
import { getSessionClientId } from "@/lib/auth";
import { connectDB } from "@/lib/db";
import { Client } from "@/models/Client";
import { SystemLog } from "@/models/SystemLog";
import { getDashboardStats } from "@/lib/dashboardStats";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { LiveClock } from "@/components/admin/LiveClock";
import { ORDER_TAG_COLORS, formatEUR, type OrderTag } from "@/lib/orderConstants";

export const dynamic = "force-dynamic";

function DashboardCard({ title, href, children }: { title: string; href: string; children: React.ReactNode }) {
  return (
    <Link
      href={href}
      className="bg-[var(--rk-surface)] border border-white/10 rounded-2xl p-5 hover:border-white/25 transition-colors flex flex-col gap-3"
    >
      <p className="text-xs uppercase tracking-[0.1em] text-[var(--rk-ink-muted)]">{title}</p>
      {children}
    </Link>
  );
}

export default async function AdminDashboardPage() {
  if (!(await isAdminSession())) redirect("/de/login?next=%2Fde%2Fadmin");
  const permissions = await getAllPermissions();
  const viewerId = (await getSessionClientId()) || "";

  await connectDB();
  const viewer = await Client.findById(viewerId).select("name").lean();

  const {
    openOrdersCount,
    openPaymentsCount,
    recentOrders,
    upcomingAppointments,
    myTodos,
    pendingQm,
    recentNotifications,
    unreadNotifications,
    intranetCount,
    monthRevenue,
    now,
  } = await getDashboardStats(viewerId, permissions);

  const errorCount24h = permissions.logs
    ? await SystemLog.countDocuments({
        level: "error",
        createdAt: { $gte: new Date(now.getTime() - 24 * 60 * 60 * 1000) },
      })
    : 0;

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />

      <div className="mb-8">
        <LiveClock name={viewer?.name || "du"} />
      </div>

      <div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
        {permissions.orders_view && (
          <DashboardCard title="Aufträge" href="/de/admin/orders">
            <div className="flex items-baseline gap-4">
              <span className="text-2xl font-semibold text-[var(--rk-ink)]">{openOrdersCount}</span>
              <span className="text-xs text-[var(--rk-ink-muted)]">offen</span>
              {openPaymentsCount > 0 && (
                <span className="text-xs text-red-400 ml-auto">
                  {openPaymentsCount} offene Zahlung{openPaymentsCount === 1 ? "" : "en"}
                </span>
              )}
            </div>
            {recentOrders.length > 0 && (
              <ul className="flex flex-col gap-1.5 border-t border-white/5 pt-3">
                {recentOrders.map((o) => (
                  <li key={String(o._id)} className="flex items-center gap-2 text-xs text-[var(--rk-ink-muted)]">
                    <span className="w-1.5 h-1.5 rounded-full shrink-0" style={{ background: ORDER_TAG_COLORS[o.tag as OrderTag] }} />
                    <span className="truncate">{o.characterOrConcept}</span>
                  </li>
                ))}
              </ul>
            )}
          </DashboardCard>
        )}

        <DashboardCard title="ToDos" href="/de/admin/todos">
          <div className="flex items-baseline gap-4">
            <span className="text-2xl font-semibold text-[var(--rk-ink)]">{myTodos.length}</span>
            <span className="text-xs text-[var(--rk-ink-muted)]">offen für dich</span>
          </div>
          {myTodos.length > 0 && (
            <ul className="flex flex-col gap-1.5 border-t border-white/5 pt-3">
              {myTodos.map((t) => {
                const overdue = t.dueDate && new Date(t.dueDate) < now;
                return (
                  <li key={String(t._id)} className={`text-xs truncate ${overdue ? "text-red-400" : "text-[var(--rk-ink-muted)]"}`}>
                    {t.title}
                  </li>
                );
              })}
            </ul>
          )}
        </DashboardCard>

        <DashboardCard title="Intranet" href="/de/admin/intranet">
          <div className="flex items-baseline gap-4">
            <span className="text-2xl font-semibold text-[var(--rk-ink)]">{intranetCount}</span>
            <span className="text-xs text-[var(--rk-ink-muted)]">interne Abläufe</span>
          </div>
        </DashboardCard>

        {permissions.orders_view && (
          <DashboardCard title="Nächste Termine (7 Tage)" href="/de/admin/calendar">
            {upcomingAppointments.length === 0 ? (
              <p className="text-xs text-[var(--rk-ink-muted)]">Keine Termine in den nächsten 7 Tagen.</p>
            ) : (
              <ul className="flex flex-col gap-1.5">
                {upcomingAppointments.map((o) => (
                  <li key={String(o._id)} className="flex items-center justify-between gap-2 text-xs">
                    <span className="text-[var(--rk-ink-muted)] truncate">{o.characterOrConcept}</span>
                    <span className="text-[var(--rk-ink)] shrink-0 tabular-nums">
                      {new Date(o.shootDate as unknown as string).toLocaleDateString("de-DE", { day: "2-digit", month: "2-digit" })}
                    </span>
                  </li>
                ))}
              </ul>
            )}
          </DashboardCard>
        )}

        <DashboardCard title="Benachrichtigungen" href="/de/admin/notifications">
          <div className="flex items-baseline gap-4">
            <span className="text-2xl font-semibold text-[var(--rk-ink)]">{unreadNotifications}</span>
            <span className="text-xs text-[var(--rk-ink-muted)]">ungelesen</span>
          </div>
          {recentNotifications.length > 0 && (
            <ul className="flex flex-col gap-1.5 border-t border-white/5 pt-3">
              {recentNotifications.map((n) => (
                <li key={String(n._id)} className="text-xs text-[var(--rk-ink-muted)] truncate">
                  {n.title}
                </li>
              ))}
            </ul>
          )}
        </DashboardCard>

        {(permissions.qm || permissions.hr) && (
          <DashboardCard title="QM & Personal" href="/de/admin/qm">
            <div className="flex items-baseline gap-4">
              <span className="text-2xl font-semibold text-[var(--rk-ink)]">{pendingQm}</span>
              <span className="text-xs text-[var(--rk-ink-muted)]">wartet auf Prüfung</span>
            </div>
          </DashboardCard>
        )}

        {permissions.statistics && (
          <DashboardCard title="Umsatz diesen Monat" href="/de/admin/statistics">
            <span className="text-2xl font-semibold text-emerald-400">{formatEUR(monthRevenue)}</span>
          </DashboardCard>
        )}

        {permissions.logs && (
          <DashboardCard title="Systemprotokoll" href="/de/admin/logs">
            <div className="flex items-baseline gap-4">
              <span className={`text-2xl font-semibold ${errorCount24h > 0 ? "text-red-400" : "text-[var(--rk-ink)]"}`}>
                {errorCount24h}
              </span>
              <span className="text-xs text-[var(--rk-ink-muted)]">Fehler (24 h)</span>
            </div>
          </DashboardCard>
        )}
      </div>
    </main>
  );
}
