const PROMO_DISMISS_KEY = "ruhland-promo-dismissed";

function usePromoDismiss() {
  const [visible, setVisible] = React.useState(() => {
    try {
      return sessionStorage.getItem(PROMO_DISMISS_KEY) !== "1";
    } catch {
      return true;
    }
  });
  const [leaving, setLeaving] = React.useState(false);

  const dismiss = React.useCallback(() => {
    if (!visible || leaving) return;
    setLeaving(true);
    try {
      sessionStorage.setItem(PROMO_DISMISS_KEY, "1");
    } catch {
      /* ignore quota / private mode */
    }
    window.setTimeout(() => {
      setVisible(false);
      setLeaving(false);
    }, 320);
  }, [visible, leaving]);

  return { visible, leaving, dismiss };
}

function useMobileMenu() {
  const [open, setOpen] = React.useState(false);
  const close = React.useCallback(() => setOpen(false), []);
  const toggle = React.useCallback(() => setOpen((v) => !v), []);

  React.useEffect(() => {
    document.body.style.overflow = open ? "hidden" : "";
    return () => { document.body.style.overflow = ""; };
  }, [open]);

  React.useEffect(() => {
    if (!open) return undefined;
    const onKeyDown = (event) => {
      if (event.key === "Escape") close();
    };
    window.addEventListener("keydown", onKeyDown);
    return () => window.removeEventListener("keydown", onKeyDown);
  }, [open, close]);

  React.useEffect(() => {
    const onResize = () => {
      if (window.matchMedia("(min-width: 901px)").matches) close();
    };
    window.addEventListener("resize", onResize);
    return () => window.removeEventListener("resize", onResize);
  }, [close]);

  return { open, toggle, close };
}

function useStickyCta() {
  React.useEffect(() => {
    const trigger = document.getElementById("trigger-sticky");
    const sticky = document.getElementById("stickySignup");
    if (!trigger || !sticky) return;

    // Only show after the trigger has scrolled *above* the viewport.
    // Using !isIntersecting alone wrongly shows the CTA when the trigger
    // is still below the fold (common on short mobile viewports).
    const sync = () => {
      const past = trigger.getBoundingClientRect().top < 0;
      sticky.classList.toggle("is-visible", past);
    };

    const io = new IntersectionObserver(sync, { threshold: [0, 0.01, 1] });
    io.observe(trigger);
    window.addEventListener("scroll", sync, { passive: true });
    window.addEventListener("resize", sync);
    sync();

    return () => {
      io.disconnect();
      window.removeEventListener("scroll", sync);
      window.removeEventListener("resize", sync);
      sticky.classList.remove("is-visible");
    };
  }, []);
}
