/*
 * app.js — comportamentos partilhados por todas as páginas:
 *  - Loader/cortina de transição entre páginas (animação simples e elegante)
 *  - Header sólido vs. sobreposto ao hero
 *  - Revelação de elementos ao scroll (IntersectionObserver)
 */
(function () {
  'use strict';

  const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;

  /* ---------------------------------------------------------------------
   * LOADER de saída: intercepta cliques em links internos marcados com
   * [data-transition] e mostra uma cortina animada com a palavra/destino
   * antes de navegar. Na chegada, a cortina "sobe" e revela a página.
   * ------------------------------------------------------------------- */
  function buildLoader() {
    let el = document.querySelector('.loader');
    if (!el) {
      el = document.createElement('div');
      el.className = 'loader';
      el.setAttribute('aria-hidden', 'true');
      el.innerHTML =
        '<div class="loader__inner">' +
        '<div class="loader__word"><span></span></div>' +
        '<div class="loader__bar"><i></i></div>' +
        '<div class="loader__meta">Maison</div>' +
        '</div>';
      document.body.appendChild(el);
    }
    return el;
  }

  function playOut(label, href) {
    if (reduceMotion) { window.location.href = href; return; }
    const loader = buildLoader();
    loader.querySelector('.loader__word span').textContent = label || 'Maison';
    loader.hidden = false;
    loader.classList.remove('reveal');
    // reinicia animações
    const word = loader.querySelector('.loader__word span');
    const bar = loader.querySelector('.loader__bar i');
    word.style.animation = 'none'; bar.style.animation = 'none';
    void loader.offsetWidth; // reflow
    word.style.animation = ''; bar.style.animation = '';

    // navega quando a barra de progresso termina
    window.setTimeout(function () { window.location.href = href; }, 950);
  }

  // Ao chegar a uma página, se existir loader (ex.: pré-render), revela.
  function playIn() {
    const loader = document.querySelector('.loader:not([hidden])');
    if (loader) {
      // pequena pausa para a animação de carregamento respirar antes de revelar
      const delay = reduceMotion ? 0 : 650;
      window.setTimeout(function () {
        loader.classList.add('reveal');
      }, delay);
      loader.addEventListener('transitionend', function () { loader.hidden = true; }, { once: true });
    }
  }

  // Delegação de cliques para transições
  document.addEventListener('click', function (e) {
    const link = e.target.closest('a[data-transition]');
    if (!link) return;
    // respeita cliques já anulados ou links desativados
    if (e.defaultPrevented || link.getAttribute('aria-disabled') === 'true') return;
    // respeita novos separadores / modificadores
    if (link.target === '_blank' || e.metaKey || e.ctrlKey || e.shiftKey || e.button !== 0) return;
    const href = link.getAttribute('href');
    if (!href || href.startsWith('#')) return;
    e.preventDefault();
    playOut(link.getAttribute('data-label') || link.textContent.trim(), href);
  });

  /* ---------------------------------------------------------------------
   * HEADER: fica sólido quando saímos do hero.
   * ------------------------------------------------------------------- */
  function initHeader() {
    const header = document.querySelector('.site-header');
    const hero = document.querySelector('.hero');
    if (!header) return;
    if (!hero) { header.classList.add('solid'); return; }

    const io = new IntersectionObserver(function (entries) {
      entries.forEach(function (en) {
        header.classList.toggle('solid', !en.isIntersecting);
      });
    }, { rootMargin: '-70px 0px 0px 0px', threshold: 0 });
    io.observe(hero);
  }

  /* ---------------------------------------------------------------------
   * REVEAL ao scroll — adiciona .in aos elementos [data-reveal].
   * ------------------------------------------------------------------- */
  function initReveal() {
    const items = document.querySelectorAll('[data-reveal]');
    if (!items.length) return;
    if (reduceMotion || !('IntersectionObserver' in window)) {
      items.forEach(function (i) { i.classList.add('in'); });
      return;
    }
    const io = new IntersectionObserver(function (entries, obs) {
      entries.forEach(function (en) {
        if (en.isIntersecting) {
          const d = en.target.getAttribute('data-delay');
          if (d) en.target.style.animationDelay = d + 'ms';
          en.target.classList.add('in');
          obs.unobserve(en.target);
        }
      });
    }, { rootMargin: '0px 0px -8% 0px', threshold: 0.08 });
    items.forEach(function (i) { io.observe(i); });
  }

  // Expor utilitário caso as páginas queiram observar novos nós
  window.APP = { initReveal: initReveal, playIn: playIn };

  document.addEventListener('DOMContentLoaded', function () {
    playIn();
    initHeader();
    initReveal();
  });

  // bfcache: ao voltar com o botão "back", garante loader escondido
  window.addEventListener('pageshow', function (e) {
    if (e.persisted) {
      const l = document.querySelector('.loader');
      if (l) l.hidden = true;
    }
  });
})();
