export {};

const initialized = new WeakSet<Element>();

function reducedMotion(): boolean {
  return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
}

function prepareRevealTargets(): Element[] {
  const selectors = [
    '.section:not(.services-teaser) .section-heading',
    '.insight-card',
    '.work-mix div',
    '.opportunity-grid article',
    '.proof-card',
    '.references-teaser .reference-card',
    '.cta',
  ];

  return selectors.flatMap((selector) => Array.from(document.querySelectorAll(selector)));
}

function initScrollReveal(): void {
  const targets = prepareRevealTargets().filter((element) => !initialized.has(element));
  if (!targets.length) return;

  targets.forEach((element, index) => {
    initialized.add(element);
    (element as HTMLElement).dataset.reveal = '';
    (element as HTMLElement).style.setProperty('--reveal-delay', `${Math.min(index % 4, 3) * 80}ms`);
  });

  if (reducedMotion()) {
    targets.forEach((element) => element.classList.add('is-visible'));
    return;
  }

  const observer = new IntersectionObserver((entries) => {
    entries.forEach((entry) => {
      if (!entry.isIntersecting) return;
      entry.target.classList.add('is-visible');
      observer.unobserve(entry.target);
    });
  }, { rootMargin: '0px 0px -12% 0px', threshold: 0.16 });

  targets.forEach((element) => observer.observe(element));
  document.addEventListener('astro:before-swap', () => observer.disconnect(), { once: true });
}

if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', initScrollReveal, { once: true });
} else {
  initScrollReveal();
}

document.addEventListener('astro:page-load', initScrollReveal);
