/* global React, window, Eyebrow, useAuth, useIsMobile */
const { useState, useEffect, useRef } = React;

/* ---------- Header (dispatcher) ---------- */
function Header(props) {
  const isMobile = useIsMobile();
  return isMobile ? <MobileHeader {...props} /> : <DesktopHeader {...props} />;
}

/* ---------- Desktop header ---------- */
function DesktopHeader({ route, setRoute, bagFilter }) {
  const auth = useAuth();
  const [bagsOpen, setBagsOpen] = useState(false);
  const [interiorOpen, setInteriorOpen] = useState(false);
  const [scrolled, setScrolled] = useState(false);
  const bagsTimer = useRef(null);
  const interiorTimer = useRef(null);

  useEffect(() => {
    const onScroll = () => setScrolled(window.scrollY > 20);
    window.addEventListener("scroll", onScroll);
    return () => window.removeEventListener("scroll", onScroll);
  }, []);

  const openBags = () => { clearTimeout(bagsTimer.current); setBagsOpen(true); setInteriorOpen(false); };
  const closeBags = () => { bagsTimer.current = setTimeout(() => setBagsOpen(false), 120); };
  const openInterior = () => { clearTimeout(interiorTimer.current); setInteriorOpen(true); setBagsOpen(false); };
  const closeInterior = () => { interiorTimer.current = setTimeout(() => setInteriorOpen(false), 120); };

  const interiorRoutes = ["trunks", "rounds", "shoecabinet", "ensembles", "ensemble"];
  const interiorActive = interiorRoutes.includes(route);

  const go = (r, filter) => {
    setRoute(r, filter);
    setBagsOpen(false);
    setInteriorOpen(false);
  };

  const navItem = (label, r, opts = {}) => (
    <button
      onClick={() => go(r)}
      onMouseEnter={opts.onEnter}
      onMouseLeave={opts.onLeave}
      style={{
        all: "unset",
        cursor: "pointer",
        padding: "10px 2px",
        fontFamily: "'Manrope', sans-serif",
        fontSize: 12,
        letterSpacing: "0.18em",
        textTransform: "uppercase",
        color: route === r ? "var(--ink)" : "rgba(0,0,0,0.65)",
        position: "relative",
        fontWeight: route === r ? 500 : 400,
      }}
    >
      {label}
      <span style={{
        position: "absolute", left: 0, right: 0, bottom: 4, height: 1,
        background: "var(--ink)",
        transform: `scaleX(${route === r ? 1 : 0})`,
        transformOrigin: "left center",
        transition: "transform 280ms ease",
      }} />
    </button>
  );

  return (
    <header style={{
      position: "fixed",
      top: 0, left: 0, right: 0,
      zIndex: 50,
      background: scrolled ? "rgba(248,243,234,0.92)" : "rgba(248,243,234,0.7)",
      backdropFilter: "blur(14px)",
      WebkitBackdropFilter: "blur(14px)",
      borderBottom: `1px solid ${scrolled ? "rgba(0,0,0,0.08)" : "rgba(0,0,0,0.04)"}`,
      transition: "background 240ms ease, border-color 240ms ease",
    }}>
      {/* top utility strip */}
      <div style={{
        borderBottom: "1px solid rgba(0,0,0,0.05)",
        fontFamily: "'Manrope', sans-serif",
        fontSize: 10.5,
        letterSpacing: "0.22em",
        textTransform: "uppercase",
        color: "rgba(0,0,0,0.55)",
      }}>
        <div style={{ maxWidth: 1480, margin: "0 auto", padding: "8px 40px", display: "flex", justifyContent: "space-between", alignItems: "center" }}>
          <span>Ручная работа · С&nbsp;2001 года</span>
          <span style={{ display: "flex", gap: 28, alignItems: "center" }}>
            <span>RU</span>
            <span style={{ width: 1, height: 12, background: "rgba(0,0,0,0.15)" }} />
            {auth.isLoading ? (
              <span style={{ opacity: 0.5 }}>···</span>
            ) : auth.isAuthed ? (
              <>
                <button onClick={() => go("account")} style={{
                  all: "unset", cursor: "pointer", letterSpacing: "0.22em", textTransform: "uppercase",
                  color: route === "account" ? "var(--ink)" : "rgba(0,0,0,0.65)",
                  fontWeight: route === "account" ? 500 : 400,
                }} title={auth.user.email}>
                  {auth.user.name ? auth.user.name : "Кабинет"}
                </button>
                <button onClick={async () => { await auth.logout(); go("home"); }} style={{
                  all: "unset", cursor: "pointer", letterSpacing: "0.22em", textTransform: "uppercase",
                  color: "rgba(0,0,0,0.5)",
                }}>Выход</button>
              </>
            ) : (
              <>
                <button onClick={() => go("login")} style={{
                  all: "unset", cursor: "pointer", letterSpacing: "0.22em", textTransform: "uppercase",
                  color: route === "login" ? "var(--ink)" : "rgba(0,0,0,0.65)",
                  fontWeight: route === "login" ? 500 : 400,
                }}>Войти</button>
                <button onClick={() => go("register")} style={{
                  all: "unset", cursor: "pointer", letterSpacing: "0.22em", textTransform: "uppercase",
                  color: route === "register" ? "var(--ink)" : "rgba(0,0,0,0.5)",
                }}>Создать</button>
              </>
            )}
          </span>
        </div>
      </div>

      <div style={{
        maxWidth: 1480, margin: "0 auto", padding: "0 40px",
        height: 72,
        display: "grid", gridTemplateColumns: "1fr 1fr 1fr", alignItems: "center", gap: 24,
      }}>
        {/* left nav */}
        <nav style={{ display: "flex", gap: 36, alignItems: "center", justifyContent: "center" }}>
          {navItem("Главная",    "home")}
          <div style={{ position: "relative" }} onMouseEnter={openInterior} onMouseLeave={closeInterior}>
            <button
              onClick={() => go("trunks")}
              onMouseEnter={openInterior}
              style={{
                all: "unset",
                cursor: "pointer",
                padding: "10px 2px",
                fontFamily: "'Manrope', sans-serif",
                fontSize: 12,
                letterSpacing: "0.18em",
                textTransform: "uppercase",
                color: interiorActive ? "var(--ink)" : "rgba(0,0,0,0.65)",
                position: "relative",
                fontWeight: interiorActive ? 500 : 400,
              }}
            >
              Чемоданы
              <span style={{
                position: "absolute", left: 0, right: 0, bottom: 4, height: 1,
                background: "var(--ink)",
                transform: `scaleX(${interiorActive ? 1 : 0})`,
                transformOrigin: "left center",
                transition: "transform 280ms ease",
              }} />
            </button>
            <span aria-hidden style={{
              display: "inline-block", marginLeft: 4, fontSize: 10,
              color: "rgba(0,0,0,0.4)", transform: `translateY(-1px) rotate(${interiorOpen ? 180 : 0}deg)`,
              transition: "transform 220ms ease",
            }}>▾</span>
          </div>
          <div style={{ position: "relative" }} onMouseEnter={openBags} onMouseLeave={closeBags}>
            {navItem("Сумки", "bags", { onEnter: openBags })}
            <span aria-hidden style={{
              display: "inline-block", marginLeft: 4, fontSize: 10,
              color: "rgba(0,0,0,0.4)", transform: `translateY(-1px) rotate(${bagsOpen ? 180 : 0}deg)`,
              transition: "transform 220ms ease",
            }}>▾</span>
          </div>
        </nav>

        {/* wordmark */}
        <button
          onClick={() => go("home")}
          style={{
            all: "unset", cursor: "pointer", textAlign: "center",
            fontFamily: "'Cormorant Garamond', serif",
            fontWeight: 400, fontSize: 22, letterSpacing: "0.28em",
            color: "var(--ink)",
            textTransform: "uppercase",
            lineHeight: 1,
            whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis",
          }}
        >
          Royal&nbsp;Harmony
          <div style={{
            fontFamily: "'Manrope', sans-serif",
            fontSize: 9, letterSpacing: "0.4em", marginTop: 4,
            color: "rgba(0,0,0,0.5)", fontWeight: 400,
          }}>
            ROYAL HARMONY · 2001 → 2026
          </div>
        </button>

        {/* right nav */}
        <nav style={{ display: "flex", gap: 36, alignItems: "center", justifyContent: "center" }}>
          {navItem("О нас", "about")}
          {navItem("Контакты",  "contact")}
        </nav>
      </div>

      {/* mega-dropdown for interior */}
      <div
        onMouseEnter={openInterior}
        onMouseLeave={closeInterior}
        style={{
          position: "absolute", left: 0, right: 0, top: "100%",
          background: "var(--cream)",
          borderBottom: "1px solid rgba(0,0,0,0.08)",
          borderTop: "1px solid rgba(0,0,0,0.06)",
          overflow: "hidden",
          maxHeight: interiorOpen ? 380 : 0,
          opacity: interiorOpen ? 1 : 0,
          transition: "max-height 360ms cubic-bezier(0.2, 0.7, 0.2, 1), opacity 220ms ease",
          pointerEvents: interiorOpen ? "auto" : "none",
        }}
      >
        <div style={{
          maxWidth: 1480, margin: "0 auto", padding: "40px 40px 48px",
          display: "grid", gridTemplateColumns: "1.2fr 1fr 1fr 1fr 1fr", gap: 48,
        }}>
          <div>
            <Eyebrow>Интерьерная коллекция</Eyebrow>
            <h3 style={{
              fontFamily: "'Cormorant Garamond', serif", fontWeight: 300,
              fontSize: 32, lineHeight: 1.1, margin: "16px 0 12px",
              fontStyle: "italic",
            }}>Сундуки, круги,<br />обувница и&nbsp;комплекты</h3>
            <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 13, lineHeight: 1.65, color: "rgba(0,0,0,0.65)", maxWidth: 300, margin: 0 }}>
              Для&nbsp;дома, витрины и&nbsp;подарка. Каждое изделие собирается вручную.
            </p>
          </div>

          <DropCol
            kicker="Крупные хранилища"
            title="Сундуки"
            blurb="Семь размеров для&nbsp;прихожей, гостиной и&nbsp;спальни."
            cta="Открыть каталог"
            onClick={() => { go("trunks"); }}
          />
          <DropCol
            kicker="Круглые футляры"
            title="Круги"
            blurb="Цилиндрические коробки разных диаметров - для&nbsp;шляп и&nbsp;аксессуаров."
            cta="Открыть каталог"
            onClick={() => { go("rounds"); }}
          />
          <DropCol
            kicker="Для прихожей"
            title="Обувница"
            blurb="Высокий комод в&nbsp;стиле дорожного сундука."
            cta="Смотреть модель"
            onClick={() => { go("shoecabinet"); }}
          />
          <DropCol
            kicker="Готовые стопки"
            title="Комплекты"
            blurb="Семейные комплекты в&nbsp;едином тоне - для&nbsp;витрин, прихожих и&nbsp;подарка."
            cta="Открыть каталог"
            onClick={() => { go("ensembles"); }}
          />
        </div>
      </div>

      {/* mega-dropdown for bags */}
      <div
        onMouseEnter={openBags}
        onMouseLeave={closeBags}
        style={{
          position: "absolute", left: 0, right: 0, top: "100%",
          background: "var(--cream)",
          borderBottom: "1px solid rgba(0,0,0,0.08)",
          borderTop: "1px solid rgba(0,0,0,0.06)",
          overflow: "hidden",
          maxHeight: bagsOpen ? 360 : 0,
          opacity: bagsOpen ? 1 : 0,
          transition: "max-height 360ms cubic-bezier(0.2, 0.7, 0.2, 1), opacity 220ms ease",
          pointerEvents: bagsOpen ? "auto" : "none",
        }}
      >
        <div style={{
          maxWidth: 1480, margin: "0 auto", padding: "40px 40px 48px",
          display: "grid", gridTemplateColumns: "1.3fr 1fr 1fr 1fr", gap: 56,
        }}>
          <div>
            <Eyebrow>Школьная коллекция</Eyebrow>
            <h3 style={{
              fontFamily: "'Cormorant Garamond', serif", fontWeight: 300,
              fontSize: 32, lineHeight: 1.1, margin: "16px 0 12px",
              fontStyle: "italic",
            }}>Ранцы, портфели <br />и&nbsp;школьные сумки</h3>
            <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 13, lineHeight: 1.65, color: "rgba(0,0,0,0.65)", maxWidth: 320, margin: 0 }}>
              Каждая модель - на&nbsp;фабрике по&nbsp;нашим стандартам: кожа, металл, прочные швы.
            </p>
          </div>

          <DropCol
            kicker="Для джентльменов"
            title="Юным путешественникам"
            blurb="Сдержанные тона, металлическая фурнитура и&nbsp;прочные швы."
            cta="Смотреть коллекцию"
            onClick={() => { go("bags", "gentlemen"); }}
          />
          <DropCol
            kicker="Для принцесс"
            title="Маленьким придворным дамам"
            blurb="Пастельная кожа, прочные застёжки, отделение для&nbsp;маленьких секретов."
            cta="Смотреть коллекцию"
            onClick={() => { go("bags", "princesses"); }}
          />
          <DropCol
            kicker="Полный каталог"
            title="Все модели"
            blurb="Базовая линия в&nbsp;нейтральных тонах - веганская кожа."
            cta="Открыть каталог"
            onClick={() => { go("bags", "all"); }}
          />
        </div>
      </div>
    </header>
  );
}

/* ---------- Mobile header ---------- */
function MobileHeader({ route, setRoute }) {
  const auth = useAuth();
  const [open, setOpen] = useState(false);
  const [scrolled, setScrolled] = useState(false);

  useEffect(() => {
    const onScroll = () => setScrolled(window.scrollY > 20);
    window.addEventListener("scroll", onScroll);
    return () => window.removeEventListener("scroll", onScroll);
  }, []);

  // Блокируем прокрутку body, пока открыто меню
  useEffect(() => {
    document.body.style.overflow = open ? "hidden" : "";
    return () => { document.body.style.overflow = ""; };
  }, [open]);

  const go = (r, filter) => {
    setRoute(r, filter);
    setOpen(false);
  };

  const Item = ({ label, r, filter, indent }) => {
    const active = filter ? false : route === r;
    return (
      <button
        onClick={() => go(r, filter)}
        style={{
          all: "unset", cursor: "pointer", display: "block", width: "100%",
          padding: indent ? "12px 0 12px 20px" : "16px 0",
          fontFamily: indent ? "'Manrope', sans-serif" : "'Cormorant Garamond', serif",
          fontStyle: indent ? "normal" : "italic",
          fontSize: indent ? 14 : 26,
          letterSpacing: indent ? "0.04em" : "0.01em",
          color: active ? "var(--ink)" : indent ? "rgba(0,0,0,0.6)" : "var(--ink)",
          borderBottom: indent ? "none" : "1px solid rgba(0,0,0,0.08)",
        }}
      >
        {label}
      </button>
    );
  };

  return (
    <header style={{
      position: "fixed", top: 0, left: 0, right: 0, zIndex: 50,
      background: scrolled || open ? "rgba(248,243,234,0.96)" : "rgba(248,243,234,0.8)",
      backdropFilter: "blur(14px)", WebkitBackdropFilter: "blur(14px)",
      borderBottom: `1px solid ${scrolled ? "rgba(0,0,0,0.08)" : "rgba(0,0,0,0.04)"}`,
      transition: "background 240ms ease",
    }}>
      {/* top bar */}
      <div style={{
        height: 58, padding: "0 18px",
        display: "grid", gridTemplateColumns: "44px 1fr 44px", alignItems: "center",
      }}>
        {/* hamburger / close */}
        <button
          onClick={() => setOpen(o => !o)}
          aria-label={open ? "Закрыть меню" : "Открыть меню"}
          style={{
            all: "unset", cursor: "pointer", width: 44, height: 44,
            display: "flex", flexDirection: "column", justifyContent: "center", gap: 5,
          }}
        >
          <span style={{ display: "block", width: 22, height: 1.5, background: "var(--ink)", transition: "transform 240ms ease", transform: open ? "translateY(6.5px) rotate(45deg)" : "none" }} />
          <span style={{ display: "block", width: 22, height: 1.5, background: "var(--ink)", transition: "opacity 200ms ease", opacity: open ? 0 : 1 }} />
          <span style={{ display: "block", width: 22, height: 1.5, background: "var(--ink)", transition: "transform 240ms ease", transform: open ? "translateY(-6.5px) rotate(-45deg)" : "none" }} />
        </button>

        {/* wordmark */}
        <button
          onClick={() => go("home")}
          style={{
            all: "unset", cursor: "pointer", textAlign: "center",
            fontFamily: "'Cormorant Garamond', serif", fontWeight: 400,
            fontSize: 15, letterSpacing: "0.2em", color: "var(--ink)",
            textTransform: "uppercase", lineHeight: 1, whiteSpace: "nowrap",
          }}
        >
          Royal&nbsp;Harmony
        </button>

        {/* account */}
        <button
          onClick={() => go(auth.isAuthed ? "account" : "login")}
          aria-label="Аккаунт"
          style={{
            all: "unset", cursor: "pointer", width: 44, height: 44,
            display: "flex", alignItems: "center", justifyContent: "flex-end",
            fontSize: 20, color: route === "account" ? "var(--ink)" : "rgba(0,0,0,0.7)",
          }}
        >
          ⌾
        </button>
      </div>

      {/* slide-down panel. Высоту задаём явно: у header стоит backdrop-filter,
          из-за чего он становится containing-block для fixed-потомков, и bottom:0
          посчитался бы от 58px-шапки. */}
      <div style={{
        position: "fixed", top: 58, left: 0, right: 0, height: "calc(100dvh - 58px)",
        background: "var(--cream)",
        transform: open ? "translateY(0)" : "translateY(-8px)",
        opacity: open ? 1 : 0,
        pointerEvents: open ? "auto" : "none",
        transition: "opacity 260ms ease, transform 260ms ease",
        overflowY: "auto",
        WebkitOverflowScrolling: "touch",
      }}>
        <nav style={{ padding: "12px 24px 40px" }}>
          <Item label="Главная" r="home" />

          <div style={{ padding: "16px 0", borderBottom: "1px solid rgba(0,0,0,0.08)" }}>
            <button onClick={() => go("trunks")} style={{
              all: "unset", cursor: "pointer", display: "block",
              fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: 26, color: "var(--ink)",
            }}>Чемоданы</button>
            <Item label="Сундуки" r="trunks" indent />
            <Item label="Круги" r="rounds" indent />
            <Item label="Обувница" r="shoecabinet" indent />
            <Item label="Комплекты" r="ensembles" indent />
          </div>

          <div style={{ padding: "16px 0", borderBottom: "1px solid rgba(0,0,0,0.08)" }}>
            <button onClick={() => go("bags", "all")} style={{
              all: "unset", cursor: "pointer", display: "block",
              fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: 26, color: "var(--ink)",
            }}>Сумки</button>
            <Item label="Все модели" r="bags" filter="all" indent />
            <Item label="Для джентльменов" r="bags" filter="gentlemen" indent />
            <Item label="Для принцесс" r="bags" filter="princesses" indent />
          </div>

          <Item label="О нас" r="about" />
          <Item label="Контакты" r="contact" />

          {/* auth */}
          <div style={{ marginTop: 28, paddingTop: 24, borderTop: "1px solid rgba(0,0,0,0.12)" }}>
            {auth.isLoading ? null : auth.isAuthed ? (
              <div style={{ display: "flex", flexDirection: "column", gap: 16 }}>
                <button onClick={() => go("account")} style={authLinkStyle}>
                  {auth.user.name ? auth.user.name : "Личный кабинет"}
                </button>
                <button onClick={async () => { await auth.logout(); go("home"); }} style={{ ...authLinkStyle, color: "rgba(0,0,0,0.5)" }}>
                  Выйти
                </button>
              </div>
            ) : (
              <div style={{ display: "flex", gap: 14 }}>
                <button onClick={() => go("login")} style={{
                  all: "unset", cursor: "pointer", flex: 1, textAlign: "center",
                  fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.18em",
                  textTransform: "uppercase", color: "var(--cream)", background: "var(--ink)",
                  padding: "15px 0",
                }}>Войти</button>
                <button onClick={() => go("register")} style={{
                  all: "unset", cursor: "pointer", flex: 1, textAlign: "center",
                  fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.18em",
                  textTransform: "uppercase", color: "var(--ink)", border: "1px solid var(--ink)",
                  padding: "14px 0",
                }}>Создать</button>
              </div>
            )}
          </div>

          <div style={{
            marginTop: 32, fontFamily: "'Manrope', sans-serif", fontSize: 10.5,
            letterSpacing: "0.2em", textTransform: "uppercase", color: "rgba(0,0,0,0.45)", lineHeight: 2,
          }}>
            Ручная работа · С 2001 года
          </div>
        </nav>
      </div>
    </header>
  );
}

const authLinkStyle = {
  all: "unset", cursor: "pointer",
  fontFamily: "'Manrope', sans-serif", fontSize: 13, letterSpacing: "0.18em",
  textTransform: "uppercase", color: "var(--ink)",
};

function DropCol({ kicker, title, blurb, cta, onClick }) {
  return (
    <div>
      <Eyebrow>{kicker}</Eyebrow>
      <h4 style={{
        fontFamily: "'Cormorant Garamond', serif", fontWeight: 400, fontStyle: "italic",
        fontSize: 22, margin: "14px 0 10px", lineHeight: 1.15,
      }} dangerouslySetInnerHTML={{ __html: title }} />
      <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 12.5, lineHeight: 1.6, color: "rgba(0,0,0,0.6)", margin: "0 0 18px" }}
         dangerouslySetInnerHTML={{ __html: blurb }} />
      <button
        onClick={onClick}
        style={{
          all: "unset", cursor: "pointer",
          fontFamily: "'Manrope', sans-serif", fontSize: 12,
          letterSpacing: "0.16em", textTransform: "uppercase",
          color: "var(--ink)", borderBottom: "1px solid var(--ink)",
          paddingBottom: 4,
        }}
      >{cta} <span style={{ marginLeft: 4 }}>→</span></button>
    </div>
  );
}

window.Header = Header;
