(() => {
  'use strict';

  /* ---------- Header shadow on scroll ---------- */
  const header = document.getElementById('header');
  const onScroll = () => {
    header.classList.toggle('is-scrolled', window.scrollY > 10);
    backToTop.classList.toggle('is-visible', window.scrollY > 600);
  };

  /* ---------- Back to top ---------- */
  const backToTop = document.getElementById('back-to-top');
  backToTop.addEventListener('click', () => {
    window.scrollTo({ top: 0, behavior: 'smooth' });
  });

  window.addEventListener('scroll', onScroll, { passive: true });
  onScroll();

  /* ---------- Cookie banner ---------- */
  const cookieBanner = document.getElementById('cookie-banner');
  const cookieConsent = localStorage.getItem('avc-cookie-consent');
  if (cookieBanner && !cookieConsent) {
    requestAnimationFrame(() => cookieBanner.classList.add('is-visible'));
  }
  const setCookieConsent = (value) => {
    localStorage.setItem('avc-cookie-consent', value);
    cookieBanner.classList.remove('is-visible');
  };
  document.getElementById('cookie-accept')?.addEventListener('click', () => setCookieConsent('accepted'));
  document.getElementById('cookie-decline')?.addEventListener('click', () => setCookieConsent('declined'));

  /* ---------- Mobile nav (fade, not slide — avoids horizontal overflow) ---------- */
  const burger = document.getElementById('burger');
  const nav = document.getElementById('header-nav');
  burger.addEventListener('click', () => {
    const isOpen = nav.classList.toggle('is-open');
    burger.setAttribute('aria-expanded', String(isOpen));
    document.body.style.overflow = isOpen ? 'hidden' : '';
  });
  nav.querySelectorAll('.nav-link').forEach(link => {
    link.addEventListener('click', () => {
      nav.classList.remove('is-open');
      burger.setAttribute('aria-expanded', 'false');
      document.body.style.overflow = '';
    });
  });

  /* ---------- Scrollspy (nav segue a secção visível) ---------- */
  const navLinks = document.querySelectorAll('.nav-link');
  if (navLinks.length) {
    const spySections = Array.from(navLinks)
      .map(link => link.getAttribute('href'))
      .filter(href => href && href.startsWith('#'))
      .map(href => document.querySelector(href))
      .filter(Boolean);

    const setActiveLink = (id) => {
      navLinks.forEach(link => {
        link.classList.toggle('is-active', link.getAttribute('href') === '#' + id);
      });
    };

    const spyObserver = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) setActiveLink(entry.target.id);
      });
    }, { rootMargin: '-45% 0px -45% 0px', threshold: 0 });

    spySections.forEach(section => spyObserver.observe(section));
  }

  /* ---------- Reveal-on-scroll ---------- */
  const revealEls = document.querySelectorAll('.reveal');
  const revealObserver = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        entry.target.classList.add('is-visible');
        revealObserver.unobserve(entry.target);
      }
    });
  }, { threshold: 0.15, rootMargin: '0px 0px -60px 0px' });
  revealEls.forEach(el => revealObserver.observe(el));

  /* ---------- Counters ---------- */
  const counters = document.querySelectorAll('.counter');
  const animateCounter = (el) => {
    const target = parseInt(el.dataset.target, 10);
    const suffix = el.dataset.suffix || '';
    const duration = 1400;
    const start = performance.now();

    const step = (now) => {
      const progress = Math.min((now - start) / duration, 1);
      const eased = 1 - Math.pow(1 - progress, 3);
      el.textContent = Math.round(eased * target) + suffix;
      if (progress < 1) requestAnimationFrame(step);
    };
    requestAnimationFrame(step);
  };

  const counterObserver = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        animateCounter(entry.target);
        counterObserver.unobserve(entry.target);
      }
    });
  }, { threshold: 0.5 });
  counters.forEach(el => counterObserver.observe(el));

  /* ---------- Testimonial carousel (ilustrativo — substituir por testemunhos reais) ---------- */
  const testimonials = [
    {
      title: 'Sempre encontrei o apoio e os produtos certos',
      text: 'A equipa ajudou-nos a escolher o equipamento certo para a recuperação do meu pai depois do AVC. Sentimos um acompanhamento próximo do início ao fim.',
      name: 'Cuidadora familiar · Barcelos'
    },
    {
      title: 'Atendimento próximo e muito profissional',
      text: 'Como fisioterapeuta, recomendo a Loja Social do AVC aos meus pacientes. O aconselhamento sobre os produtos é sempre rigoroso e atualizado.',
      name: 'Fisioterapeuta · Braga'
    },
    {
      title: 'Resolveram o meu problema rapidamente',
      text: 'Precisava de alugar uma cadeira de rodas por poucas semanas e a equipa tratou de tudo com flexibilidade e simpatia.',
      name: 'Cliente · concelho de Barcelos'
    },
    {
      title: 'Uma parceria de confiança',
      text: 'Trabalhamos com a Loja Social do AVC há vários anos. A proximidade com as famílias e o rigor técnico fazem toda a diferença.',
      name: 'Parceiro institucional'
    }
  ];

  const reviewTitle = document.getElementById('review-title');
  const reviewText = document.getElementById('review-text');
  const reviewName = document.getElementById('review-name');
  const reviewSlide = document.getElementById('review-slide');
  const avatars = document.querySelectorAll('#review-avatars .avatar');

  const showTestimonial = (index) => {
    reviewSlide.style.opacity = '0';
    setTimeout(() => {
      const t = testimonials[index];
      reviewTitle.textContent = t.title;
      reviewText.textContent = t.text;
      reviewName.textContent = t.name;
      reviewSlide.style.opacity = '1';
    }, 200);

    avatars.forEach(a => a.classList.remove('is-active'));
    avatars[index].classList.add('is-active');
  };

  avatars.forEach(avatar => {
    avatar.addEventListener('click', () => {
      showTestimonial(parseInt(avatar.dataset.index, 10));
    });
  });

  /* ---------- Contact form (Formspree) ---------- */
  const form = document.getElementById('contact-form');
  const formStatus = document.getElementById('contact-form-status');

  if (form) {
    form.addEventListener('submit', async (e) => {
      e.preventDefault();
      formStatus.textContent = 'A enviar...';
      formStatus.className = 'contact-form__status';

      try {
        const response = await fetch(form.action, {
          method: 'POST',
          body: new FormData(form),
          headers: { Accept: 'application/json' }
        });

        if (response.ok) {
          form.reset();
          formStatus.textContent = 'Obrigado. A sua mensagem foi recebida, entraremos em contacto em breve.';
          formStatus.classList.add('is-success');
        } else {
          formStatus.textContent = 'Não foi possível enviar a mensagem. Tente novamente ou contacte-nos por telefone.';
          formStatus.classList.add('is-error');
        }
      } catch {
        formStatus.textContent = 'Não foi possível enviar a mensagem. Tente novamente ou contacte-nos por telefone.';
        formStatus.classList.add('is-error');
      }
    });
  }
})();
