/* Shared components — loud look, tidy structure */

const PixelFace = ({ cap='red', size=52 }) => (
  <div className="pixel" aria-hidden="true" style={{
    width:size,height:size,position:'relative',flex:'0 0 auto',
    background:'#fff',border:'3px solid var(--ink)',boxShadow:'3px 3px 0 var(--ink)'
  }}>
    <div style={{position:'absolute',left:8,top:8,width:32,height:10,background:cap==='blue'?'var(--blue)':'var(--red)'}} />
    <div style={{position:'absolute',left:12,top:24,width:5,height:5,background:'var(--ink)'}} />
    <div style={{position:'absolute',right:12,top:24,width:5,height:5,background:'var(--ink)'}} />
    <div style={{position:'absolute',left:19,top:36,width:14,height:3,background:'var(--ink)'}} />
  </div>
);

const NavV3 = ({ current }) => {
  const [menuOpen, setMenuOpen] = React.useState(false);
  React.useEffect(()=>{
    const selector = [
      'section h1',
      'section h2',
      'section p',
      'section li',
      'section label',
      'section .sticker',
      'section .stamp',
      'section .btn',
      'section article',
      'section form',
      'section iframe',
      'section .speech',
      'section .memo'
    ].join(',');
    const setup = () => {
      const items = [...document.querySelectorAll(selector)]
        .filter(el => !el.closest('nav') && !el.classList.contains('reveal-on-scroll'));
      items.forEach((el, i)=>{
        el.classList.add('reveal-on-scroll');
        el.style.setProperty('--reveal-delay', `${Math.min(i % 5, 4) * 45}ms`);
      });
      const obs = new IntersectionObserver((entries)=>{
        entries.forEach(entry=>{
          if(entry.isIntersecting){
            entry.target.classList.add('is-visible');
            obs.unobserve(entry.target);
          }
        });
      }, {threshold:.12, rootMargin:'0px 0px -7% 0px'});
      items.forEach(el=>obs.observe(el));
      return obs;
    };
    let obs;
    const timer = window.setTimeout(()=>{ obs = setup(); }, 80);
    return()=>{
      window.clearTimeout(timer);
      if(obs) obs.disconnect();
    };
  },[]);
  const pages = [
    {id:'top',label:'HOME',href:'index.html'},
    {id:'music',label:'DISCOGRAPHY',href:'music.html'},
    {id:'podcast',label:'PODCAST',href:'podcast.html'},
    {id:'profile',label:'STAFF',href:'profile.html'},
    {id:'concept',label:'CONCEPT',href:'concept.html'},
    {id:'contact',label:'CONTACT',href:'contact.html'},
  ];

  return (
    <>
      <nav style={{
        position:'fixed',top:0,left:0,right:0,zIndex:1000,minHeight:58,
        display:'flex',alignItems:'center',justifyContent:'space-between',
        padding:'8px var(--page-px)',
        background:'rgba(255,253,247,.92)',backdropFilter:'blur(10px)',
        borderBottom:'3px solid var(--ink)',
      }}>
        <a href="index.html" aria-label="哲学トーク ホーム" style={{lineHeight:1,position:'relative',display:'block',width:'clamp(128px, 14vw, 176px)'}}>
          <img src="tetsugaku_leftlogo.PNG" alt="哲学トーク" style={{display:'block',width:'100%',height:'auto'}} />
        </a>
        <div className="nav-links-desktop" style={{display:'flex',gap:24,alignItems:'center'}}>
          {pages.map(p=>(
            <a key={p.id} href={p.href} style={{
              fontFamily:'var(--display-accent)',fontSize:16,fontWeight:400,fontSynthesisWeight:'none',
              color:'var(--ink)',position:'relative',padding:'6px 0',
            }}>
              {p.label}
              {current===p.id&&<span style={{position:'absolute',left:0,right:0,bottom:0,height:4,background:'var(--ink)'}} />}
            </a>
          ))}
        </div>
        <div className="nav-hamburger" style={{display:'none',flexDirection:'column',gap:5,cursor:'pointer',padding:8}}
          onClick={()=>setMenuOpen(!menuOpen)}>
          <span style={{width:24,height:3,background:'var(--ink)',transform:menuOpen?'rotate(45deg) translate(5px,6px)':'none',transition:'all .3s'}}></span>
          <span style={{width:24,height:3,background:'var(--ink)',opacity:menuOpen?0:1,transition:'opacity .2s'}}></span>
          <span style={{width:24,height:3,background:'var(--ink)',transform:menuOpen?'rotate(-45deg) translate(5px,-6px)':'none',transition:'all .3s'}}></span>
        </div>
      </nav>
      {menuOpen&&(
        <div style={{position:'fixed',inset:0,zIndex:999,paddingTop:72,background:'rgba(255,253,247,.98)',display:'flex',flexDirection:'column',alignItems:'center',justifyContent:'center',gap:22}}>
          {pages.map(p=>(
            <a key={p.id} href={p.href} style={{fontFamily:'var(--display-accent)',fontSize:24,fontWeight:400,fontSynthesisWeight:'none',color:current===p.id?'var(--red)':'var(--ink)'}}>{p.label}</a>
          ))}
        </div>
      )}
    </>
  );
};

const FooterV3 = () => {
  const sns = [
    {label:'X', icon:'x.png', href:'https://x.com/Tetsugaku_Talk'},
    {label:'Instagram', icon:'instagram.png', href:'https://www.instagram.com/tetsugaku_talk?utm_source=qr'},
    {label:'TuneCore', icon:'tunecore.png', href:'https://www.tunecore.co.jp/artists?id=1058659'},
    {label:'YouTube', icon:'youtube.png', href:'https://www.youtube.com/@Tetsugaku_Talk/featured'},
    {label:'niconico', icon:'niconico.png', href:'https://www.nicovideo.jp/user/138797455'},
    {label:'Spotify podcast', icon:'spotify.png', href:'https://open.spotify.com/show/2yyyY54PQwp8RLOE1RxOVf'},
  ];
  return (
    <>
      <div className="kyoku-marquee" aria-label="KYOKU IST TANOSHI KARA TSUKURUNO">
        <div className="kyoku-marquee-track" aria-hidden="true">
          {[0,1,2,3].map(i=>(
            <img key={i} src="kyokuist_text.PNG" alt="" />
          ))}
        </div>
      </div>
      <footer style={{
        padding:'22px var(--page-px)',borderTop:'3px solid var(--ink)',
        display:'grid',gridTemplateColumns:'1fr auto 1fr',alignItems:'center',gap:14,
        fontSize:12,color:'var(--ink)',background:'#fff',
      }}>
        <a href="index.html" aria-label="哲学トーク ホーム" style={{display:'block',width:74}}>
          <img src="logo-tetsutalk-transparent.png" alt="哲学トーク" style={{display:'block',width:'100%',height:'auto'}} />
        </a>
        <div style={{display:'flex',gap:13,alignItems:'center',flexWrap:'wrap',justifyContent:'center'}}>
          {sns.map(s=>(
            <a key={s.label} href={s.href} target="_blank" rel="noopener noreferrer" aria-label={s.label} title={s.label} style={{
              width:34,height:34,display:'grid',placeItems:'center',
              transition:'transform .15s',
            }}
            onMouseEnter={e=>e.currentTarget.style.transform='rotate(-6deg) scale(1.12)'}
            onMouseLeave={e=>e.currentTarget.style.transform='none'}
            >
              <img src={s.icon} alt="" style={{maxWidth:'100%',maxHeight:'100%',display:'block',objectFit:'contain'}} />
            </a>
          ))}
        </div>
        <div style={{display:'flex',gap:12,alignItems:'center',justifyContent:'flex-end',flexWrap:'wrap',color:'var(--ink-mid)',fontSize:11}}>
          <a href="privacy.html" style={{fontWeight:700,borderBottom:'1px solid var(--border)'}}>PRIVACY POLICY</a>
          <span>© 2026 Tetsugaku Talk</span>
        </div>
      </footer>
      <style>{`
        @media(max-width: 760px){
          footer{grid-template-columns:1fr!important;justify-items:center!important;text-align:center!important}
          footer > div:last-child{justify-content:center!important}
        }
      `}</style>
    </>
  );
};

const useFadeIn = (threshold=.15) => {
  const ref=React.useRef(null);
  const [visible,setVisible]=React.useState(false);
  React.useEffect(()=>{
    const obs=new IntersectionObserver(([e])=>{if(e.isIntersecting)setVisible(true)},{threshold});
    if(ref.current)obs.observe(ref.current);
    return()=>obs.disconnect();
  },[]);
  return{ref,visible};
};

Object.assign(window,{NavV3,FooterV3,useFadeIn,PixelFace});
