import {
  ArchiveIcon,
  FeatherIcon,
  FileDashedIcon,
  PaperPlaneTiltIcon,
  VaultIcon,
} from "@phosphor-icons/react";
import { useState } from "react";
import { useLocation, useNavigate } from "react-router-dom";
import { DrawerSection } from "../components/drawer/DrawerSection";
import { LetterItem } from "../components/drawer/LetterItem";
import { PasskeyModal } from "../components/drawer/PasskeyModal";
import { WelcomeLetterOverlay } from "../components/drawer/WelcomeLetterOverlay";
import Logo from "../components/Logo";
import Saajan from "../components/ui/Saajan";
import { PATHS } from "../config/routes";
import { useAuth } from "../hooks/useAuth";
import { useLetters } from "../hooks/useLetters";
import {
  formatRelativeDate,
  formatRelativeDateWithoutTime,
} from "../utils/dateFormat";

export default function Drawer() {
  const { user, logout } = useAuth();

  const [openSection, setOpenSection] = useState<string | null>(null);
  const navigate = useNavigate();
  const location = useLocation();
  const [showWelcomeLetter, setShowWelcomeLetter] = useState(
    !!location.state?.firstTime,
  );
  const { drafts, kept, sent, vault, loading, isAuthRequired } = useLetters();

  if (!user) return null;

  const toggleSection = (id: string) =>
    setOpenSection(openSection === id ? null : id);

  return (
    <div className="min-h-screen w-full bg-base-100 text-base-content flex flex-col items-center py-12 px-5 pb-32 font-serif transition-colors">
      <div className="fixed inset-0 bg-vig pointer-events-none z-0" />

      {showWelcomeLetter && (
        <WelcomeLetterOverlay
          userName={user.full_name}
          onComplete={() => {
            setShowWelcomeLetter(false);
            navigate(location.pathname, { replace: true, state: {} });
          }}
        />
      )}

      {isAuthRequired && <PasskeyModal />}
      <header className="text-center mb-12 z-10 animate-in fade-in slide-in-from-top-4 duration-500">
        <Logo />
        <div className="font-sans text-xs tracking-widester uppercase text-base-content/40 mt-2">
          Personal Archive
        </div>
        <div className="mt-6 font-sans text-sm text-base-content flex items-center justify-center gap-2 opacity-60 hover:opacity-100 transition-opacity">
          Welcome Back&nbsp;
          <span className="font-semibold text-primary">{user.full_name}</span>
          <button
            type="button"
            onClick={logout}
            className="ml-3 cursor-pointer underline underline-offset-4 text-xs hover:text-primary transition-colors"
          >
            Sign Out
          </button>
        </div>
      </header>

      <div className="join join-vertical w-full max-w-120 bg-base-200 border border-base-content/10 shadow-2xl z-10 rounded-sm duration-500 delay-200 min-h-64 flex flex-col">
        {loading ? (
          <div className="flex-1 flex flex-col items-center justify-center p-12 gap-4">
            <span className="loading loading-ring loading-lg text-primary opacity-20"></span>
            <span
              data-testid="drawer-loading-state"
              className="text-xxs uppercase tracking-widester font-sans text-base-content/20 animate-pulse"
            >
              Opening your cabinet...
            </span>
          </div>
        ) : (
          <>
            <DrawerSection
              id="drafts"
              title="Drafts"
              count={drafts.length}
              subtext="unfinished whispers"
              isOpen={openSection === "drafts"}
              onClick={() => toggleSection("drafts")}
              icon={<FileDashedIcon weight="thin" size={128} />}
            >
              {drafts.map((draft) => (
                <LetterItem
                  id={draft.public_id}
                  status={draft.status}
                  key={draft.public_id}
                  preview={draft.metadata?.recipient || "Untitled Draft"}
                  timestamp={formatRelativeDate(draft.updated_at)}
                />
              ))}
            </DrawerSection>

            <DrawerSection
              id="kept"
              title="Kept"
              count={kept.length}
              subtext="private letters"
              isOpen={openSection === "kept"}
              onClick={() => toggleSection("kept")}
              icon={<ArchiveIcon weight="thin" size={128} />}
            >
              {kept.map((letter) => (
                <LetterItem
                  id={letter.public_id}
                  status={letter.status}
                  key={letter.public_id}
                  preview={letter.metadata?.recipient || "Someone dear..."}
                  timestamp={formatRelativeDate(letter.updated_at)}
                />
              ))}
            </DrawerSection>
            <DrawerSection
              id="sent"
              title="Sent"
              count={sent.length}
              subtext="shared truths"
              isOpen={openSection === "sent"}
              onClick={() => toggleSection("sent")}
              icon={<PaperPlaneTiltIcon weight="thin" size={128} />}
            >
              {sent.map((letter) => (
                <LetterItem
                  key={letter.public_id}
                  status={letter.status}
                  id={letter.public_id}
                  preview={letter.metadata?.recipient || "Someone dear..."}
                  timestamp={formatRelativeDate(letter.updated_at)}
                />
              ))}
            </DrawerSection>
            <DrawerSection
              id="vault"
              title="Vault"
              count={vault.length}
              subtext="things locked—not lost—in time"
              isOpen={openSection === "vault"}
              onClick={() => toggleSection("vault")}
              icon={<VaultIcon weight="thin" size={128} />}
            >
              {vault.map((letter) => (
                <LetterItem
                  key={letter.public_id}
                  status={letter.status}
                  id={letter.public_id}
                  preview={letter.metadata?.recipient || "Future Self"}
                  timestamp={formatRelativeDate(letter.updated_at)}
                  unlock_at={formatRelativeDateWithoutTime(
                    letter.unlock_at || "",
                  )}
                  isLocked={letter.unlock_at > new Date().toISOString()}
                />
              ))}
            </DrawerSection>
          </>
        )}
      </div>

      <button
        type="button"
        id="write-letter-btn"
        data-testid="write-letter-btn"
        className="group mt-15 z-10 bg-transparent border border-dashed border-base-content/10 px-8 py-4 text-base-content/40 italic cursor-pointer transition-all hover:border-primary/40 hover:text-base-content/60 hover:bg-primary/5 hover:-translate-y-0.5 flex items-center gap-2 focus-visible:ring-2 focus-visible:ring-primary/50 duration-500"
        onClick={() => navigate(PATHS.write(""))}
      >
        <FeatherIcon
          size={18}
          weight="duotone"
          className="text-primary/30 transition-all duration-300 group-hover:text-primary"
        />
        Write something&nbsp;
        <span className="relative inline-flex">
          <span className="transition-opacity duration-500 opacity-80 group-hover:opacity-0">
            . . . . . .
          </span>
          <span className="absolute inset-0 text-primary transition-opacity duration-300 opacity-0 group-hover:opacity-100">
            unsaid
          </span>
        </span>
      </button>

      <footer className="mt-25 font-sans text-[0.6rem] tracking-widester uppercase text-base-content/10 z-10">
        For your unsaid.
      </footer>
      {!showWelcomeLetter && (
        <div className="absolute bottom-0 z-50 font-sans">
          <Saajan
            message={`Good to see you again, ${user.full_name}.\nWhat's on your mind today?`}
            position="top"
          />
        </div>
      )}
    </div>
  );
}
