/* ============================================================
   BALEARIC GROOVE v3 — app-v3.jsx
   Yellow #F1E850 · Red #E42322 · Deep Glass · Blob Depth
   ============================================================ */
const { useState, useEffect, useContext } = React;

function CoverPH({ c1, c2, glyph, cover }) {
  if (cover) return (
    <div style={{width:'100%',height:'100%',overflow:'hidden',position:'relative'}}>
      <img src={cover} alt={glyph}
        style={{width:'100%',height:'100%',objectFit:'cover',display:'block',transition:'transform .5s var(--ease, cubic-bezier(.22,.61,.36,1))'}} />
    </div>
  );
  return (
    <div className="cover-ph" style={{'--c1':c1,'--c2':c2}}>
      <div className="glyph">{glyph}</div>
    </div>
  );
}

/* ── Featured Release ── */
function Featured({ onPlay, current, playing }) {
  const { lang } = useLang();
  const t = T[lang];
  const f = window.FEATURED;
  const isThis = current?.id === 'featured';
  return (
    <div className="featured reveal" data-screen-label="Featured Release">
      <div className="art">
        <span className="badge ep">{t.featTag}</span>
        <CoverPH c1={f.c1} c2={f.c2} glyph="A" cover={f.cover} />
      </div>
      <div className="meta">
        <span className="tag">{f.format} · {f.date}</span>
        <h3>{f.title}</h3>
        <div className="artist-name">{f.artist}</div>
        <p>{f.desc}</p>
        <div className="player-embed">
          <button className="pp" aria-label="Play featured"
            onClick={()=>onPlay({id:'featured',title:f.track,artist:f.artist,c1:f.c1,c2:f.c2})}>
            {isThis && playing ? I.pause() : I.play()}
          </button>
          <div className="ptext">
            <div className="t">{f.track}</div>
            <div className="s">{t.streamSoon}</div>
          </div>
          <div className="mini-wave" aria-hidden="true">
            {Array.from({length:20}).map((_,i)=>(
              <span key={i} style={{height:(6+Math.random()*18)+'px',animationPlayState:(isThis&&playing)?'running':'paused',animationDelay:(i*.055)+'s'}}></span>
            ))}
          </div>
        </div>
        <div style={{display:'flex',gap:'12px',flexWrap:'wrap'}}>
          <a className="btn btn-red" href="https://open.spotify.com/" target="_blank" rel="noopener">
            {I.spotify()} Spotify {I.arrowUp()}
          </a>
          <button className="btn btn-glass"
            onClick={()=>document.querySelector('#releases')?.scrollIntoView({behavior:'smooth'})}>
            {t.viewTracklist} {I.arrow()}
          </button>
        </div>
      </div>
    </div>
  );
}

/* ── Release Card ── */
function ReleaseCard({ r, onPlay, current, playing }) {
  const { lang } = useLang();
  const t = T[lang];
  const isThis = current?.id === r.id;
  return (
    <article className="rel-card reveal">
      <div className="art">
        <span className={'badge '+r.accent}>{r.format}</span>
        <div className="cph"><CoverPH c1={r.c1} c2={r.c2} glyph={r.title[0]} cover={r.cover} /></div>
        <div className="overlay">
          <button className="play-big" aria-label={'Play '+r.title}
            onClick={()=>onPlay({id:r.id,title:r.title,artist:r.artist,c1:r.c1,c2:r.c2})}>
            {isThis && playing ? I.pause() : I.play()}
          </button>
          <span className="stream-now">{t.streamNow}</span>
        </div>
      </div>
      <div className="foot">
        <div className="t">{r.title}</div>
        <div className="a">{r.artist}</div>
        <div className="row">
          <span className="date">{r.date}</span>
          <div className="platforms">
            <a href="https://open.spotify.com/" target="_blank" rel="noopener" aria-label="Spotify">{I.spotify()}</a>
            <a href="https://www.beatport.com/" target="_blank" rel="noopener" aria-label="Beatport">{I.beatport()}</a>
            <a href="https://soundcloud.com/balearicgroove" target="_blank" rel="noopener" aria-label="SoundCloud">{I.soundcloud()}</a>
          </div>
        </div>
      </div>
    </article>
  );
}

/* ── Releases Section ── */
function Releases({ onPlay, current, playing }) {
  const { lang } = useLang();
  const t = T[lang];
  const [filter, setFilter] = useState('All');
  const filters = [t.filterAll,'EP','Single','LP'];
  const shown = window.RELEASES.filter(r => filter===t.filterAll || r.format===filter);
  return (
    <section className="section releases" id="releases" data-screen-label="Releases" style={{overflow:'hidden'}}>
      {/* Depth blobs */}
      <Blob className="blob-y" style={{width:500,height:500,top:'-15%',left:'-10%',opacity:.6}} />
      <Blob className="blob-r blob-pulse" style={{width:400,height:400,bottom:'-10%',right:'-8%',opacity:.5}} />

      <div className="wrap">
        <div className="section-head">
          <div className="top">
            <div>
              <div className="eyebrow" style={{marginBottom:'16px'}}>{t.relEye}</div>
              <h2 className="display-title">{t.relH} <em>{t.relHem}</em></h2>
            </div>
            <div className="filters">
              {filters.map(f=>(
                <button key={f} className={'filter-pill'+(filter===f?' active':'')} onClick={()=>setFilter(f)}>{f}</button>
              ))}
            </div>
          </div>
        </div>
        <Featured onPlay={onPlay} current={current} playing={playing} />
        <div className="rel-grid">
          {shown.map((r,i)=>(
            <div key={r.id} style={{transitionDelay:(i*.07)+'s'}}>
              <ReleaseCard r={r} onPlay={onPlay} current={current} playing={playing} />
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

/* ── Artists Section ── */
function Artists({ onOpenDemo }) {
  const { lang } = useLang();
  const t = T[lang];
  return (
    <section className="section artists" id="artists" data-screen-label="Artists" style={{overflow:'hidden'}}>
      <Blob className="blob-y blob-pulse-2" style={{width:500,height:500,top:'-10%',right:'-6%',opacity:.55}} />
      <Blob className="blob-r" style={{width:350,height:350,bottom:'0%',left:'-6%',opacity:.45}} />

      <div className="wrap">
        <div className="section-head">
          <div className="top">
            <div>
              <div className="eyebrow" style={{marginBottom:'16px'}}>{t.artEye}</div>
              <h2 className="display-title">{t.artH} <em>{t.artHem}</em></h2>
            </div>
            <button className="btn btn-outline-yellow" onClick={onOpenDemo}>{t.artJoin} {I.arrow()}</button>
          </div>
        </div>
        <div className="art-grid">
          {window.ARTISTS.map((a,i)=>(
            <div className="artist-card reveal" key={a.name} style={{transitionDelay:(i*.08)+'s'}}>
              <div className="frame">
                <span className="rel-count">{a.releases} {t.artReleases}</span>
                <div className="inner">
                  {a.photo
                    ? <img src={a.photo} alt={a.name} style={{width:'100%',height:'100%',objectFit:'cover',objectPosition:'top center',display:'block'}} />
                    : <div className="ph-photo" style={{width:'100%',height:'100%'}}><span className="pp-ic">{I.user()}</span><span className="pp-txt">photo</span></div>
                  }
                </div>
                <div className="a-overlay"><span className="view">{t.artView}</span></div>
              </div>
              <div className="info">
                <div className="name">{a.name}</div>
                <div className="style">{a.style}</div>
              </div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

/* ── CTA Strip ── */
function CTAStrip({ onOpenDemo }) {
  const { lang } = useLang();
  const t = T[lang];
  return (
    <section className="cta-strip" id="submit" data-screen-label="Submit CTA" style={{overflow:'hidden'}}>
      <Blob className="blob-r blob-pulse" style={{width:700,height:700,top:'50%',left:'50%',transform:'translate(-50%,-50%)',opacity:.7}} />
      <Blob className="blob-y blob-pulse-2" style={{width:400,height:400,top:'20%',right:'10%',opacity:.4}} />
      <div className="cta-bg-glyph">BG</div>
      <div className="wrap">
        <div className="cta-inner reveal">
          <div className="eyebrow no-line">{t.ctaEye}</div>
          <h2 className="display-title" style={{textAlign:'center',marginTop:'14px'}}>
            {t.ctaH} <em>{t.ctaHem}</em>
          </h2>
          <p className="subtitle">{t.ctaSub}</p>
          <button className="btn btn-red" style={{marginTop:'8px',padding:'17px 40px',fontSize:'15px'}} onClick={onOpenDemo}>
            {I.send()} {t.ctaBtn}
          </button>
          <a href="mailto:demos@balearicgroove.com"
            style={{fontSize:'12px',color:'var(--text-3)',letterSpacing:'.08em',marginTop:'4px'}}>
            demos@balearicgroove.com
          </a>
        </div>
      </div>
    </section>
  );
}

/* ── Demo Modal ── */
const GENRES = ['Balearic','Downtempo','Deep House','Organic House','Ambient','Other'];
function DemoModal({ open, onClose, onSuccess }) {
  const { lang } = useLang();
  const t = T[lang];
  const [form, setForm] = useState({name:'',email:'',artist:'',genre:'',link:'',message:'',gdpr:false});
  const [errors, setErrors] = useState({});
  const [loading, setLoading] = useState(false);
  const [faq, setFaq] = useState(-1);
  const set = (k,v) => setForm(f=>({...f,[k]:v}));

  const validate = () => {
    const e={};
    if (!form.name.trim())                              e.name    = t.errReq;
    if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(form.email)) e.email  = t.errEmail;
    if (!form.artist.trim())                            e.artist  = t.errReq;
    if (!form.genre)                                    e.genre   = t.errPick;
    if (!/^https?:\/\/.+/.test(form.link))             e.link    = t.errLink;
    if (!form.gdpr)                                     e.gdpr    = t.errConsent;
    setErrors(e);
    return !Object.keys(e).length;
  };

  const submit = ev => {
    ev.preventDefault();
    if (!validate()) return;
    setLoading(true);
    setTimeout(()=>{ setLoading(false); onClose(); onSuccess(); setForm({name:'',email:'',artist:'',genre:'',link:'',message:'',gdpr:false}); }, 1600);
  };

  useEffect(()=>{
    const fn = e=>{ if(e.key==='Escape') onClose(); };
    window.addEventListener('keydown',fn);
    return ()=>window.removeEventListener('keydown',fn);
  },[onClose]);

  return (
    <div className={'demo-overlay'+(open?' open':'')} onClick={onClose} role="dialog" aria-modal="true">
      <div className="demo-modal" onClick={e=>e.stopPropagation()}>
        <button className="modal-close" onClick={onClose} aria-label="Close">{I.close()}</button>

        {/* Left — Form */}
        <div className="modal-left">
          <div className="demo-head">
            <div className="vinyl-mini"></div>
            <div>
              <div className="eyebrow no-line" style={{marginBottom:'8px'}}>{t.demoEye}</div>
              <h2 className="display-title" style={{fontSize:'clamp(24px,3vw,36px)'}}>{t.demoH} <em>{t.demoHem}</em></h2>
            </div>
          </div>
          <p style={{color:'var(--text-2)',fontSize:'14px',lineHeight:'1.7',margin:'0 0 4px'}}>{t.demoSub}</p>
          <form className="demo-form" onSubmit={submit} noValidate>
            <div className={'field'+(errors.name?' err':'')}>
              <label>{t.fName} <span className="req">*</span></label>
              <input value={form.name} onChange={e=>set('name',e.target.value)} placeholder="Alex Rivera" />
              {errors.name && <span className="errmsg">{errors.name}</span>}
            </div>
            <div className={'field'+(errors.email?' err':'')}>
              <label>{t.fEmail} <span className="req">*</span></label>
              <input type="email" value={form.email} onChange={e=>set('email',e.target.value)} placeholder="you@email.com" />
              {errors.email && <span className="errmsg">{errors.email}</span>}
            </div>
            <div className={'field'+(errors.artist?' err':'')}>
              <label>{t.fArtist} <span className="req">*</span></label>
              <input value={form.artist} onChange={e=>set('artist',e.target.value)} placeholder="e.g. Dunes" />
              {errors.artist && <span className="errmsg">{errors.artist}</span>}
            </div>
            <div className={'field'+(errors.genre?' err':'')}>
              <label>{t.fGenre} <span className="req">*</span></label>
              <select value={form.genre} onChange={e=>set('genre',e.target.value)}>
                <option value="" disabled>{t.fGenreP}</option>
                {GENRES.map(g=><option key={g} value={g}>{g}</option>)}
              </select>
              {errors.genre && <span className="errmsg">{errors.genre}</span>}
            </div>
            <div className={'field full'+(errors.link?' err':'')}>
              <label>{t.fLink} <span className="req">*</span></label>
              <input value={form.link} onChange={e=>set('link',e.target.value)} placeholder={t.fLinkP} />
              {errors.link && <span className="errmsg">{errors.link}</span>}
            </div>
            <div className="field full">
              <label>{t.fMsg} <span style={{color:'var(--text-3)',textTransform:'none',letterSpacing:0}}>{t.fMsgOpt}</span></label>
              <textarea maxLength={500} value={form.message} onChange={e=>set('message',e.target.value)} placeholder={t.fMsgP}></textarea>
              <span className="charcount">{form.message.length}/500</span>
            </div>
            <div className={'gdpr'+(errors.gdpr?' err':'')}>
              <input type="checkbox" id="gdpr-v3" checked={form.gdpr} onChange={e=>set('gdpr',e.target.checked)} />
              <label htmlFor="gdpr-v3">
                {t.fGdpr} <a href="#submit">{t.fPrivacy}</a>.
                {errors.gdpr && <span style={{color:'var(--red)',fontSize:'10px',marginLeft:'6px'}}>{errors.gdpr}</span>}
              </label>
            </div>
            <div className="submit-row">
              <button type="submit" className="btn btn-red" disabled={loading} style={{minWidth:'180px',justifyContent:'center'}}>
                {loading
                  ? <React.Fragment><span className="spinner"></span> {t.fSending}</React.Fragment>
                  : <React.Fragment>{I.send()} {t.fSubmit}</React.Fragment>}
              </button>
              <span style={{fontSize:'11px',color:'var(--text-3)',letterSpacing:'.05em'}}>{t.fReply}</span>
            </div>
          </form>
        </div>

        {/* Right — Sidebar */}
        <div className="modal-right">
          <div className="side-card">
            <h4>{lang==='es'?'3 razones para enviarlo':'3 reasons to send it'}</h4>
            <div className="reason"><span className="num">01</span><div className="rt"><b>{t.r1t}</b><span>{t.r1s}</span></div></div>
            <div className="reason"><span className="num">02</span><div className="rt"><b>{t.r2t}</b><span>{t.r2s}</span></div></div>
            <div className="reason"><span className="num">03</span><div className="rt"><b>{t.r3t}</b><span>{t.r3s}</span></div></div>
          </div>
          <div className="side-card">
            <h4>{lang==='es'?'Nuestro sonido':'Our sound'}</h4>
            <div className="sound-tags">
              {t.soundTags.map(tag=><span className="sound-tag" key={tag}>{tag}</span>)}
            </div>
          </div>
          <div className="side-card">
            <h4>FAQ</h4>
            {t.faq.map(([q,a],i)=>(
              <div className={'faq-item'+(faq===i?' open':'')} key={i}>
                <button className="faq-q" onClick={()=>setFaq(faq===i?-1:i)}>
                  {q}<span className="ic">{I.plus()}</span>
                </button>
                <div className="faq-a" style={{maxHeight:faq===i?'160px':'0'}}><p>{a}</p></div>
              </div>
            ))}
          </div>
        </div>
      </div>
    </div>
  );
}

/* ── Success Modal ── */
function SuccessModal({ open, onClose }) {
  const { lang } = useLang();
  const t = T[lang];
  useEffect(()=>{
    const fn=e=>{if(e.key==='Escape')onClose();};
    window.addEventListener('keydown',fn);
    return ()=>window.removeEventListener('keydown',fn);
  },[onClose]);
  return (
    <div className={'success-overlay'+(open?' open':'')} onClick={onClose}>
      <div className="success-modal" onClick={e=>e.stopPropagation()}>
        <button className="close-x" onClick={onClose} aria-label="Close">{I.close()}</button>
        <div className="vinyl-big"></div>
        <h3>{t.successH}</h3>
        <p>{t.successP} <strong style={{color:'var(--yellow)'}}>{t.successW}</strong>.</p>
        <button className="btn btn-yellow" onClick={onClose} style={{justifyContent:'center',width:'100%'}}>{t.successCta}</button>
      </div>
    </div>
  );
}

/* ── Footer ── */
function Footer({ onOpenDemo }) {
  const { lang } = useLang();
  const t = T[lang];
  const go = (e,href) => { e.preventDefault(); document.querySelector(href)?.scrollIntoView({behavior:'smooth'}); };
  return (
    <footer className="footer">
      <div className="wrap">
        <div className="big-mark">Balearic Groove</div>
        <div className="foot-grid">
          <div className="foot-brand">
            <img src="assets/mascot.png" alt="Balearic Groove mascot" />
            <div className="fb-name">Balearic Groove</div>
            <p>{t.footDesc}</p>
            <div className="foot-social">
              {SOCIAL.map(s=><a key={s.k} href={s.url} target="_blank" rel="noopener" aria-label={s.label}>{I[s.k]()}</a>)}
            </div>
          </div>
          <div className="foot-col">
            <h5>{t.footExplore}</h5>
            <a href="#releases" onClick={e=>go(e,'#releases')}>{t.navReleases}</a>
            <a href="#artists"  onClick={e=>go(e,'#artists')}>{t.navArtists}</a>
            <a href="#manifesto" onClick={e=>go(e,'#manifesto')}>{t.navSound}</a>
            <a href="#submit" onClick={e=>{e.preventDefault();onOpenDemo();}}>{t.navDemo}</a>
          </div>
          <div className="foot-col">
            <h5>{t.footListen}</h5>
            <a href="https://open.spotify.com/" target="_blank" rel="noopener">Spotify</a>
            <a href="https://soundcloud.com/balearicgroove" target="_blank" rel="noopener">SoundCloud</a>
            <a href="https://www.beatport.com/" target="_blank" rel="noopener">Beatport</a>
            <a href="https://music.apple.com/" target="_blank" rel="noopener">Apple Music</a>
          </div>
          <div className="foot-col">
            <h5>{t.footNews}</h5>
            <p style={{color:'var(--text-3)',fontSize:'13px',margin:'0 0 4px',lineHeight:'1.65'}}>{t.footNewsSub}</p>
            <form className="news" onSubmit={e=>e.preventDefault()}>
              <input type="email" placeholder="your@email.com" aria-label="Email" />
              <button type="submit" aria-label="Subscribe">{I.arrow()}</button>
            </form>
            <a href="mailto:demos@balearicgroove.com"
              style={{display:'block',marginTop:'18px',color:'var(--yellow)',fontSize:'12px',letterSpacing:'.04em'}}>
              demos@balearicgroove.com
            </a>
          </div>
        </div>
        <div className="foot-bottom">
          <span className="copy">{t.footCopy} <a href="https://www.ibiza.travel/" target="_blank" rel="noopener">Ibiza</a></span>
          <div className="foot-social">
            {SOCIAL.map(s=><a key={s.k} href={s.url} target="_blank" rel="noopener" aria-label={s.label}>{I[s.k]()}</a>)}
          </div>
        </div>
      </div>
    </footer>
  );
}

/* ── Mini Player ── */
function fmt(s){const m=Math.floor(s/60),ss=Math.floor(s%60);return m+':'+String(ss).padStart(2,'0');}
function MiniPlayer({ track, playing, onToggle, onClose, progress }) {
  if (!track) return null;
  return (
    <div className="mini-player show">
      <div className="mp-art">
        <div className="cover-ph" style={{'--c1':track.c1,'--c2':track.c2,height:'100%'}}>
          <div className="glyph" style={{fontSize:'18px'}}>{track.title[0]}</div>
        </div>
      </div>
      <div className="mp-info">
        <div className="t">{track.title}</div>
        <div className="a">{track.artist} · Balearic Groove</div>
      </div>
      <div className="mp-controls">
        <button aria-label="Previous">{I.prev()}</button>
        <button className="mp-play" aria-label="Play/Pause" onClick={onToggle}>{playing?I.pause():I.play()}</button>
        <button aria-label="Next">{I.next()}</button>
      </div>
      <div className="mp-progress">
        <span className="mp-time">{fmt(progress)}</span>
        <div className="mp-bar"><div className="fill" style={{width:(progress/210*100)+'%'}}></div></div>
        <span className="mp-time">3:30</span>
      </div>
      <div className="mp-vol">{I.vol()}<div className="vbar"><div className="vfill"></div></div></div>
      <button className="mp-close" aria-label="Close player" onClick={onClose}>{I.close()}</button>
    </div>
  );
}

/* ── APP ── */
function App() {
  const [lang, setLang]         = useState('en');
  const [track, setTrack]       = useState(null);
  const [playing, setPlaying]   = useState(false);
  const [progress, setProgress] = useState(0);
  const [demoOpen, setDemoOpen] = useState(false);
  const [success, setSuccess]   = useState(false);

  useReveal();

  const onPlay = newTrack => {
    if (track?.id === newTrack.id) { setPlaying(p=>!p); }
    else { setTrack(newTrack); setPlaying(true); setProgress(0); }
  };

  useEffect(()=>{
    if (!playing) return;
    const iv = setInterval(()=>setProgress(p=>p>=210?0:p+1),1000);
    return ()=>clearInterval(iv);
  },[playing]);

  useEffect(()=>{ document.body.style.paddingBottom = track ? 'var(--player-h)' : '0'; },[track]);
  useEffect(()=>{ document.body.style.overflow = demoOpen ? 'hidden' : ''; },[demoOpen]);

  const openDemo  = () => setDemoOpen(true);
  const closeDemo = () => setDemoOpen(false);

  return (
    <LangContext.Provider value={{ lang, setLang }}>
      <Nav onOpenDemo={openDemo} />
      <Hero onOpenDemo={openDemo} />
      <Marquee />
      <Manifesto />
      <Releases onPlay={onPlay} current={track} playing={playing} />
      <Artists onOpenDemo={openDemo} />
      <CTAStrip onOpenDemo={openDemo} />
      <Footer onOpenDemo={openDemo} />
      <MiniPlayer track={track} playing={playing} progress={progress}
        onToggle={()=>setPlaying(p=>!p)}
        onClose={()=>{setTrack(null);setPlaying(false);}} />
      <DemoModal open={demoOpen} onClose={closeDemo} onSuccess={()=>setSuccess(true)} />
      <SuccessModal open={success} onClose={()=>setSuccess(false)} />
    </LangContext.Provider>
  );
}

ReactDOM.createRoot(document.getElementById('root')).render(<App />);
