// scenes.jsx — scene komponente za Lukinu animiranu pozivnicu
// Ovisi o animations.jsx (Stage, useTime, interpolate, animate, Easing, clamp)

const C = {
  six:'#ffd23f',  sixGlow:'#ffb800', sixShadow:'#b87f00',
  seven:'#38e1ff', sevenGlow:'#00b4e6', sevenShadow:'#0077a3',
  ink:'#fff7ea', bg:'#0a0618', bg0:'#160b33',
};

const W = 1080, H = 1920;

// ── helperi ────────────────────────────────────────────────
const endFade = (t) => 1;                                           // bez loop-a: ništa se ne gasi na kraju
const introFade = (t) => clamp(t / 0.6, 0, 1);                      // ulaz iz crnog

// ── zvjezdice (fiksni raspored, CSS treperenje) ────────────
const STARS = Array.from({length:30}, (_,i) => ({
  left: Math.random()*100,
  top: Math.random()*92,
  size: 4 + Math.random()*7,
  delay: Math.random()*3.4,
  dur: 2.8 + Math.random()*2,
}));

function Stars(){
  const t = useTime();
  // zvjezdice nestaju kad krene priča (oko 3.4s)
  const op = (1 - clamp((t - 3.2)/1.0, 0, 1)) * introFade(t);
  return (
    <div style={{position:'absolute', inset:0, opacity:op}}>
      {STARS.map((s,i)=>(
        <div key={i} style={{
          position:'absolute', left:s.left+'%', top:s.top+'%',
          width:s.size, height:s.size, borderRadius:'50%', background:'#fff',
          boxShadow:'0 0 10px 2px rgba(255,255,255,.6)',
          animation:`tw ${s.dur}s ease-in-out ${s.delay}s infinite`,
        }}/>
      ))}
    </div>
  );
}

// ── pozadina + glow ────────────────────────────────────────
function Backdrop(){
  const t = useTime();
  const glow = animate({from:0, to:1, start:6.2, end:9, ease:Easing.easeInOutCubic})(t) * endFade(t);
  return (
    <div style={{position:'absolute', inset:0,
      background:`radial-gradient(125% 90% at 50% 42%, ${C.bg0} 0%, ${C.bg} 72%)`}}>
      {/* eksplozivni obojeni sjaj koji raste prema finalu */}
      <div style={{position:'absolute', inset:'-15%', opacity:glow, filter:'blur(10px)',
        background:`
          radial-gradient(34% 26% at 28% 46%, rgba(255,210,63,.55), transparent 70%),
          radial-gradient(34% 26% at 72% 46%, rgba(56,225,255,.55), transparent 70%),
          radial-gradient(46% 34% at 50% 80%, rgba(255,79,216,.32), transparent 70%)`}}/>
      <Stars/>
      <div style={{position:'absolute', inset:0,
        boxShadow:'inset 0 0 32vh 9vh rgba(0,0,0,.55)'}}/>
    </div>
  );
}

// ── SLAJD 1: tajna ─────────────────────────────────────────
function Secret(){
  const t = useTime();
  // izlazi 3.1 → 3.8, klizi gore i smanji se
  const out = clamp((t - 3.1)/0.7, 0, 1);
  const oe = Easing.easeInCubic(out);
  const op = (1 - oe) * introFade(t);
  const ty = -oe * 120;
  const sc = 1 - oe*0.14;

  const emojiPop = Easing.easeOutBack(clamp((t - 0.4)/0.6, 0, 1));
  const titleRise = Easing.easeOutCubic(clamp((t - 0.9)/0.6, 0, 1));
  const hintOp = clamp((t-1.7)/0.6,0,1) * (1 - clamp((t-2.9)/0.5,0,1));

  return (
    <div style={{position:'absolute', left:0, right:0, top:'50%',
      transform:`translateY(calc(-50% + ${ty}px)) scale(${sc})`,
      opacity:op, textAlign:'center', willChange:'transform,opacity'}}>
      <div style={{fontSize:300, lineHeight:1,
        transform:`scale(${emojiPop}) rotate(${(1-emojiPop)*-12}deg)`,
        filter:'drop-shadow(0 10px 26px rgba(0,0,0,.5))'}}>🤫</div>
      <div style={{marginTop:30, padding:'0 70px',
        opacity:titleRise, transform:`translateY(${(1-titleRise)*30}px)`,
        fontFamily:"'Baloo 2', sans-serif", fontWeight:800, fontSize:104, lineHeight:1.05,
        color:C.ink, textShadow:'0 5px 26px rgba(0,0,0,.55)', textWrap:'balance'}}>
        Želim vam otkriti <span style={{color:C.six}}>jednu tajnu!</span>
      </div>
      <div style={{marginTop:70, opacity:hintOp, fontFamily:"'Baloo 2',sans-serif",
        fontWeight:600, fontSize:30, letterSpacing:'.22em', textTransform:'uppercase',
        color:C.ink}}>
        pssst…
      </div>
    </div>
  );
}

// ── natpisi (gornja zona) ──────────────────────────────────
function Caption({text, start, end, color}){
  const t = useTime();
  if (t < start - 0.1 || t > end + 0.6) return null;
  const inT = Easing.easeOutBack(clamp((t - start)/0.5, 0, 1));
  const outT = Easing.easeInCubic(clamp((t - end)/0.5, 0, 1));
  const op = clamp((t-start)/0.4,0,1) * (1 - outT) * endFade(t);
  const ty = (1 - inT) * -40 + outT * -20;
  return (
    <div style={{position:'absolute', left:0, right:0, top:300,
      transform:`translateY(${ty}px)`, opacity:op, textAlign:'center', padding:'0 80px',
      fontFamily:"'Baloo 2',sans-serif", fontWeight:700, fontSize:84, lineHeight:1.08,
      color:C.ink, textShadow:'0 4px 18px rgba(0,0,0,.6)', textWrap:'balance',
      willChange:'transform,opacity'}}>
      {text}
    </div>
  );
}

// ── veliki broj ────────────────────────────────────────────
function BigNumber({value, color, glow, shadow, appearAt, fadeDur=0.5, xFn, settleAt, wigPhase}){
  const t = useTime();
  if (t < appearAt - 0.01) return null;
  const op = clamp((t - appearAt)/fadeDur, 0, 1) * endFade(t);
  // ulaz: blagi scale dok klizi s ruba
  const enter = Easing.easeOutCubic(clamp((t - appearAt)/0.7, 0, 1));
  const baseScale = 0.86 + 0.14*enter;
  // horizontalni položaj (klizanje s ruba na svoje mjesto)
  const x = xFn(t);
  // mirno lebdenje nakon slijeganja
  const settle = clamp((t - settleAt)/0.5, 0, 1);
  const bob = Math.sin(t*2.0 + wigPhase) * 22 * settle;
  const wig = Math.sin(t*1.6 + wigPhase) * 4 * settle;
  const breathe = Math.sin(t*2.0 + wigPhase) * 0.02 * settle;

  return (
    <div style={{position:'absolute', left:'50%', top:'52%',
      transform:`translate(calc(-50% + ${x}px), calc(-50% + ${bob}px)) scale(${baseScale + breathe}) rotate(${wig}deg)`,
      fontFamily:"'Bungee', sans-serif", fontSize:540, lineHeight:.8, color, opacity:op,
      textShadow:`0 0 70px ${glow}, 0 14px 0 ${shadow}, 0 22px 40px rgba(0,0,0,.5)`,
      willChange:'transform,opacity'}}>
      {value}
    </div>
  );
}

// ── poziv na skrol (zadnja sekunda) ───────────────────────
function ScrollHint(){
  const t = useTime();
  const inT = Easing.easeOutBack(clamp((t - 12.4)/0.7, 0, 1));
  if (inT <= 0) return null;
  const op = clamp((t - 12.4)/0.5, 0, 1) * endFade(t);
  return (
    <div style={{position:'absolute', left:0, right:0, bottom:96,
      transform:`translateY(${(1-inT)*70}px)`, opacity:op, textAlign:'center',
      willChange:'transform,opacity'}}>
      <div style={{fontFamily:"'Baloo 2',sans-serif", fontWeight:600, fontSize:38,
        letterSpacing:'.04em', color:C.ink, textShadow:'0 3px 14px rgba(0,0,0,.6)'}}>
        skrolaj za više 👇
      </div>
      <div style={{marginTop:6, fontSize:50, color:C.ink, lineHeight:1,
        animation:'bobArrow 1.3s ease-in-out infinite'}}>⌄</div>
    </div>
  );
}

// ── finale natpis ──────────────────────────────────────────
function Finale(){
  const t = useTime();
  const inT = Easing.easeOutBack(clamp((t - 8.5)/0.6, 0, 1));
  if (inT <= 0) return null;
  const op = clamp((t-8.5)/0.4,0,1) * endFade(t);
  return (
    <div style={{position:'absolute', left:0, right:0, bottom:300,
      transform:`translateY(${(1-inT)*40}px) scale(${inT})`, opacity:op, textAlign:'center',
      fontFamily:"'Baloo 2',sans-serif", fontWeight:800, fontSize:78, color:C.ink,
      textShadow:'0 4px 18px rgba(0,0,0,.6)'}}>
      to je moja tajna! 🎉
    </div>
  );
}

// ── konfeti (deterministički, vezan uz vrijeme) ────────────
const CONF_COLORS = ['#ffd23f','#38e1ff','#ff4fd8','#7cff5a','#ff8a3d','#ffffff'];
const PARTICLES = Array.from({length:170}, () => {
  const ang = (-Math.PI/2) + (Math.random()-0.5)*Math.PI*0.95;
  const spd = 900 + Math.random()*1500;
  return {
    x0: W/2 + (Math.random()-0.5)*180,
    y0: H*0.40 + (Math.random()-0.5)*120,
    vx: Math.cos(ang)*spd,
    vy: Math.sin(ang)*spd,
    g: 1500 + Math.random()*500,
    size: 16 + Math.random()*22,
    rot0: Math.random()*6.28,
    vr: (Math.random()-0.5)*10,
    color: CONF_COLORS[(Math.random()*CONF_COLORS.length)|0],
    delay: Math.random()*0.5,
    life: 2.6 + Math.random()*1.4,
  };
});

function Confetti({start}){
  const t = useTime();
  const ref = React.useRef(null);
  React.useEffect(()=>{
    const cv = ref.current; if(!cv) return;
    const ctx = cv.getContext('2d');
    ctx.clearRect(0,0,W,H);
    const base = t - start;
    if (base < 0) return;
    for (const p of PARTICLES){
      const lt = base - p.delay;
      if (lt < 0) continue;
      if (lt > p.life) continue;
      const x = p.x0 + p.vx*lt;
      const y = p.y0 + p.vy*lt + 0.5*p.g*lt*lt;
      if (y > H + 60) continue;
      const alpha = clamp(1 - lt/p.life, 0, 1) * endFade(t);
      if (alpha <= 0) continue;
      const rot = p.rot0 + p.vr*lt;
      ctx.save();
      ctx.translate(x, y);
      ctx.rotate(rot);
      ctx.globalAlpha = alpha;
      ctx.fillStyle = p.color;
      ctx.fillRect(-p.size/2, -p.size/2, p.size, p.size*0.62);
      ctx.restore();
    }
  }, [t, start]);
  return <canvas ref={ref} width={W} height={H}
    style={{position:'absolute', inset:0, width:W, height:H, pointerEvents:'none'}}/>;
}

// ── ruke koje "drže" 6 i 7 (gore/dolje u suprotnim smjerovima) ──
function Hands(){
  const t = useTime();
  const appearAt = 8.2;
  const a = clamp((t - appearAt)/0.6, 0, 1);
  if (a <= 0) return null;
  const op = a * endFade(t);
  const ease = Easing.easeOutBack(a);
  const entryY = (1 - ease) * 70;          // uklize odozdo
  const amp = 52;
  const osc = Math.sin(t * 2.3);            // zajednički ritam
  const leftY  = -osc * amp;                // lijeva gore…
  const rightY =  osc * amp;                // …desna dolje (suprotno)

  const w = 470, h = Math.round(w * 348/688);
  const top = Math.round(H * 0.685);
  const filt = 'invert(1) drop-shadow(0 8px 16px rgba(0,0,0,.55))';

  return (
    <div style={{position:'absolute', left:0, right:0, top, opacity:op, pointerEvents:'none'}}>
      <img src="assets/ruka.png" alt="" width={w} height={h}
        style={{position:'absolute', left:135, top:0, width:w, height:h,
          transform:`translateY(${entryY + leftY}px) rotate(-5deg)`,
          filter:filt, willChange:'transform'}}/>
      <img src="assets/ruka.png" alt="" width={w} height={h}
        style={{position:'absolute', left:485, top:0, width:w, height:h,
          transform:`translateY(${entryY + rightY}px) scaleX(-1) rotate(-5deg)`,
          filter:filt, willChange:'transform'}}/>
    </div>
  );
}

// ── ROOT ───────────────────────────────────────────────────
function Invitation(){
  const t = useTime();
  // data-screen-label za komentiranje po sekundi
  React.useEffect(()=>{
    const el = document.getElementById('vidroot');
    if (el) el.setAttribute('data-screen-label', 't=' + t.toFixed(1) + 's');
  }, [t]);
  return (
    <div id="vidroot" style={{position:'absolute', inset:0, overflow:'hidden'}}>
      <Backdrop/>
      <Caption text={<span>Više <span style={{color:C.six}}>neću</span> imati 6 godina…</span>}
               start={3.7} end={6.0}/>
      <Caption text={<span>…jer uskoro <span style={{color:C.seven}}>punim 7!</span></span>}
               start={6.8} end={999}/>
      <BigNumber value="6" color={C.six} glow={C.sixGlow} shadow={C.sixShadow}
                 appearAt={4.0} settleAt={7.0} wigPhase={0}
                 xFn={interpolate([4.0, 4.8, 6.4, 7.0], [-820, 0, 0, -205],
                      [Easing.easeOutCubic, Easing.linear, Easing.easeInOutCubic])}/>
      <BigNumber value="7" color={C.seven} glow={C.sevenGlow} shadow={C.sevenShadow}
                 appearAt={6.9} settleAt={7.9} wigPhase={1.7}
                 xFn={interpolate([6.9, 7.9], [820, 205], Easing.easeOutCubic)}/>
      <Confetti start={8.2}/>
      <Hands/>
      <Secret/>
      <ScrollHint/>
    </div>
  );
}

window.Invitation = Invitation;
