// =====================================================================
// CENA D-spotify (6,04–8,05 s, ref 8,00): janela do Spotify em modo letra, karaokê nas linhas 5 e 6.
// Monta 4 comps (reaproveita as que já existem, só troca as camadas):
//   "D janela"        2002x1292  janela.png (3x) + 9 linhas de letra lidas de ae/letra.json (slots D1–D9) com karaokê em D5/D6
//   "Area de trabalho" 1080x1080 papel de parede + ícones + barra (usada na cena C e no começo da D)
//   "D mundo"         1400x1400  null "CAM espelho" (copia o CAM da CENA D) + "D janela" no mundo (margem de 160 px p/ a inclinação não abrir buraco)
//   "CENA D-spotify"  1080x1080  CAM (câmera medida) + "D mundo" em 3D sem colapsar (a inclinação da janela é de tela) + fundo
// Obs.: precomp 3D COLAPSADA com camadas 2D dentro não inclina (testado 17/10); por isso "D mundo" não é colapsada.
// Mundo da cena D = quadro 8,00 s do original. Janela: canto sup. esq. no mundo (-314,-142), 2002x1292.
// Rodar com: P = "<raiz do projeto>/"; $.evalFile(P + "ae/D-spotify.jsx");  (ES3, comp fechada)
// =====================================================================
$.evalFile(P + "ae/w-midia-comum.jsx");
$.evalFile(P + "ae/camera.jsx");
$.evalFile(P + "ae/letra.jsx");

var D = {};
D.pasta = WM.pasta("w-midia");
D.pastaAssets = WM.pasta("w-midia assets");
D.JX = -314; D.JY = -142;               // canto da janela no mundo
D.TX = 112 - D.JX;                       // x do texto da letra dentro da "D janela" (mundo 112)
D.LINHA0 = 40 - D.JY;                     // centro da 1ª linha (mundo 40)
D.PASSO = 113.5;                          // distância entre linhas (medida no quadro 8,00)
D.APAGADA = WM.cor("#4D8AB2");            // linhas 1–6 sem acender
D.CLARA = WM.cor("#8FD8FD");              // linhas 7–9 (mais claras, como no original)
// as 9 linhas vêm do letra.json (o autor cola a letra; vazio = "reserva" em inglês)
D.LINHAS = []; (function () { for (var n = 1; n <= 9; n++) D.LINHAS.push(LETRA("D" + n)); })();
// karaokê: janela [início, fim] em que cada palavra acende (letra a letra), MEDIDA no original quadro a quadro
// (linha 5: 1ª palavra acesa em 6,00; 2ª 6,10–6,40; 3ª 6,46–6,58; 4ª 6,68–7,08 · linha 6: 7,30–7,50; 7,54–7,66; 7,71–7,83; 7,85–8,08).
// Fica melhor que os tempos de canto do slot porque o acendimento do original anda um pouco atrás da voz.
D.ACENDE = { 4: [[5.80, 5.98], [6.10, 6.40], [6.46, 6.58], [6.68, 7.08]], 5: [[7.30, 7.50], [7.54, 7.66], [7.71, 7.83], [7.85, 8.08]] };
// chaves do índice "End" do animador de cor: palavras a mais seguem no mesmo ritmo (0,06 s por letra)
D.chavesKaraoke = function (palavras, janelas) {
  var keys = [], c = 0, k, j;
  for (k = 0; k < palavras.length; k++) {
    j = janelas[k];
    if (!j) { var t0 = keys[keys.length - 1][0] + 0.04; j = [t0, t0 + 0.06 * palavras[k].length]; }
    keys.push([j[0], c]); c += palavras[k].length; keys.push([j[1], c]); c += 1;
  }
  return keys;
};

// ---------- 1. Area de trabalho ----------
var ftDesk = WM.png(P + "assets/C-alttab/desktop.png", D.pastaAssets);
var cDesk = WM.comp("Area de trabalho", 1080, 1080, D.pasta);
WM.camadaPNG(cDesk, ftDesk, 0, 0, "area de trabalho (PNG 3x)");

// ---------- 2. D janela ----------
var ftJan = WM.png(P + "assets/D-spotify/janela.png", D.pastaAssets);
var cJan = WM.comp("D janela", 2002, 1292, D.pasta);
WM.camadaPNG(cJan, ftJan, 0, 0, "janela spotify (PNG 3x)");
var i, L;
for (i = 0; i < D.LINHAS.length; i++) {
  // Figtree ExtraBold 60 com espaçamento +6: com a letra colada, a largura das linhas iguais ao original fica dentro de ±1 %
  L = WM.texto(cJan, D.LINHAS[i].texto, "Figtree-ExtraBold", 60, (i >= 6 ? D.CLARA : D.APAGADA), ParagraphJustification.LEFT_JUSTIFY,
    D.TX, D.LINHA0 + D.PASSO * i + 21, "letra " + (i + 1) + " (slot D" + (i + 1) + ")", 6);
  if (D.ACENDE[i]) {
    var tp = L.property("ADBE Text Properties");
    var an = tp.property("ADBE Text Animators").addProperty("ADBE Text Animator"); an.name = "karaoke";
    an.property("ADBE Text Animator Properties").addProperty("ADBE Text Fill Color");
    an = tp.property("ADBE Text Animators").property("karaoke");
    an.property("ADBE Text Animator Properties").property("ADBE Text Fill Color").setValue([1, 1, 1]);
    var sel = an.property("ADBE Text Selectors").addProperty("ADBE Text Selector");
    sel = tp.property("ADBE Text Animators").property("karaoke").property("ADBE Text Selectors").property(1);
    var adv = sel.property("ADBE Text Range Advanced");
    adv.property("ADBE Text Range Units").setValue(2);      // índice
    adv.property("ADBE Text Range Type2").setValue(1);      // caracteres
    adv.property("ADBE Text Range Shape").setValue(1);      // quadrado
    sel.property("ADBE Text Index Start").setValue(0);
    WM.chaves(sel.property("ADBE Text Index End"), D.chavesKaraoke(D.LINHAS[i].palavras, D.ACENDE[i]), "linear");
  }
}

// ---------- 3. D mundo ----------
var cMun = WM.comp("D mundo", 1400, 1400, D.pasta);
var esp = cMun.layers.addNull(WM.DUR); esp.name = "CAM espelho (segue o CAM da CENA D-spotify)"; esp.enabled = false; esp.label = 1;
var trE = esp.property("ADBE Transform Group");
trE.property("ADBE Anchor Point").expression = 'comp("CENA D-spotify").layer("CAM").transform.anchorPoint';
trE.property("ADBE Position").expression = '[thisComp.width/2, thisComp.height/2]';  // 700,700 = centro da tela da CENA D
trE.property("ADBE Scale").expression = 'comp("CENA D-spotify").layer("CAM").transform.scale';
trE.property("ADBE Rotate Z").expression = 'comp("CENA D-spotify").layer("CAM").transform.rotation';
var Lj = cMun.layers.add(cJan); Lj.name = "D janela"; Lj.collapseTransformation = true; Lj.parent = esp;
Lj.property("ADBE Transform Group").property("ADBE Anchor Point").setValue([0, 0]);
Lj.property("ADBE Transform Group").property("ADBE Position").setValue([D.JX, D.JY]);
Lj.property("ADBE Transform Group").property("ADBE Scale").setValue([100, 100]);   // parent= compensa a escala do pai; zera aqui
// corte da nota (borda direita em mundo 1050 a partir de 7,5 s — é o começo da máscara que vira o círculo "Sua nota" na cena E)
var mk = Lj.property("ADBE Mask Parade").addProperty("ADBE Mask Atom"); mk.name = "corte nota";
mk = Lj.property("ADBE Mask Parade").property("corte nota");
var mp = mk.property("ADBE Mask Shape");
var sLarga = WM.retRed(1001, 646, 2400, 1700, 0), sCorte = WM.retRed((-200 + 1050 - D.JX) / 2, 646, (1050 - D.JX) + 200, 1700, 0);
mp.setValueAtTime(0, sLarga); mp.setValueAtTime(7.5, sCorte);
mp.setInterpolationTypeAtKey(1, KeyframeInterpolationType.HOLD, KeyframeInterpolationType.HOLD);
mk.property("ADBE Mask Feather").setValue([0, 0]);
WM.blurTodas(cMun);

// ---------- 4. CENA D-spotify ----------
var cena = WM.comp("CENA D-spotify", 1080, 1080, D.pasta);
var fundo = cena.layers.addSolid(WM.cor("#090F11"), "Fundo IG (aparece no corte da nota)", 1080, 1080, 1, WM.DUR);
var desk = cena.layers.add(cDesk); desk.name = "Area de trabalho (fixa na tela, 6,04–6,33)";
var op = desk.property("ADBE Transform Group").property("ADBE Opacity");
WM.chaves(op, [[0, 0], [6.0417, 100], [6.3333, 0]], "hold");
var mun = cena.layers.add(cMun); mun.name = "D mundo (3D: inclinação de tela)"; mun.threeDLayer = true; mun.collapseTransformation = false;
var trM = mun.property("ADBE Transform Group");
trM.property("ADBE Anchor Point").setValue([700, 700, 0]); trM.property("ADBE Position").setValue([540, 540, 0]);
// inclinação 3D da janela enquanto a câmera avança (medida a olho no original: lados divergem p/ a direita, some em 7,25)
// giro Y medido pelo declive das linhas no original (declive = Δy·tanθ/1500): 3,8° em 6,25 -> 16,8° em 6,75 -> 0 em 7,5
WM.chaves(trM.property("ADBE Rotate Y"), [[6.0417, 0], [6.125, 1.4], [6.25, 3.8], [6.375, 7.8], [6.5, 16.3], [6.75, 17.3], [6.875, 17.5],
  [7.0, 16.7], [7.125, 13.75], [7.25, 7.2], [7.375, 2.0], [7.5, 0]], "suave");
// giro Z pequeno: no original o "horizonte" da perspectiva fica ~190 px acima do centro; um giro leve reproduz o declive extra
WM.chaves(trM.property("ADBE Rotate Z"), [[6.0417, 0], [6.25, 0.26], [6.375, 1.0], [6.5, 1.45], [6.75, 2.2], [7.0, 1.65], [7.125, 0.4],
  [7.25, 0], [7.5, 0]], "suave");
var cam = CAMERA_criar(cena, P + "camera/cena-D-spotify.json");
// correção do zoom em 6,6–7,25 (o passo das linhas no original fica ~8% maior em 7,0; conferido por medição das linhas)
WM.trocarChaves(cam.property("ADBE Effect Parade").property("Zoom (log2)").property(1), 6.59, 7.34, [[6.625, 0.8372],[6.6667, 0.9099],[6.7083, 0.9753],[6.75, 1.0338],[6.7917, 1.0717],[6.8333, 1.1048],[6.875, 1.134],[6.9167, 1.1597],[6.9583, 1.1829],[7.0, 1.2057],[7.0417, 1.2037],[7.0833, 1.2025],[7.125, 1.172],[7.1667, 1.1256],[7.2083, 1.0779],[7.25, 1.033],[7.2917, 0.9974],[7.3333, 0.9635]]);
cam.moveToBeginning();
WM.blurTodas(cena);
cena.layer("CAM").motionBlur = false;
WM.limparSolidos();
"ok D: " + cJan.numLayers + " camadas na janela; CENA D com " + cena.numLayers;
