import type { ReactNode } from "react";
import {
  ArrowLeft,
  FolderKanban,
  Globe2,
  ImageIcon,
  LayoutDashboard,
  LogOut,
  PlusSquare,
  ShieldAlert,
  SwatchBook,
  Tags,
} from "lucide-react";
import Link from "next/link";

import { DashboardLayout } from "@/components/dashboard/dashboard-layout";
import { MotionFade } from "@/components/motion-fade";
import { FormSaveButton } from "@/components/root/form-save-button";
import { SidebarMaintenanceControl } from "@/components/root/sidebar-maintenance-control";
import { ThemeToggle } from "@/components/theme-toggle";
import { Button } from "@/components/ui/button";
import { Separator } from "@/components/ui/separator";
import { getMaintenanceMode, getSiteSettingsMediaBindings } from "@/lib/app-config";
import { getLocalizedPath } from "@/lib/locale";
import { getRootNavigation } from "@/lib/root-navigation";

import { updateMaintenanceModeAction } from "@/app/root/maintenance/actions";

type RootDashboardCopy = {
  title: string;
  subtitle: string;
  overview: string;
  maintenance: string;
  uiKit: string;
  portfolio: string;
  media: string;
  siteSettings: string;
  smtp?: string;
  contactProtection?: string;
  logout: string;
  backToSite: string;
};

type RootDashboardShellProps = {
  copy: RootDashboardCopy;
  active: "overview" | "maintenance" | "ui-kit" | "portfolio" | "media" | "site-settings" | "smtp";
  smtpChild?: "settings" | "contact-protection";
  portfolioChild?: "overview" | "projects" | "new-project" | "categories";
  logoutAction: () => Promise<void>;
  headerTitle: string;
  headerDescription: string;
  saveFormId?: string;
  saveFormSelector?: string;
  saveButtonLabel?: string;
  reloadDocumentOnSave?: boolean;
  headerActions?: ReactNode;
  sidebarTopContent?: ReactNode;
  toolbar?: ReactNode;
  children: ReactNode;
};

export async function RootDashboardShell({
  copy,
  active,
  smtpChild,
  portfolioChild,
  logoutAction,
  headerTitle,
  headerDescription,
  saveFormId,
  saveFormSelector,
  saveButtonLabel,
  reloadDocumentOnSave = false,
  headerActions,
  sidebarTopContent,
  toolbar,
  children,
}: RootDashboardShellProps) {
  const [mediaBindings, maintenanceEnabled] = await Promise.all([
    getSiteSettingsMediaBindings(),
    getMaintenanceMode(),
  ]);
  const normalizedSidebarItems = getRootNavigation(copy, active, smtpChild, portfolioChild).filter(
    (item) => item.href !== "/root/maintenance" && item.href !== "/root/ui-kit",
  );
  const headerIcon =
    active === "overview"
      ? LayoutDashboard
      : active === "maintenance"
        ? ShieldAlert
        : active === "ui-kit"
          ? SwatchBook
          : active === "site-settings"
            ? Globe2
          : active === "smtp"
            ? ShieldAlert
          : active === "media"
            ? ImageIcon
            : portfolioChild === "categories"
              ? Tags
              : portfolioChild === "new-project"
                ? PlusSquare
                : FolderKanban;
  const sharedActions = (
    <>
      <FormSaveButton
        formIds={saveFormId ? ["sidebar-maintenance-form", saveFormId] : ["sidebar-maintenance-form"]}
        formSelectors={saveFormSelector ? [saveFormSelector] : undefined}
        label={saveButtonLabel ?? "Speichern"}
        reloadDocumentOnSuccess={reloadDocumentOnSave}
      />
      <ThemeToggle ariaLabel="Theme wechseln" />
    </>
  );

  return (
    <DashboardLayout
      title={headerTitle}
      description={headerDescription}
      icon={headerIcon}
      items={normalizedSidebarItems}
      sidebarIconSrc={mediaBindings.favicon?.url}
      sidebarTop={
        <div className="space-y-2">
          <Button asChild variant="outline" className="w-full justify-between">
            <Link href={getLocalizedPath("de")} target="_blank" rel="noreferrer">
              {copy.backToSite}
              <ArrowLeft className="h-4 w-4" />
            </Link>
          </Button>
          {sidebarTopContent}
        </div>
      }
      sidebarFooter={
        <>
          <SidebarMaintenanceControl
            action={updateMaintenanceModeAction}
            initialEnabled={maintenanceEnabled}
            label={copy.maintenance}
            onLabel="Besucher gesperrt"
            offLabel="Website offen"
          />
          <Button
            asChild
            variant={active === "ui-kit" ? "default" : "outline"}
            className="w-full justify-between"
          >
            <Link href="/root/ui-kit">
              {copy.uiKit}
              <SwatchBook className="h-4 w-4" />
            </Link>
          </Button>
          <form action={logoutAction}>
            <Button type="submit" variant="ghost" className="w-full justify-between text-destructive hover:bg-destructive/10 hover:text-destructive">
              {copy.logout}
              <LogOut className="h-4 w-4" />
            </Button>
          </form>
          <Separator />
        </>
      }
      headerActions={
        <div className="flex flex-wrap items-center justify-end gap-2">
          {headerActions}
          {sharedActions}
        </div>
      }
    >
      <div className="space-y-6">
        {toolbar ? <MotionFade delay={0.05}>{toolbar}</MotionFade> : null}
        {children}
      </div>
    </DashboardLayout>
  );
}
