/* fx3d/Camadas.jsx — o momento "separa em camadas": o fundo e a pessoa
 * viram duas placas no espaço, se afastam em profundidade, a câmera gira um
 * pouco para mostrar que são duas, e tudo volta a encostar.
 *
 * POR QUE CSS 3D E NÃO three.js AQUI: as camadas são PLANOS. A perspectiva
 * do CSS (perspective + translateZ + rotateY) projeta plano exatamente como
 * uma câmera, e a imagem de cada quadro entra como <Img> — o Remotion espera
 * cada uma carregar antes de fotografar o quadro. Com three seria preciso
 * subir uma textura por quadro para a GPU e esperar por ela à mão.
 *
 * O primeiro e o último quadro são a composição plana (k = 0): o corte para
 * o vídeo normal, antes e depois, não aparece.
 *
 * props: {n, fps, w, h, dir, fundo, rotulos:{fundo, pessoa}} */
import React from 'react';
import { AbsoluteFill, Img, staticFile, useCurrentFrame } from 'remotion';

const clamp = (x) => Math.max(0, Math.min(1, x));
const suave = (x) => { const t = clamp(x); return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2; };

function Rotulo({ texto, k, cor, lado = 'left' }) {
  if (!texto) return null;
  return (
    <div style={{ position: 'absolute', [lado]: '6%', top: '4%', padding: '14px 26px', borderRadius: 999, background: 'rgba(10,14,22,0.72)',
      border: `3px solid ${cor}`, color: '#fff', font: '800 44px/1 system-ui, -apple-system, Helvetica, Arial', letterSpacing: 3,
      opacity: clamp((k - 0.5) * 2.5), transform: `translateZ(2px)` }}>{texto}</div>
  );
}

export const Camadas = (p) => {
  const f = useCurrentFrame();
  const { w, h, n, fps } = p;
  const ent = Math.round(fps * 0.75);
  const sai = Math.round(fps * 0.75);
  const k = f < ent ? suave(f / ent) : f > n - 1 - sai ? suave((n - 1 - f) / sai) : 1;
  const t = f / fps;
  const rotY = -34 * k + Math.sin(t * 1.3) * 7 * k;
  const rotX = 10 * k;
  const escala = 1 - 0.34 * k;
  const pessoa = staticFile(`${p.dir}/p${String(f + 1).padStart(4, '0')}.png`);
  const placa = { position: 'absolute', left: 0, top: 0, width: w, height: h, transformStyle: 'preserve-3d' };
  const borda = (cor) => ({ position: 'absolute', inset: 0, border: `${Math.round(6 * k)}px solid ${cor}`, borderRadius: 18 * k, opacity: k, boxShadow: `0 40px 120px rgba(0,0,0,${0.55 * k})` });
  return (
    <AbsoluteFill style={{ background: 'radial-gradient(ellipse at 50% 40%, #1d2433 0%, #07090f 75%)', perspective: 2600, perspectiveOrigin: '50% 45%', overflow: 'hidden' }}>
      {/* o chão de grade, que dá a noção de espaço */}
      <div style={{ position: 'absolute', left: -w, top: h * 0.62, width: w * 3, height: h, opacity: 0.45 * k,
        transform: 'rotateX(78deg)', transformOrigin: '50% 0%',
        backgroundImage: 'linear-gradient(rgba(120,200,255,0.35) 2px, transparent 2px), linear-gradient(90deg, rgba(120,200,255,0.35) 2px, transparent 2px)',
        backgroundSize: '120px 120px' }} />
      <div style={{ ...placa, transform: `scale(${escala}) rotateX(${rotX}deg) rotateY(${rotY}deg)` }}>
        <div style={{ ...placa, transform: `translateZ(${-560 * k}px)` }}>
          <Img src={staticFile(p.fundo)} style={{ width: w, height: h, borderRadius: 18 * k, filter: `brightness(${1 - 0.18 * k})` }} />
          <div style={borda('rgba(255,190,90,0.95)')} />
          <Rotulo texto={(p.rotulos || {}).fundo} k={k} cor="rgba(255,190,90,0.95)" lado="right" />
        </div>
        <div style={{ ...placa, transform: `translateZ(${300 * k}px)` }}>
          <Img src={pessoa} style={{ width: w, height: h, filter: `drop-shadow(0 0 ${Math.round(22 * k)}px rgba(90,210,255,${0.85 * k}))` }} />
          <div style={{ ...borda('rgba(90,210,255,0.9)'), background: 'transparent' }} />
          <Rotulo texto={(p.rotulos || {}).pessoa} k={k} cor="rgba(90,210,255,0.9)" />
        </div>
      </div>
    </AbsoluteFill>
  );
};
