// components.jsx — Shared brand pieces (v2)

const { useState: useStateC, useEffect: useEffectC, useRef: useRefC } = React;

/* =============================================
   LOGO — wraps the real PNG crest
   ============================================= */
function Logo({ size = 40, alt = "WRÖK", className = "", style = {} }) {
  return (
    <img
      src="/assets/wrok-logo.png"
      alt={alt}
      width={size}
      height={size * 1.16}
      className={className}
      style={{ display: "block", height: "auto", ...style, width: size }}
    />
  );
}

/* =============================================
   ARROW
   ============================================= */
function Arrow({ size = 14 }) {
  return (
    <svg width={size} height={size} viewBox="0 0 16 16" className="arrow" fill="none">
      <path
        d="M3 8h10M9 4l4 4-4 4"
        stroke="currentColor"
        strokeWidth="1.75"
        strokeLinecap="square"
      />
    </svg>
  );
}

/* =============================================
   TICKER — stadium-style scrolling text
   ============================================= */
function Ticker({ items, dark = false }) {
  const doubled = [...items, ...items];
  return (
    <div className={"ticker" + (dark ? " ticker--ink" : "")}>
      <div className="ticker__track">
        {doubled.map((item, i) => (
          <span className="ticker__item" key={i}>
            {item}
          </span>
        ))}
      </div>
    </div>
  );
}

/* =============================================
   NAVBAR
   ============================================= */
function NavBar() {
  const isActive = useIsActive();
  const [open, setOpen] = useStateC(false);
  const [supportOpen, setSupportOpen] = useStateC(false);
  const [aboutOpen, setAboutOpen] = useStateC(false);
  const [rugbyOpen, setRugbyOpen] = useStateC(false);

  useEffectC(() => {
    const close = () => {
      setOpen(false);
      setSupportOpen(false);
      setAboutOpen(false);
      setRugbyOpen(false);
    };
    window.addEventListener("popstate", close);
    return () => window.removeEventListener("popstate", close);
  }, []);

  useEffectC(() => {
    const handler = (e) => {
      if (!e.target.closest(".nav__dropdown")) {
        setSupportOpen(false);
        setAboutOpen(false);
        setRugbyOpen(false);
      }
    };
    document.addEventListener("click", handler);
    return () => document.removeEventListener("click", handler);
  }, []);

  return (
    <header className="nav">
      <div className="nav__inner">
        <Link to="/" className="nav__brand">
          <img src="/assets/wrok-logo.png" alt="WRÖK" className="nav__brand-img" />
          <span className="nav__brandname">WRÖK</span>
        </Link>

        <nav className={"nav__menu " + (open ? "nav__menu--open" : "")}>
          <Link to="/" className={"nav__link " + (isActive("/", true) ? "is-active" : "")}>
            Start
          </Link>
          <Link to="/team" className={"nav__link " + (isActive("/team") ? "is-active" : "")}>
            Laget
          </Link>
          <Link to="/tour" className={"nav__link " + (isActive("/tour") ? "is-active" : "")}>
            Touren
          </Link>

          <div className="nav__dropdown">
            <button
              className={"nav__link nav__link--btn " + (isActive("/rugby") ? "is-active" : "")}
              onClick={(e) => {
                e.stopPropagation();
                setRugbyOpen((v) => !v);
                setAboutOpen(false);
                setSupportOpen(false);
              }}
              aria-expanded={rugbyOpen}
            >
              Rugby
              <svg width="10" height="10" viewBox="0 0 10 10" style={{ marginLeft: 6 }}>
                <path d="M2 3 L5 7 L8 3" stroke="currentColor" strokeWidth="1.6" fill="none" />
              </svg>
            </button>
            {rugbyOpen && (
              <div className="nav__menu-panel">
                <Link to="/rugby" className="nav__menu-item">
                  <span className="nav__menu-label">Historia</span>
                  <span className="nav__menu-sub">Sportens ursprung</span>
                </Link>
                <Link to="/rugby/regler" className="nav__menu-item">
                  <span className="nav__menu-label">Regler</span>
                  <span className="nav__menu-sub">Hur spelet fungerar</span>
                </Link>
                <Link to="/rugby/aldersgrupper" className="nav__menu-item">
                  <span className="nav__menu-label">Åldersgrupper</span>
                  <span className="nav__menu-sub">U6 till senior</span>
                </Link>
              </div>
            )}
          </div>

          <Link to="/guider" className={"nav__link " + (isActive("/guider") ? "is-active" : "")}>
            Guider
          </Link>

          <div className="nav__dropdown">
            <button
              className={"nav__link nav__link--btn " + (isActive("/about") ? "is-active" : "")}
              onClick={(e) => {
                e.stopPropagation();
                setAboutOpen((v) => !v);
                setSupportOpen(false);
                setRugbyOpen(false);
              }}
              aria-expanded={aboutOpen}
            >
              Om oss
              <svg width="10" height="10" viewBox="0 0 10 10" style={{ marginLeft: 6 }}>
                <path d="M2 3 L5 7 L8 3" stroke="currentColor" strokeWidth="1.6" fill="none" />
              </svg>
            </button>
            {aboutOpen && (
              <div className="nav__menu-panel">
                <Link to="/about" className="nav__menu-item">
                  <span className="nav__menu-label">Historia</span>
                  <span className="nav__menu-sub">Hur det började</span>
                </Link>
                <Link to="/about/purpose" className="nav__menu-item">
                  <span className="nav__menu-label">Syfte &amp; mål</span>
                  <span className="nav__menu-sub">Varför vi finns</span>
                </Link>
                <Link to="/about/connection" className="nav__menu-item">
                  <span className="nav__menu-label">VRK-kopplingen</span>
                  <span className="nav__menu-sub">Vänersborgs Rugbyklubb</span>
                </Link>
                <Link to="/about/contact" className="nav__menu-item">
                  <span className="nav__menu-label">Kontakt</span>
                  <span className="nav__menu-sub">Hör av dig</span>
                </Link>
              </div>
            )}
          </div>

          <div className="nav__dropdown">
            <button
              className={"nav__link nav__link--btn " + (isActive("/support") ? "is-active" : "")}
              onClick={(e) => {
                e.stopPropagation();
                setSupportOpen((v) => !v);
                setAboutOpen(false);
                setRugbyOpen(false);
              }}
              aria-expanded={supportOpen}
            >
              Stötta
              <svg width="10" height="10" viewBox="0 0 10 10" style={{ marginLeft: 6 }}>
                <path d="M2 3 L5 7 L8 3" stroke="currentColor" strokeWidth="1.6" fill="none" />
              </svg>
            </button>
            {supportOpen && (
              <div className="nav__menu-panel">
                <Link to="/support/donate" className="nav__menu-item">
                  <span className="nav__menu-label">Donera</span>
                  <span className="nav__menu-sub">Swish, bankgiro</span>
                </Link>
                <Link to="/support/sponsor" className="nav__menu-item">
                  <span className="nav__menu-label">Bli sponsor</span>
                  <span className="nav__menu-sub">För företag</span>
                </Link>
                <Link to="/support/partners" className="nav__menu-item">
                  <span className="nav__menu-label">Våra partners</span>
                  <span className="nav__menu-sub">Befintliga sponsorer</span>
                </Link>
                <Link to="/support/shop" className="nav__menu-item">
                  <span className="nav__menu-label">Shop</span>
                  <span className="nav__menu-sub">Amazon Creator Store</span>
                </Link>
                <Link to="/support/sales" className="nav__menu-item">
                  <span className="nav__menu-label">Försäljningar</span>
                  <span className="nav__menu-sub">Aktuella kampanjer</span>
                </Link>
                <Link to="/support/faq" className="nav__menu-item">
                  <span className="nav__menu-label">FAQ</span>
                  <span className="nav__menu-sub">Vanliga frågor</span>
                </Link>
              </div>
            )}
          </div>
        </nav>

        <div className="nav__cta">
          <Link to="/support/donate" className="btn btn--maroon btn--sm">
            Stötta touren <Arrow />
          </Link>
        </div>

        <button
          className="nav__burger"
          onClick={() => setOpen((v) => !v)}
          aria-label="Öppna meny"
          aria-expanded={open}
        >
          <span className={"nav__burger-line " + (open ? "nav__burger-line--top" : "")} />
          <span className={"nav__burger-line " + (open ? "nav__burger-line--mid" : "")} />
          <span className={"nav__burger-line " + (open ? "nav__burger-line--bot" : "")} />
        </button>
      </div>
    </header>
  );
}

/* =============================================
   FOOTER
   ============================================= */
function Footer() {
  const { data: sponsors } = useSponsors();
  const activeSponsors = sponsors ? sponsors.filter((s) => s.active) : [];

  return (
    <footer className="footer">
      {activeSponsors.length > 0 && (
        <div className="footer__sponsors">
          <div className="wrap">
            <p className="eyebrow eyebrow--paper" style={{ textAlign: "center", marginBottom: 24 }}>
              Företag som hjälper laget framåt
            </p>
            <div className="footer__sponsor-row">
              {activeSponsors.map((s) =>
                s.url ? (
                  <a key={s._id} href={s.url} className="footer__sponsor" target="_blank" rel="noopener noreferrer">
                    {s.name}
                  </a>
                ) : (
                  <span key={s._id} className="footer__sponsor">{s.name}</span>
                )
              )}
            </div>
          </div>
        </div>
      )}

      <div className="footer__main">
        <div className="wrap">
          <div className="footer__grid">
            <div className="footer__col footer__brand">
              <img src="/assets/wrok-logo.png" alt="WRÖK" className="footer__brand-logo" />
              <p className="footer__brand-name">WRÖK</p>
              <p className="footer__brand-motto">En resa · Flera mål</p>
              <p className="footer__brand-desc">
                En ideell förening som samlar laget, engagemanget och
                drömmen om en gemensam tour söderut.
              </p>
            </div>

            <div className="footer__col">
              <p className="eyebrow eyebrow--paper">Sidor</p>
              <ul className="footer__links">
                <li><Link to="/">Start</Link></li>
                <li><Link to="/team">Laget</Link></li>
                <li><Link to="/tour">Touren</Link></li>
                <li><Link to="/rugby">Rugby</Link></li>
                <li><Link to="/guider">Guider</Link></li>
                <li><Link to="/about">Om oss</Link></li>
              </ul>
            </div>

            <div className="footer__col">
              <p className="eyebrow eyebrow--paper">Stötta</p>
              <ul className="footer__links">
                <li><Link to="/support/donate">Donera</Link></li>
                <li><Link to="/support/sponsor">Bli sponsor</Link></li>
                <li><Link to="/support/partners">Våra partners</Link></li>
                <li><Link to="/support/shop">Shop</Link></li>
                <li><Link to="/support/sales">Försäljningar</Link></li>
                <li><Link to="/support/faq">FAQ</Link></li>
              </ul>
            </div>

            <div className="footer__col">
              <p className="eyebrow eyebrow--paper">Kontakt</p>
              <ul className="footer__links">
                <li><a href="mailto:info@wrok.se">info@wrok.se</a></li>
                <li><Link to="/about/contact">Kontaktformulär</Link></li>
              </ul>
              <div className="footer__social">
                <a href="https://www.instagram.com/wrokrugby/" target="_blank" rel="noopener noreferrer" aria-label="Instagram">
                  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
                    <rect x="2" y="2" width="20" height="20" rx="5" ry="5"/>
                    <circle cx="12" cy="12" r="4"/>
                    <circle cx="17.5" cy="6.5" r="1" fill="currentColor" stroke="none"/>
                  </svg>
                </a>
                <a href="https://www.facebook.com/profile.php?id=61578471341956" target="_blank" rel="noopener noreferrer" aria-label="Facebook">
                  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
                    <path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/>
                  </svg>
                </a>
              </div>
            </div>
          </div>

          <div className="footer__bottom">
            <span>© 2026 WRÖK · Est. 2026 · Org.nr 802555-7581</span>
            <span>Allt för laget. Allt för touren.</span>
          </div>
        </div>
      </div>
    </footer>
  );
}

/* =============================================
   PHOTO SLIDER — actionbilder och match-foton
   ============================================= */
function PhotoSlider({ photos, speed, limit }) {
  const spd = speed || 35;
  const cap = limit || 20;

  // Shuffle once when photos load, pick `cap` random ones
  const shown = React.useMemo(() => {
    if (!photos || photos.length === 0) return [];
    const arr = [...photos];
    for (let i = arr.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      [arr[i], arr[j]] = [arr[j], arr[i]];
    }
    return arr.slice(0, cap);
  }, [photos && photos.length]);
  const trackRef  = React.useRef(null);
  const pausedRef = React.useRef(false);
  const posRef    = React.useRef(0);
  const halfRef   = React.useRef(0);

  React.useEffect(() => {
    if (shown.length === 0) return;
    const track = trackRef.current;
    if (!track) return;

    posRef.current  = 0;
    halfRef.current = 0;
    let rafId, lastTs = null;

    const loop = (ts) => {
      if (!halfRef.current && track.children[shown.length]) {
        halfRef.current = track.children[shown.length].offsetLeft;
      }
      if (halfRef.current && lastTs !== null && !pausedRef.current) {
        posRef.current += spd * (ts - lastTs) / 1000;
        if (posRef.current >= halfRef.current) posRef.current -= halfRef.current;
        track.style.transform = `translateX(-${posRef.current}px)`;
      }
      lastTs = ts;
      rafId = requestAnimationFrame(loop);
    };

    let touchStartX = 0, touchStartY = 0, touchStartPos = 0, isHoriz = null;

    const onTouchStart = (e) => {
      pausedRef.current = true;
      touchStartX = e.touches[0].clientX;
      touchStartY = e.touches[0].clientY;
      touchStartPos = posRef.current;
      isHoriz = null;
    };
    const onTouchMove = (e) => {
      if (!halfRef.current) return;
      const dx = e.touches[0].clientX - touchStartX;
      const dy = e.touches[0].clientY - touchStartY;
      if (isHoriz === null) isHoriz = Math.abs(dx) > Math.abs(dy);
      if (!isHoriz) return;
      e.preventDefault();
      posRef.current = ((touchStartPos - dx) % halfRef.current + halfRef.current) % halfRef.current;
      track.style.transform = `translateX(-${posRef.current}px)`;
    };
    const onTouchEnd = () => { setTimeout(() => { pausedRef.current = false; }, 1500); };

    track.addEventListener("touchstart", onTouchStart, { passive: true });
    track.addEventListener("touchmove",  onTouchMove,  { passive: false });
    track.addEventListener("touchend",   onTouchEnd,   { passive: true });
    rafId = requestAnimationFrame(loop);

    return () => {
      cancelAnimationFrame(rafId);
      track.removeEventListener("touchstart", onTouchStart);
      track.removeEventListener("touchmove",  onTouchMove);
      track.removeEventListener("touchend",   onTouchEnd);
    };
  }, [shown.length]);

  const scrollByPhoto = (dir) => {
    const track = trackRef.current;
    if (!track || !halfRef.current) return;
    pausedRef.current = true;
    const step = (track.children[0]?.offsetWidth ?? 400) + 16;
    posRef.current = ((posRef.current + dir * step) % halfRef.current + halfRef.current) % halfRef.current;
    track.style.transform = `translateX(-${posRef.current}px)`;
    setTimeout(() => { pausedRef.current = false; }, 2000);
  };

  if (shown.length === 0) return null;

  return (
    <div className="photo-slider">
      <div className="photo-slider__arrows">
        <button type="button" className="photo-slider__arrow" onClick={() => scrollByPhoto(-1)} aria-label="Föregående">
          <svg width="14" height="14" viewBox="0 0 16 16" fill="none">
            <path d="M13 8H3M7 4L3 8l4 4" stroke="currentColor" strokeWidth="1.75" strokeLinecap="square"/>
          </svg>
        </button>
        <button type="button" className="photo-slider__arrow" onClick={() => scrollByPhoto(1)} aria-label="Nästa">
          <svg width="14" height="14" viewBox="0 0 16 16" fill="none">
            <path d="M3 8h10M9 4l4 4-4 4" stroke="currentColor" strokeWidth="1.75" strokeLinecap="square"/>
          </svg>
        </button>
      </div>
      <div className="photo-slider__track-wrap">
        <div className="photo-slider__track" ref={trackRef}>
          {[...shown, ...shown].map((photo, i) => (
            <figure className="photo-card" key={i}>
              <img src={photo.src} alt={photo.alt} loading="lazy" />
              {photo.caption && (
                <figcaption className="photo-card__caption">{photo.caption}</figcaption>
              )}
            </figure>
          ))}
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { Logo, Arrow, Ticker, NavBar, Footer, PhotoSlider });
