/* global gsap, ScrollTrigger, Lenis */
/* =============================================================================
   Flavio Seguros — camada de movimento (GSAP + ScrollTrigger + Lenis).
   Progressive enhancement: sem JS/gsap ou com prefers-reduced-motion, o
   conteúdo aparece normalmente. Exposto como window.FCS.motion.
   ============================================================================= */
(function () {
  function reduced() { return window.matchMedia('(prefers-reduced-motion: reduce)').matches; }
  function fine() { return window.matchMedia('(pointer: fine)').matches; }
  var started = false;

  function init(cfg) {
    if (started) return; started = true;
    cfg = cfg || {};
    var hasGsap = window.gsap && window.ScrollTrigger;
    if (hasGsap) gsap.registerPlugin(ScrollTrigger);
    if (reduced() || !hasGsap) { fallback(); return; }

    document.documentElement.classList.add('fcs-motion');

    // Smooth scroll (Lenis) ligado ao ticker do GSAP.
    if (cfg.smoothScroll !== false && window.Lenis) {
      try {
        var lenis = new Lenis({ lerp: 0.09, wheelMultiplier: 1, smoothWheel: true, touchMultiplier: 1.5 });
        lenis.on('scroll', ScrollTrigger.update);
        gsap.ticker.add(function (t) { lenis.raf(t * 1000); });
        gsap.ticker.lagSmoothing(0);
        window.FCS._lenis = lenis;
      } catch (e) { /* segue sem smooth scroll */ }
    }

    reveals(); counters(); parallax(); drawLines();
    if (cfg.cursor !== false && fine()) cursor();

    var refresh = function () { ScrollTrigger.refresh(); };
    refresh();
    [300, 900, 1700].forEach(function (ms) { setTimeout(refresh, ms); });
    if (document.fonts && document.fonts.ready) document.fonts.ready.then(refresh);
  }

  function fallback() {
    document.querySelectorAll('.rise, .reveal, [data-mask] .ml > span').forEach(function (e) { e.style.opacity = 1; e.style.transform = 'none'; });
    document.querySelectorAll('[data-count]').forEach(function (e) {
      var end = parseFloat(e.getAttribute('data-count'));
      e.textContent = e.getAttribute('data-count-sep') ? Math.round(end).toLocaleString('pt-BR') : end.toFixed(parseInt(e.getAttribute('data-count-dec') || '0', 10));
    });
  }

  function inView(el, f) { var r = el.getBoundingClientRect(); return r.top < window.innerHeight * (f || 0.9) && r.bottom > 0; }

  function reveals() {
    // Máscaras de headline (linha a linha).
    gsap.utils.toArray('[data-mask]').forEach(function (h) {
      var lines = h.querySelectorAll('.ml > span');
      var play = function (d) { gsap.to(lines, { y: 0, duration: 0.95, ease: 'power4.out', stagger: 0.09, delay: d || 0, overwrite: true }); };
      if (inView(h, 0.92)) play(0.12);
      else ScrollTrigger.create({ trigger: h, start: 'top 88%', once: true, onEnter: function () { play(0); } });
    });
    // Entradas discretas (fade + subida + leve blur).
    var visN = 0;
    gsap.utils.toArray('.rise, .reveal').forEach(function (el) {
      var withBlur = el.classList.contains('rise');
      var play = function (d) { var v = { opacity: 1, y: 0, duration: 0.85, ease: 'power3.out', delay: d || 0, overwrite: true }; if (withBlur) v.filter = 'blur(0px)'; gsap.to(el, v); };
      if (inView(el, 0.9)) { play(Math.min(visN * 0.07, 0.42)); visN++; }
      else ScrollTrigger.create({ trigger: el, start: 'top 90%', once: true, onEnter: function () { play(0); } });
    });
  }

  function counters() {
    gsap.utils.toArray('[data-count]').forEach(function (el) {
      var end = parseFloat(el.getAttribute('data-count'));
      var dec = parseInt(el.getAttribute('data-count-dec') || '0', 10);
      var sep = el.getAttribute('data-count-sep');
      var fmt = function (v) { return sep ? Math.round(v).toLocaleString('pt-BR') : v.toFixed(dec); };
      var run = function () { var obj = { v: 0 }; gsap.to(obj, { v: end, duration: 1.7, ease: 'power2.out', onUpdate: function () { el.textContent = fmt(obj.v); } }); };
      if (inView(el, 0.92)) run();
      else ScrollTrigger.create({ trigger: el, start: 'top 92%', once: true, onEnter: run });
    });
  }

  function parallax() {
    gsap.utils.toArray('[data-parallax]').forEach(function (el) {
      var sp = parseFloat(el.getAttribute('data-parallax')) || 0.12;
      var scope = el.closest('[data-parallax-scope]') || el;
      gsap.fromTo(el, { yPercent: sp * 60 }, { yPercent: -sp * 60, ease: 'none', scrollTrigger: { trigger: scope, start: 'top bottom', end: 'bottom top', scrub: true } });
    });
  }

  function drawLines() {
    gsap.utils.toArray('[data-draw]').forEach(function (el) {
      var scope = el.closest('[data-draw-scope]') || el;
      gsap.fromTo(el, { scaleY: 0 }, { scaleY: 1, ease: 'none', transformOrigin: 'top', scrollTrigger: { trigger: scope, start: 'top 68%', end: 'bottom 62%', scrub: true } });
    });
  }

  function cursor() {
    var ring = document.createElement('div'); ring.className = 'fcs-cursor-ring'; ring.setAttribute('aria-hidden', 'true');
    document.body.appendChild(ring); document.body.classList.add('fcs-has-cursor');
    gsap.set(ring, { xPercent: -50, yPercent: -50, opacity: 0 });
    var xTo = gsap.quickTo(ring, 'x', { duration: 0.35, ease: 'power3' });
    var yTo = gsap.quickTo(ring, 'y', { duration: 0.35, ease: 'power3' });
    var shown = false;
    var lum = function (c) { var m = c.match(/\d+(\.\d+)?/g); if (!m) return 1; return (0.2126 * (+m[0]) + 0.7152 * (+m[1]) + 0.0722 * (+m[2])) / 255; };
    var sample = function (x, y) {
      var stack = document.elementsFromPoint(x, y); var node = null;
      for (var i = 0; i < stack.length; i++) { if (stack[i] !== ring) { node = stack[i]; break; } }
      var bg = null;
      while (node) { var c = getComputedStyle(node).backgroundColor; if (c && c !== 'transparent' && !/rgba\([^)]*,\s*0\)/.test(c)) { bg = c; break; } node = node.parentElement; }
      ring.style.setProperty('--ring-c', (bg ? lum(bg) < 0.55 : true) ? '#fff' : '#0B2A47');
    };
    var last = 0;
    window.addEventListener('mousemove', function (e) {
      xTo(e.clientX); yTo(e.clientY);
      if (!shown) { shown = true; gsap.to(ring, { opacity: 1, duration: 0.3 }); }
      var n = performance.now(); if (n - last > 90) { last = n; sample(e.clientX, e.clientY); }
    });
    window.addEventListener('mouseout', function (e) { if (!e.relatedTarget) gsap.to(ring, { opacity: 0, duration: 0.3 }); });
    document.addEventListener('mouseover', function (e) { if (e.target.closest && e.target.closest('a, button, [data-cursor], input, textarea, select, [role="button"]')) ring.classList.add('is-hover'); });
    document.addEventListener('mouseout', function (e) { if (e.target.closest && e.target.closest('a, button, [data-cursor], input, textarea, select, [role="button"]')) ring.classList.remove('is-hover'); });
  }

  window.FCS = Object.assign(window.FCS || {}, { motion: { init: init } });
})();
