/* Hero full-width slider — analog tuning slider only (no headline).
   Ported from web/app/components/HeroHeadline.tsx — drag, click-to-
   jump, keyboard, haptic guide-crossings, intro nudge — all retained.
   Hooks aliased so they don't collide with pages.jsx / hero-v2.jsx. */

const {
  useState:    useStateHS,
  useEffect:   useEffectHS,
  useRef:      useRefHS,
  useCallback: useCallbackHS,
} = React;

const HS_HANDLE_W = 76;
const HS_HANDLE_H = 52;
const HS_GUIDES = [
  { pos: 0.25, kind: "side"   },
  { pos: 0.5,  kind: "center" },
  { pos: 0.75, kind: "side"   },
];
const HS_DEMO_PEAK = 0.02;

function HeroSlider() {
  const [value, setValue] = useStateHS(0);
  const [dragging, setDragging] = useStateHS(false);
  const [hasInteracted, setHasInteracted] = useStateHS(false);
  const tunerRef = useRefHS(null);
  const lastValueRef = useRefHS(0);
  const gripOffsetRef = useRefHS(0);
  const userInteractedRef = useRefHS(false);

  const markInteracted = useCallbackHS(() => {
    userInteractedRef.current = true;
    setHasInteracted(true);
  }, []);

  /* Expose the slider progress (0-100) as a CSS custom property on
     <html> so the "obvious" letters can colour themselves. Gate it on
     hasInteracted so the silent demo nudge doesn't tint letters. */
  useEffectHS(() => {
    const pct = hasInteracted ? value * 100 : 0;
    document.documentElement.style.setProperty("--slider-pct", String(pct));
  }, [value, hasInteracted]);

  const haptic = useCallbackHS((ms) => {
    if (typeof navigator !== "undefined" && typeof navigator.vibrate === "function") {
      try { navigator.vibrate(ms); } catch (e) {}
    }
  }, []);

  const commitValue = useCallbackHS((next) => {
    const prev = lastValueRef.current;
    for (const g of HS_GUIDES) {
      const crossed =
        (prev < g.pos && next >= g.pos) ||
        (prev > g.pos && next <= g.pos);
      if (crossed) haptic(g.kind === "center" ? 14 : 8);
    }
    lastValueRef.current = next;
    setValue(next);
  }, [haptic]);

  const updateFromClientX = useCallbackHS((clientX) => {
    const el = tunerRef.current;
    if (!el) return;
    const rect = el.getBoundingClientRect();
    const v = Math.max(
      0,
      Math.min(1, (clientX - rect.left - gripOffsetRef.current) / rect.width)
    );
    commitValue(v);
  }, [commitValue]);

  useEffectHS(() => {
    if (!dragging) return;
    const onMove = (e) => updateFromClientX(e.clientX);
    const stop = () => setDragging(false);
    window.addEventListener("pointermove", onMove);
    window.addEventListener("pointerup", stop);
    window.addEventListener("pointercancel", stop);
    window.addEventListener("blur", stop);
    return () => {
      window.removeEventListener("pointermove", onMove);
      window.removeEventListener("pointerup", stop);
      window.removeEventListener("pointercancel", stop);
      window.removeEventListener("blur", stop);
    };
  }, [dragging, updateFromClientX]);

  const handlePointerDown = (e) => {
    e.preventDefault();
    markInteracted();
    gripOffsetRef.current = 0;
    setDragging(true);
    updateFromClientX(e.clientX);
  };

  const handleHandlePointerDown = (e) => {
    e.preventDefault();
    e.stopPropagation();
    markInteracted();
    const el = tunerRef.current;
    if (el) {
      const rect = el.getBoundingClientRect();
      const handleCenterPx = lastValueRef.current * rect.width;
      gripOffsetRef.current = e.clientX - rect.left - handleCenterPx;
    }
    setDragging(true);
  };

  const handleKeyDown = (e) => {
    if (e.key === "ArrowLeft") {
      e.preventDefault();
      markInteracted();
      commitValue(Math.max(0, lastValueRef.current - 0.04));
    } else if (e.key === "ArrowRight") {
      e.preventDefault();
      markInteracted();
      commitValue(Math.min(1, lastValueRef.current + 0.04));
    } else if (e.key === "Home") {
      e.preventDefault();
      markInteracted();
      commitValue(0);
    } else if (e.key === "End") {
      e.preventDefault();
      markInteracted();
      commitValue(1);
    }
  };

  /* Demo nudge: bumps the handle right ~5% and back every 3s until
     the user interacts. setValue (not commitValue) keeps haptics
     silent and lastValueRef untouched. */
  useEffectHS(() => {
    let backTimer = null;
    const playNudge = () => {
      if (userInteractedRef.current) return;
      setValue(HS_DEMO_PEAK);
      backTimer = setTimeout(() => {
        if (!userInteractedRef.current) setValue(0);
      }, 800);
    };
    const firstTimer = setTimeout(playNudge, 900);
    const intervalId = setInterval(() => {
      if (userInteractedRef.current) {
        clearInterval(intervalId);
        return;
      }
      playNudge();
    }, 3000);
    return () => {
      clearTimeout(firstTimer);
      if (backTimer) clearTimeout(backTimer);
      clearInterval(intervalId);
    };
  }, []);

  const fillStyle = { width: `${value * 100}%`, background: "var(--accent)" };

  return (
    <div className="hero-slider">
      <div
        ref={tunerRef}
        className={"hero-tuner " + (dragging ? "is-dragging" : "")}
        role="slider"
        aria-label="Tune the colour of obvious"
        aria-valuemin={0}
        aria-valuemax={100}
        aria-valuenow={Math.round(value * 100)}
        tabIndex={0}
        onPointerDown={handlePointerDown}
        onKeyDown={handleKeyDown}
      >
        <div className="hero-tuner-guides hero-tuner-guides--top" aria-hidden>
          {HS_GUIDES.map((g, i) => (
            <span
              key={"t-" + i}
              className={"hero-tuner-guide hero-tuner-guide--" + g.kind}
              style={{ left: `${g.pos * 100}%` }}
            />
          ))}
        </div>

        <div className="hero-tuner-track" aria-hidden>
          <div className="hero-tuner-track-fill" style={fillStyle} />
        </div>

        <div className="hero-tuner-guides hero-tuner-guides--bottom" aria-hidden>
          {HS_GUIDES.map((g, i) => (
            <span
              key={"b-" + i}
              className={"hero-tuner-guide hero-tuner-guide--" + g.kind}
              style={{ left: `${g.pos * 100}%` }}
            />
          ))}
        </div>

        <div
          className="hero-tuner-handle"
          aria-hidden
          onPointerDown={handleHandlePointerDown}
          style={{ left: `${value * 100}%` }}
        >
          {/* Light keycap */}
          <svg
            className="hero-tuner-handle-svg hero-tuner-handle-svg--light"
            viewBox="0 0 56 38"
            width={HS_HANDLE_W}
            height={HS_HANDLE_H}
            fill="none"
            xmlns="http://www.w3.org/2000/svg"
            preserveAspectRatio="xMidYMid meet"
          >
            <mask id="hs-mask-0" style={{ maskType: "luminance" }} maskUnits="userSpaceOnUse" x="0" y="0" width="56" height="38">
              <path d="M39.796 0H15.476C6.929 0 0 6.611 0 14.763v8.012c0 8.153 6.929 14.762 15.476 14.762h24.325c8.544 0 15.471-6.608 15.471-14.759V14.763C55.272 6.611 48.343 0 39.796 0Z" fill="#fff" />
            </mask>
            <g mask="url(#hs-mask-0)">
              <path d="M39.796 0H15.476C6.929 0 0 6.611 0 14.763v8.012c0 8.153 6.929 14.762 15.476 14.762h24.325c8.544 0 15.471-6.608 15.471-14.759V14.763C55.272 6.611 48.343 0 39.796 0Z" fill="url(#hs-grad-body)" />
            </g>
            <mask id="hs-mask-1" style={{ maskType: "luminance" }} maskUnits="userSpaceOnUse" x="30" y="3" width="23" height="32">
              <path d="M42.644 34.72h-1.367c-5.695 0-10.309-4.616-10.309-10.31V13.749c0-5.694 4.614-10.308 10.309-10.308h1.367c5.695 0 10.31 4.614 10.31 10.308V24.41c0 5.694-4.615 10.31-10.31 10.31Z" fill="#fff" />
            </mask>
            <g mask="url(#hs-mask-1)">
              <path d="M42.644 34.72h-1.367c-5.695 0-10.309-4.616-10.309-10.31V13.749c0-5.694 4.614-10.308 10.309-10.308h1.367c5.695 0 10.31 4.614 10.31 10.308V24.41c0 5.694-4.615 10.31-10.31 10.31Z" fill="url(#hs-grad-right)" />
            </g>
            <mask id="hs-mask-2" style={{ maskType: "luminance" }} maskUnits="userSpaceOnUse" x="2" y="3" width="23" height="32">
              <path d="M14.541 34.72h-1.367c-5.693 0-10.309-4.616-10.309-10.31V13.749c0-5.694 4.616-10.308 10.309-10.308h1.367c5.694 0 10.309 4.614 10.309 10.308V24.41c0 5.694-4.615 10.31-10.31 10.31Z" fill="#fff" />
            </mask>
            <g mask="url(#hs-mask-2)">
              <path d="M14.541 34.72h-1.367c-5.693 0-10.309-4.616-10.309-10.31V13.749c0-5.694 4.616-10.308 10.309-10.308h1.367c5.694 0 10.309 4.614 10.309 10.308V24.41c0 5.694-4.615 10.31-10.31 10.31Z" fill="url(#hs-grad-left)" />
            </g>
            <defs>
              <radialGradient id="hs-grad-body" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(42.0111 37.3243 -35.6037 40.0744 0.668 -2.748)">
                <stop stopColor="#ffffff" /><stop offset="0.241315" stopColor="#ffffff" /><stop offset="1" stopColor="#D8DAF1" />
              </radialGradient>
              <radialGradient id="hs-grad-right" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(30.8387 3.78404) rotate(26.6475) scale(59.9905 32.3213)">
                <stop stopColor="#C7CAEA" /><stop offset="0.758685" stopColor="#ffffff" /><stop offset="1" stopColor="#ffffff" />
              </radialGradient>
              <radialGradient id="hs-grad-left" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(2.736 3.78404) rotate(26.6475) scale(59.9905 32.3213)">
                <stop stopColor="#C7CAEA" /><stop offset="0.758685" stopColor="#ffffff" /><stop offset="1" stopColor="#ffffff" />
              </radialGradient>
            </defs>
          </svg>

          {/* Dark keycap */}
          <svg
            className="hero-tuner-handle-svg hero-tuner-handle-svg--dark"
            viewBox="0 0 56 38"
            width={HS_HANDLE_W}
            height={HS_HANDLE_H}
            fill="none"
            xmlns="http://www.w3.org/2000/svg"
            preserveAspectRatio="xMidYMid meet"
          >
            <mask id="hs-mask-0-d" style={{ maskType: "luminance" }} maskUnits="userSpaceOnUse" x="0" y="0" width="56" height="38">
              <path d="M39.796 0H15.476C6.929 0 0 6.611 0 14.763v8.012c0 8.153 6.929 14.762 15.476 14.762h24.325c8.544 0 15.471-6.608 15.471-14.759V14.763C55.272 6.611 48.343 0 39.796 0Z" fill="#fff" />
            </mask>
            <g mask="url(#hs-mask-0-d)">
              <path d="M39.796 0H15.476C6.929 0 0 6.611 0 14.763v8.012c0 8.153 6.929 14.762 15.476 14.762h24.325c8.544 0 15.471-6.608 15.471-14.759V14.763C55.272 6.611 48.343 0 39.796 0Z" fill="url(#hs-grad-body-d)" />
            </g>
            <mask id="hs-mask-1-d" style={{ maskType: "luminance" }} maskUnits="userSpaceOnUse" x="30" y="3" width="23" height="32">
              <path d="M42.644 34.72h-1.367c-5.695 0-10.309-4.616-10.309-10.31V13.749c0-5.694 4.614-10.308 10.309-10.308h1.367c5.695 0 10.31 4.614 10.31 10.308V24.41c0 5.694-4.615 10.31-10.31 10.31Z" fill="#fff" />
            </mask>
            <g mask="url(#hs-mask-1-d)">
              <path d="M42.644 34.72h-1.367c-5.695 0-10.309-4.616-10.309-10.31V13.749c0-5.694 4.614-10.308 10.309-10.308h1.367c5.695 0 10.31 4.614 10.31 10.308V24.41c0 5.694-4.615 10.31-10.31 10.31Z" fill="url(#hs-grad-right-d)" />
            </g>
            <mask id="hs-mask-2-d" style={{ maskType: "luminance" }} maskUnits="userSpaceOnUse" x="2" y="3" width="23" height="32">
              <path d="M14.541 34.72h-1.367c-5.693 0-10.309-4.616-10.309-10.31V13.749c0-5.694 4.616-10.308 10.309-10.308h1.367c5.694 0 10.309 4.614 10.309 10.308V24.41c0 5.694-4.615 10.31-10.31 10.31Z" fill="#fff" />
            </mask>
            <g mask="url(#hs-mask-2-d)">
              <path d="M14.541 34.72h-1.367c-5.693 0-10.309-4.616-10.309-10.31V13.749c0-5.694 4.616-10.308 10.309-10.308h1.367c5.694 0 10.309 4.614 10.309 10.308V24.41c0 5.694-4.615 10.31-10.31 10.31Z" fill="url(#hs-grad-left-d)" />
            </g>
            <defs>
              <radialGradient id="hs-grad-body-d" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(42.0111 37.3243 -35.6037 40.0744 0.668 -2.748)">
                <stop stopColor="#EDEEF5" /><stop offset="0.241315" stopColor="#EDEEF5" /><stop offset="1" stopColor="#BCBFD4" />
              </radialGradient>
              <radialGradient id="hs-grad-right-d" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(30.8387 3.78404) rotate(26.6475) scale(59.9905 32.3213)">
                <stop stopColor="#ADB1CB" /><stop offset="0.758685" stopColor="#EDEEF5" /><stop offset="1" stopColor="#EDEEF5" />
              </radialGradient>
              <radialGradient id="hs-grad-left-d" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(2.736 3.78404) rotate(26.6475) scale(59.9905 32.3213)">
                <stop stopColor="#ADB1CB" /><stop offset="0.758685" stopColor="#EDEEF5" /><stop offset="1" stopColor="#EDEEF5" />
              </radialGradient>
            </defs>
          </svg>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { HeroSlider });
