/* On The Limit — website mockup: Header + Footer shell. */
function go(route){ location.hash = '#/' + route; }
window.OTL_go = go;

function useIsMobile(breakpoint) {
  var bp = breakpoint || 768;
  const [isMobile, setIsMobile] = React.useState(window.innerWidth < bp);
  React.useEffect(() => {
    const on = () => setIsMobile(window.innerWidth < bp);
    window.addEventListener('resize', on, { passive:true });
    return () => window.removeEventListener('resize', on);
  }, [bp]);
  return isMobile;
}
window.OTL_useIsMobile = useIsMobile;

function Logo({ size = 52 }) {
  return (
    <a href="#/" onClick={(e)=>{e.preventDefault();go('');}} style={{ display:'flex', alignItems:'center', textDecoration:'none' }}>
      <img src="site/logo.png" height={size} alt="On The Limit logo" style={{ display:'block', width:'auto', flexShrink:0, mixBlendMode:'screen' }}/>
    </a>
  );
}

function NavLogo() {
  const isMobile = useIsMobile();
  return (
    <a href="#/" onClick={(e)=>{e.preventDefault();go('');}} style={{ display:'flex', alignItems:'center', textDecoration:'none' }}>
      <img src="site/logo-nav.png" height={isMobile ? 56 : 80} alt="On The Limit logo" style={{ display:'block', width:'auto', flexShrink:0, mixBlendMode:'screen', WebkitMaskImage:'linear-gradient(to bottom, black 75%, transparent 100%)', maskImage:'linear-gradient(to bottom, black 75%, transparent 100%)' }}/>
    </a>
  );
}

function Header({ route }) {
  const { Button } = window.DesignSystem_494066;
  const { nav, more } = window.OTL_DATA;
  const [openMore, setOpenMore] = React.useState(false);
  const [scrolled, setScrolled] = React.useState(false);
  const [mobileOpen, setMobileOpen] = React.useState(false);
  const isMobile = useIsMobile();
  const moreActive = more.some(m => m.route === route);

  React.useEffect(() => { setMobileOpen(false); setOpenMore(false); }, [route]);

  React.useEffect(() => {
    const on = () => setScrolled(window.scrollY > 12);
    on(); window.addEventListener('scroll', on, { passive:true });
    return () => window.removeEventListener('scroll', on);
  }, []);

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

  const link = (item) => {
    const active = item.route === route;
    return (
      <a key={item.route} href={'#/'+item.route} onClick={(e)=>{e.preventDefault(); e.currentTarget.style.color='#fff'; go(item.route);}}
        style={{
          fontFamily:'var(--font-display)', fontWeight:700, fontSize:12.5,
          letterSpacing:'0.04em', textTransform:'uppercase', textDecoration:'none',
          color: '#fff',
          borderBottom: active ? '2px solid var(--accent)' : '2px solid transparent',
          paddingBottom:4, whiteSpace:'nowrap', transition:'color .2s',
        }}
        onMouseEnter={(e)=>{ if(!active) e.currentTarget.style.color='var(--accent)'; }}
        onMouseLeave={(e)=>{ if(!active) e.currentTarget.style.color='#fff'; }}
      >{item.label}</a>
    );
  };

  const allNav = [...nav, ...more];

  return (
    <header style={{ position:'sticky', top:0, zIndex:60, borderBottom:`1px solid ${(scrolled||mobileOpen)?'var(--border-subtle)':'transparent'}`, boxShadow:scrolled?'0 8px 30px rgba(0,0,0,0.4)':'none', transition:'border-color .35s ease, box-shadow .35s ease' }}>
      <div style={{ position:'absolute', inset:0, zIndex:0, background:'#000' }}/>
      <div style={{ position:'relative', zIndex:1, maxWidth:1200, margin:'0 auto', padding: isMobile ? '0 16px' : (scrolled ? '12px 24px' : '17px 24px'), display:'flex', alignItems:'center', justifyContent:'space-between', gap:16, transition:'padding .35s ease' }}>
        <NavLogo/>
        {isMobile ? (
          <button onClick={()=>setMobileOpen(o=>!o)} aria-label={mobileOpen?'Close menu':'Open menu'}
            style={{ background:'none', border:'none', cursor:'pointer', padding:'12px 4px', display:'flex', flexDirection:'column', gap:5, justifyContent:'center', alignItems:'center', flexShrink:0 }}>
            <span style={{ width:22, height:2, background:'#fff', display:'block', transition:'transform .25s', transform:mobileOpen?'translateY(7px) rotate(45deg)':'none' }}/>
            <span style={{ width:22, height:2, background:'#fff', display:'block', transition:'opacity .25s', opacity:mobileOpen?0:1 }}/>
            <span style={{ width:22, height:2, background:'#fff', display:'block', transition:'transform .25s', transform:mobileOpen?'translateY(-7px) rotate(-45deg)':'none' }}/>
          </button>
        ) : (
          <>
            <nav style={{ display:'flex', alignItems:'center', gap:20 }}>
              {nav.map(link)}
              <div style={{ position:'relative' }}>
                <button onClick={()=>setOpenMore(o=>!o)}
                  style={{ background:'none', border:'none', cursor:'pointer', padding:'0 0 4px',
                    fontFamily:'var(--font-display)', fontWeight:700, fontSize:12.5, letterSpacing:'0.04em', textTransform:'uppercase',
                    color:'#fff',
                    borderBottom:moreActive?'2px solid var(--accent)':'2px solid transparent',
                    display:'flex', alignItems:'center', gap:5 }}>
                  More <span style={{ fontSize:9, transform:openMore?'rotate(180deg)':'none', transition:'transform .2s', display:'inline-block' }}>▼</span>
                </button>
                {openMore && (
                  <>
                    <div onClick={()=>setOpenMore(false)} style={{ position:'fixed', inset:0, zIndex:10 }}/>
                    <div style={{ position:'absolute', top:'calc(100% + 8px)', right:0, minWidth:220, zIndex:11,
                      background:'var(--surface-card)', border:'1px solid var(--border-subtle)', borderRadius:14,
                      boxShadow:'var(--shadow-raised)', padding:8, display:'flex', flexDirection:'column' }}>
                      {more.map(m => (
                        <a key={m.route} href={'#/'+m.route} onClick={(e)=>{e.preventDefault();go(m.route);setOpenMore(false);}}
                          style={{ fontFamily:'var(--font-body)', fontSize:14, color:m.route===route?'var(--accent)':'var(--fog-300)',
                            textDecoration:'none', padding:'10px 12px', borderRadius:9 }}
                          onMouseEnter={(e)=>e.currentTarget.style.background='var(--surface-raised)'}
                          onMouseLeave={(e)=>e.currentTarget.style.background='transparent'}>{m.label}</a>
                      ))}
                    </div>
                  </>
                )}
              </div>
            </nav>
            <Button variant="primary" size="sm" onClick={()=>go('join')}>Join Now</Button>
          </>
        )}
      </div>
      {isMobile && mobileOpen && (
        <div style={{ position:'absolute', top:'100%', left:0, right:0, background:'#000', borderBottom:'1px solid var(--border-subtle)', zIndex:50, maxHeight:'calc(100vh - 80px)', overflowY:'auto' }}>
          <div style={{ padding:'8px 20px 28px' }}>
            {allNav.map(item => (
              <a key={item.route} href={'#/'+item.route} onClick={(e)=>{e.preventDefault();go(item.route);setMobileOpen(false);}}
                style={{ display:'flex', alignItems:'center', justifyContent:'space-between', fontFamily:'var(--font-display)', fontWeight:700, fontSize:15, letterSpacing:'0.04em', textTransform:'uppercase', textDecoration:'none',
                  color:item.route===route?'var(--accent)':'#fff', padding:'14px 0', borderBottom:'1px solid var(--border-subtle)' }}>
                {item.label}
                <span style={{ fontSize:11, opacity:0.4 }}>→</span>
              </a>
            ))}
            <div style={{ marginTop:24 }}>
              <Button variant="primary" size="lg" onClick={()=>{go('join');setMobileOpen(false);}}>Join Now</Button>
            </div>
          </div>
        </div>
      )}
    </header>
  );
}

function Footer() {
  const { Button } = window.DesignSystem_494066;
  const isMobile = useIsMobile();
  const cols = {
    'Train': [['6 Week Foundation','foundation'],['GRIT','grit'],['HYROX','hyrox'],['Studio Classes','studio'],['Gym Floor','gym-floor'],['Personal Training','personal-training']],
    'Visit': [['Timetable','timetable'],['Pricing','pricing'],['Join Now','join'],['Students & Juniors','students-juniors']],
    'About': [['Fitness Team','team'],['FAQs','faqs'],['Contact','contact']],
  };
  return (
    <footer style={{ background:'var(--surface-base)', borderTop:'1px solid var(--border-subtle)' }}>
      <div style={{ maxWidth:1200, margin:'0 auto', padding: isMobile ? '64px 20px 40px' : '88px 24px 56px', textAlign:'center' }}>
        <img src="site/logo.png" height="96" alt="" aria-hidden="true" style={{ display:'block', width:'auto', margin:'0 auto 22px', mixBlendMode:'screen' }}/>
        <h2 style={{ margin:'0 0 20px', fontFamily:'var(--font-display)', fontWeight:800, textTransform:'uppercase', letterSpacing:'-0.02em', lineHeight:1, fontSize:'clamp(32px,5vw,52px)', color:'#fff' }}>
          Ready when <span style={{ color:'var(--accent)' }}>you are</span>
        </h2>
        <Button variant="primary" size="lg" onClick={()=>go('join')}>Join Now</Button>
        <div style={{ display:'flex', gap:10, justifyContent:'center', marginTop:20, flexWrap:'wrap' }}>
          {window.OTL_AppButtons && React.createElement(window.OTL_AppButtons, { size:'sm' })}
        </div>
      </div>
      <div style={{ maxWidth:1200, margin:'0 auto', padding: isMobile ? '0 20px 40px' : '0 24px 56px', display:'grid', gridTemplateColumns: isMobile ? '1fr 1fr' : '1.4fr repeat(3,1fr)', gap: isMobile ? '32px 24px' : 40, borderTop:'1px solid var(--border-subtle)', paddingTop:48 }}>
        <div style={{ gridColumn: isMobile ? '1 / -1' : 'auto' }}>
          <Logo size={36}/>
          <p style={{ fontFamily:'var(--font-body)', fontSize:13, lineHeight:1.6, color:'var(--text-faint)', maxWidth:240, marginTop:14 }}>
            Tring's largest independently-owned fitness gym. Real people. Real results.
          </p>
          <a href="https://www.instagram.com/onthelimitgym" target="_blank" rel="noopener noreferrer"
            style={{ display:'inline-flex', alignItems:'center', gap:8, marginTop:18, textDecoration:'none', color:'var(--text-muted)', transition:'color .2s' }}
            onMouseEnter={e=>e.currentTarget.style.color='var(--accent)'}
            onMouseLeave={e=>e.currentTarget.style.color='var(--text-muted)'}>
            <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" 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="0.8" fill="currentColor" stroke="none"/>
            </svg>
            <span style={{ fontFamily:'var(--font-body)', fontSize:13 }}>@onthelimitgym</span>
          </a>
          <div style={{ marginTop:20 }}>
            <div style={{ fontFamily:'var(--font-display)', fontSize:11, fontWeight:700, letterSpacing:'0.14em', textTransform:'uppercase', color:'var(--text-muted)', marginBottom:10 }}>Opening Hours</div>
            {[['Mon – Fri','06:00 – 20:00'],['Saturday','08:00 – 16:00'],['Sunday','08:00 – 12:00']].map(([day,hrs]) => (
              <div key={day} style={{ display:'flex', justifyContent:'space-between', maxWidth:210, padding:'5px 0', borderBottom:'1px solid var(--border-subtle)' }}>
                <span style={{ fontFamily:'var(--font-body)', fontSize:12, color:'var(--text-faint)' }}>{day}</span>
                <span style={{ fontFamily:'var(--font-body)', fontSize:12, color:'var(--fog-300)' }}>{hrs}</span>
              </div>
            ))}
          </div>
        </div>
        {Object.entries(cols).map(([h,links]) => (
          <div key={h}>
            <div style={{ fontFamily:'var(--font-display)', fontSize:11, fontWeight:700, letterSpacing:'0.14em', textTransform:'uppercase', color:'var(--text-muted)', marginBottom:14 }}>{h}</div>
            <div style={{ display:'flex', flexDirection:'column', gap:9 }}>
              {links.map(([l,r]) => (
                <a key={r} href={'#/'+r} onClick={(e)=>{e.preventDefault();go(r);}} style={{ fontFamily:'var(--font-body)', fontSize:14, color:'var(--fog-300)', textDecoration:'none' }}
                  onMouseEnter={(e)=>e.currentTarget.style.color='var(--accent)'}
                  onMouseLeave={(e)=>e.currentTarget.style.color='var(--fog-300)'}>{l}</a>
              ))}
            </div>
          </div>
        ))}
      </div>
      <div style={{ borderTop:'1px solid var(--border-subtle)', padding:'14px 20px', textAlign:'center' }}>
        <p style={{ margin:0, fontFamily:'var(--font-body)', fontSize:12, color:'var(--text-faint)', lineHeight:1.6 }}>
          Serving Tring, Berkhamsted, Hemel Hempstead, Aylesbury, Wendover and surrounding areas of Hertfordshire &amp; Buckinghamshire.
        </p>
      </div>
      <div style={{ borderTop:'1px solid var(--border-subtle)', padding:'18px 20px', display:'flex', alignItems:'center', flexDirection: isMobile ? 'column' : 'row', justifyContent: isMobile ? 'center' : 'space-between', textAlign: isMobile ? 'center' : 'left', flexWrap:'wrap', gap:isMobile ? 8 : 12 }}>
        {[['Terms and Conditions','terms'],['Privacy Policy','privacy'],['Safeguarding Policy','safeguarding']].map(([l,r]) => (
          <a key={l} href={r?'#/'+r:'#'} onClick={e=>{ if(r){e.preventDefault();go(r);}else e.preventDefault(); }}
            style={{ fontFamily:'var(--font-body)', fontSize:12, color:'var(--text-faint)', textDecoration:'none' }}
            onMouseEnter={e=>e.currentTarget.style.color='var(--accent)'}
            onMouseLeave={e=>e.currentTarget.style.color='var(--text-faint)'}>{l}</a>
        ))}
        <span style={{ fontFamily:'var(--font-body)', fontSize:12, color:'var(--text-faint)' }}>© On The Limit 2026</span>
      </div>
    </footer>
  );
}

function CookieBanner() {
  const [visible, setVisible] = React.useState(() =>
    !localStorage.getItem('otl_cookies_accepted') && !localStorage.getItem('otl_cookies_dismissed')
  );
  const isMobile = useIsMobile();

  if (!visible) return null;

  const accept = () => { localStorage.setItem('otl_cookies_accepted', '1'); setVisible(false); };
  const dismiss = () => { localStorage.setItem('otl_cookies_dismissed', '1'); setVisible(false); };

  return ReactDOM.createPortal(
    <div style={{ position:'fixed', bottom:0, left:0, right:0, zIndex:9998, padding: isMobile ? '16px' : '20px 24px', background:'rgba(10,10,10,0.97)', borderTop:'1px solid var(--border-subtle)', backdropFilter:'blur(12px)', display:'flex', alignItems:'center', justifyContent:'space-between', gap:16, flexWrap:'wrap' }}>
      <p style={{ margin:0, fontFamily:'var(--font-body)', fontSize:13, lineHeight:1.6, color:'var(--fog-300)', maxWidth:680 }}>
        We use cookies to improve your experience on our site and to analyse traffic. By continuing to use this website you agree to our{' '}
        <a href="#/privacy" onClick={(e)=>{e.preventDefault();go('privacy');}} style={{ color:'var(--accent)', textDecoration:'none' }}>Privacy Policy</a>.
      </p>
      <div style={{ display:'flex', gap:10, flexShrink:0 }}>
        <button onClick={accept} style={{ fontFamily:'var(--font-display)', fontWeight:700, fontSize:12, letterSpacing:'0.06em', textTransform:'uppercase', background:'var(--accent)', color:'#0d0d0d', border:'none', borderRadius:99, padding:'10px 22px', cursor:'pointer', whiteSpace:'nowrap' }}>
          Accept
        </button>
        <button onClick={dismiss} style={{ fontFamily:'var(--font-display)', fontWeight:700, fontSize:12, letterSpacing:'0.06em', textTransform:'uppercase', background:'none', color:'var(--text-muted)', border:'1px solid var(--border-subtle)', borderRadius:99, padding:'10px 22px', cursor:'pointer', whiteSpace:'nowrap' }}>
          Dismiss
        </button>
      </div>
    </div>,
    document.body
  );
}

window.OTL_Header = Header;
window.OTL_Footer = Footer;
window.OTL_Logo = Logo;
window.OTL_CookieBanner = CookieBanner;
