/* ============================================================
   CENTRO CIRÚRGICO OCULAR — Main JavaScript
   ============================================================ */

'use strict';

/* ── DOM Ready ── */
document.addEventListener('DOMContentLoaded', () => {
  initNav();
  initMegaMenu();
  initScrollReveal();
  initServiceFilter();
  initServiceCards();
  initCounters();
  initTestimonialsCarousel();
  initClinicCarousel();
  initCookieBanner();
});

/* ============================================================
   NAVIGATION
   ============================================================ */
function initNav() {
  const nav        = document.querySelector('.nav');
  const hamburger  = document.querySelector('.nav__hamburger');
  const mobileMenu = document.querySelector('.nav__mobile');
  const navLinks   = document.querySelectorAll('.nav__link');

  /* Scroll behavior */
  const handleScroll = () => {
    nav.classList.toggle('scrolled', window.scrollY > 60);

    /* Active link on scroll */
    const sections = document.querySelectorAll('section[id], header[id]');
    let current = '';
    sections.forEach(sec => {
      if (window.scrollY >= sec.offsetTop - 100) current = sec.getAttribute('id');
    });
    navLinks.forEach(link => {
      link.classList.remove('active');
      if (link.getAttribute('href') === `#${current}`) link.classList.add('active');
    });
  };

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

  /* Hamburger toggle */
  hamburger?.addEventListener('click', () => {
    hamburger.classList.toggle('open');
    mobileMenu.classList.toggle('open');
  });

  /* Mobile Serviços top-level accordion */
  document.querySelectorAll('.nav__mobile-toggle').forEach(toggle => {
    toggle.addEventListener('click', e => {
      e.stopPropagation();
      const group = toggle.closest('.nav__mobile-group');
      const isOpen = group.classList.toggle('open');
      toggle.setAttribute('aria-expanded', isOpen);
    });
  });

  /* Close mobile menu on link click */
  mobileMenu?.querySelectorAll('a').forEach(a => {
    a.addEventListener('click', () => {
      hamburger.classList.remove('open');
      mobileMenu.classList.remove('open');
    });
  });

  /* Smooth scroll for all anchor links */
  document.querySelectorAll('a[href^="#"]').forEach(anchor => {
    anchor.addEventListener('click', e => {
      const target = document.querySelector(anchor.getAttribute('href'));
      if (!target) return;
      e.preventDefault();
      const offset = nav?.offsetHeight ?? 80;
      window.scrollTo({ top: target.offsetTop - offset, behavior: 'smooth' });
    });
  });
}

/* ============================================================
   MEGA MENU (hover com delay para não sumir ao mover o rato)
   ============================================================ */
function initMegaMenu() {
  document.querySelectorAll('.nav__item--mega').forEach(item => {
    let timer;

    const open  = () => { clearTimeout(timer); item.classList.add('mega-open'); };
    const close = () => { timer = setTimeout(() => item.classList.remove('mega-open'), 180); };

    item.addEventListener('mouseenter', open);
    item.addEventListener('mouseleave', close);

    const mega = item.querySelector('.nav__mega');
    mega?.addEventListener('mouseenter', open);
    mega?.addEventListener('mouseleave', close);
  });

  /* Mobile sub-accordion (Consultas / Cirurgias / Tratamentos) */
  document.querySelectorAll('.nav__mobile-subtoggle').forEach(btn => {
    btn.addEventListener('click', e => {
      e.stopPropagation();
      const group = btn.closest('.nav__mobile-subgroup');
      group.classList.toggle('open');
    });
  });
}

/* ============================================================
   SERVICE CARDS → navigate to service pages
   ============================================================ */
const SERVICE_URLS = {
  consulta_geral:         'servicos/consulta-geral.html',
  consulta_oculoplastica: 'servicos/consulta-oculoplastica.html',
  consulta_catarata:      'servicos/consulta-catarata.html',
  consulta_cornea:        'servicos/consulta-cornea.html',
  consulta_diabetes:      'servicos/consulta-diabetes.html',
  consulta_estrabismo:    'servicos/consulta-estrabismo.html',
  consulta_glaucoma:      'servicos/consulta-glaucoma.html',
  consulta_imuno:         'servicos/consulta-imuno.html',
  consulta_lentes:        'servicos/consulta-lentes.html',
  consulta_olhoseco:      'servicos/consulta-olhoseco.html',
  consulta_refrativa:     'servicos/consulta-refrativa.html',
  consulta_retina:        'servicos/consulta-retina.html',
  cirurgia_refrativa:     'servicos/cirurgia-refrativa.html',
  blefaroplastia:         'servicos/blefaroplastia.html',
  catarata_cirurgia:      'servicos/cirurgia-catarata.html',
  dacrio:                 'servicos/dacriocistorrinostomia.html',
  estrabismo:             'servicos/cirurgia-estrabismo.html',
  kc:                     'servicos/ceratocone.html',
  injecoes:               'servicos/injecoes-intravitreas.html',
  vitrectomia:            'servicos/vitrectomia.html',
  crosslinking:           'servicos/crosslinking.html',
  glaucoma_cirurgia:      'servicos/tratamento-glaucoma.html',
};

function initServiceCards() {
  document.querySelectorAll('.service-card[data-service]').forEach(card => {
    const url = SERVICE_URLS[card.dataset.service];
    if (!url) return;

    card.style.cursor = 'pointer';
    card.addEventListener('click', () => { window.location.href = url; });
    card.addEventListener('keydown', e => {
      if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); window.location.href = url; }
    });
  });
}

/* ============================================================
   SCROLL REVEAL
   ============================================================ */
function initScrollReveal() {
  const observer = new IntersectionObserver(
    (entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          entry.target.classList.add('visible');
          observer.unobserve(entry.target);
        }
      });
    },
    { threshold: 0.12, rootMargin: '0px 0px -40px 0px' }
  );

  document.querySelectorAll('.reveal').forEach(el => observer.observe(el));
}

/* ============================================================
   SERVICE FILTER TABS
   ============================================================ */
function initServiceFilter() {
  const filterBtns = document.querySelectorAll('.filter-btn');
  const cards      = document.querySelectorAll('.service-card');

  function applyFilter(filter) {
    filterBtns.forEach(b => b.classList.remove('active'));
    const activeBtn = [...filterBtns].find(b => b.dataset.filter === filter);
    if (activeBtn) activeBtn.classList.add('active');

    cards.forEach(card => {
      const cat = card.dataset.category;
      const show = cat === filter;

      if (show) {
        card.removeAttribute('data-hidden');
        card.style.animation = 'none';
        card.offsetHeight;
        card.style.animation = 'fadeInUp 0.4s ease both';
      } else {
        card.setAttribute('data-hidden', 'true');
      }
    });
  }

  filterBtns.forEach(btn => {
    btn.addEventListener('click', () => applyFilter(btn.dataset.filter));
  });

  /* Initialize with first filter active */
  const firstFilter = filterBtns[0]?.dataset.filter;
  if (firstFilter) applyFilter(firstFilter);

  /* CSS keyframe for filter animation */
  const style = document.createElement('style');
  style.textContent = `
    @keyframes fadeInUp {
      from { opacity: 0; transform: translateY(16px); }
      to   { opacity: 1; transform: translateY(0); }
    }
  `;
  document.head.appendChild(style);
}

/* ============================================================
   SERVICE MODAL
   ============================================================ */
const SERVICES_DATA = {
  // ── CONSULTAS ──────────────────────────────────────────────────
  consulta_geral: {
    icon: 'visibility',
    category: 'Consultas',
    title: 'Consulta Oftalmológica Geral',
    desc: 'Na Consulta Geral estabelece-se o primeiro contacto com o doente, identificando o motivo da consulta e registando antecedentes pessoais e familiares. São realizados o estudo refrativo, biomicroscopia de segmento anterior e posterior e tonometria.',
    highlights: [
      'Estudo refrativo com cálculo da melhor acuidade visual corrigida',
      'Biomicroscopia de segmento anterior e posterior',
      'Tonometria por sopro e/ou aplanação',
      'Despiste de erros refrativos e outras patologias oculares',
      'Orientação para consulta de seguimento ou exames complementares',
    ],
  },
  consulta_oculoplastica: {
    icon: 'healing',
    category: 'Consultas',
    title: 'Oculoplástica e Vias Lacrimais',
    desc: 'A Consulta de Oculoplástica avalia e trata alterações palpebrais funcionais e estéticas, incluindo blefaroplastia, ptose, ectrópio, entrópio e patologia das vias lacrimais. Também são avaliadas alterações orbitárias e aplicação de toxina botulínica.',
    highlights: [
      'Avaliação de excesso de pele e bolsas palpebrais (dermatocalásia)',
      'Correção de ectrópio, entrópio e ptose palpebral',
      'Estudo das vias lacrimais e tratamento da epífora',
      'Patologia orbitária e tumores palpebrais',
      'Toxina botulínica (BOTOX®) para rugas de expressão',
    ],
  },
  consulta_catarata: {
    icon: 'lens_blur',
    category: 'Consultas',
    title: 'Consulta de Catarata',
    desc: 'A consulta de catarata avalia a opacificação do cristalino, que pode ser causada pelo envelhecimento, fatores metabólicos ou traumatismos. O diagnóstico é feito por exame oftalmológico completo, sendo a cirurgia o único tratamento eficaz.',
    highlights: [
      'Diagnóstico por exame oftalmológico completo',
      'Avaliação de catarata senil, metabólica e traumática',
      'Estudo pré-operatório com biometria (IOLMaster)',
      'Seleção do tipo de lente intraocular adequada',
      'Orientação cirúrgica com facoemulsificação',
    ],
  },
  consulta_cornea: {
    icon: 'remove_red_eye',
    category: 'Consultas',
    title: 'Córnea',
    desc: 'A consulta de Córnea avalia patologias degenerativas, inflamatórias, infeciosas e traumáticas desta estrutura transparente do olho. O ceratocone, as úlceras corneanas e as degenerescências são diagnosticadas e tratadas com tecnologia avançada.',
    highlights: [
      'Diagnóstico de ceratocone e degenerescência marginal pelúcida',
      'Tratamento de úlceras corneanas bacterianas, virais e fúngicas',
      'Crosslinking (CXL) para estabilização da progressão do ceratocone',
      'Segmentos de anel intra-corneanos com LASER Femtosegundo',
      'Transplante de córnea nos casos avançados',
    ],
  },
  consulta_diabetes: {
    icon: 'bloodtype',
    category: 'Consultas',
    title: 'Diabetes Ocular',
    desc: 'A retinopatia diabética é causada por danos nos vasos sanguíneos da retina devido a níveis elevados de glicemia. Existem dois tipos principais: a retinopatia não proliferativa e a proliferativa, sendo o rastreio e tratamento precoces fundamentais para preservar a visão.',
    highlights: [
      'Rastreio e monitorização da retinopatia diabética',
      'Avaliação de retinopatia não proliferativa (RDNP) e proliferativa (RDP)',
      'Diagnóstico de edema macular diabético',
      'Tratamento com injeções anti-VEGF e laser',
      'Seguimento multidisciplinar com endocrinologista',
    ],
  },
  consulta_estrabismo: {
    icon: 'child_care',
    category: 'Consultas',
    title: 'Estrabismo e Oftalmologia Pediátrica',
    desc: 'O estrabismo ocorre quando os olhos não estão alinhados ou não se movimentam juntos normalmente. A consulta pediátrica é essencial antes dos 3 anos de idade para despiste precoce, tratamento da ambliopia e preservação da visão binocular.',
    highlights: [
      'Avaliação do alinhamento e motilidade ocular',
      'Despiste e tratamento de ambliopia (olho preguiçoso)',
      'Avaliação de pseudoestrabismo e estrabismo latente',
      'Prescrição de óculos e oclusão terapêutica',
      'Orientação para cirurgia de estrabismo quando indicada',
    ],
  },
  consulta_glaucoma: {
    icon: 'blur_on',
    category: 'Consultas',
    title: 'Glaucoma',
    desc: 'O glaucoma afeta 4% da população e pode causar cegueira total de forma silenciosa, danificando o nervo ótico através da pressão intraocular elevada. O diagnóstico e tratamento precoces são essenciais para preservar o campo visual.',
    highlights: [
      'Diagnóstico com OCT do nervo ótico e campimetria computorizada',
      'Monitorização da pressão intraocular',
      'Tratamento médico com colírios hipotensores',
      'Trabeculoplastia seletiva a LASER (SLT)',
      'Iridotomia a YAG LASER para glaucoma de ângulo fechado',
    ],
  },
  consulta_imuno: {
    icon: 'science',
    category: 'Consultas',
    title: 'Imunopatologia Ocular',
    desc: 'A consulta de Imunopatologia avalia e trata a patologia inflamatória ocular, nomeadamente uveítes, episclerites e esclerites. São condições complexas que podem associar-se a doenças sistémicas e requerem abordagem multidisciplinar.',
    highlights: [
      'Avaliação e tratamento de uveítes anteriores, intermédias e posteriores',
      'Estudo etiológico de inflamação ocular infecciosa e não infecciosa',
      'Diagnóstico de episclerites e esclerites',
      'Abordagem multidisciplinar com reumatologia e medicina interna',
      'Monitorização de complicações e tratamento imunossupressor',
    ],
  },
  consulta_lentes: {
    icon: 'contact_page',
    category: 'Consultas',
    title: 'Lentes de Contacto',
    desc: 'As lentes de contacto corrigem os principais defeitos refrativos (miopia, hipermetropia, astigmatismo e presbiopia) como alternativa aos óculos. São também úteis no tratamento de ceratocone e anisometropia, existindo vários tipos adaptados a cada caso.',
    highlights: [
      'Adaptação de lentes moles e rígidas gás-permeáveis',
      'Lentes esclerais para ceratocone e córneas irregulares',
      'Lentes coloridas e cosméticas para cicatrizes corneanas',
      'Ortocheratologia (lentes noturnas para controlo de miopia)',
      'Seguimento e cuidados de higiene com lentes de contacto',
    ],
  },
  consulta_olhoseco: {
    icon: 'water_drop',
    category: 'Consultas',
    title: 'Olho Seco',
    desc: 'O olho seco afeta uma grande parte da população quando a produção ou qualidade da lágrima é insuficiente para manter a superfície ocular saudável. O diagnóstico inclui avaliação avançada do filme lacrimal e das glândulas de Meibómios.',
    highlights: [
      'Avaliação do filme lacrimal e glândulas de Meibómios',
      'Teste de Schirmer para quantificação da produção lacrimal',
      'Plugs lacrimais para preservar a lágrima na superfície ocular',
      'Tratamento com lágrimas artificiais e anti-inflamatórios tópicos',
      'Suplementação de Ómega-3 e higiene palpebral',
    ],
  },
  consulta_refrativa: {
    icon: 'adjust',
    category: 'Consultas',
    title: 'Consulta de Refrativa',
    desc: 'A consulta de refrativa avalia a candidatura para cirurgia refrativa, que corrige miopia, hipermetropia e astigmatismo, reduzindo a dependência de óculos ou lentes de contacto. É realizada uma avaliação detalhada da córnea, refração e saúde ocular.',
    highlights: [
      'Avaliação de candidatura para LASIK, PRK ou LIO Fáquica',
      'Topografia corneana e paquimetria para avaliação da espessura corneana',
      'Estudo refrativo completo e cálculo do erro refrativo',
      'Discussão de riscos, benefícios e expectativas realistas',
      'Indicação personalizada conforme o perfil do doente',
    ],
  },
  consulta_retina: {
    icon: 'hub',
    category: 'Consultas',
    title: 'Vítreo e Retina',
    desc: 'Na Consulta de Vítreo e Retina avaliam-se doenças do segmento posterior do olho, incluindo Degenerescência Macular da Idade, membranas epirretinianas, buraco macular, descolamentos de retina e maculopatias iatrogénicas.',
    highlights: [
      'Diagnóstico e tratamento da Degenerescência Macular da Idade (DMI)',
      'Avaliação de membranas epirretinianas e buraco macular',
      'Rastreio de descolamentos e degenerescências periféricas da retina',
      'Injeções intravítreas de anti-VEGF para neovascularização',
      'Monitorização de maculopatias associadas a medicamentos',
    ],
  },
  // ── CIRURGIAS / TRATAMENTOS ────────────────────────────────────
  cirurgia_refrativa: {
    icon: 'biotech',
    category: 'Cirurgias',
    title: 'Cirurgia Refrativa (LASIK Femtosegundo)',
    desc: 'O LASIK com LASER Femtosegundo cria flaps corneanos mais finos, precisos e seguros para corrigir miopia, hipermetropia e astigmatismo. O PRK e a Lente Intraocular Fáquica são alternativas para candidatos específicos.',
    highlights: [
      'LASIK com LASER Femtosegundo (flap mais fino e seguro)',
      'PRK / ablação de superfície para córneas finas',
      'Lente Intraocular Fáquica para altos graus refrativos',
      'Retorno ao trabalho em 1–2 dias; sem dor significativa',
      'Avaliação obrigatória de candidatura prévia à cirurgia',
    ],
  },
  blefaroplastia: {
    icon: 'healing',
    category: 'Cirurgias',
    title: 'Blefaroplastia',
    desc: 'A blefaroplastia remove cirurgicamente o excesso de pele (dermatocalásia), frouxidão muscular e bolsas de gordura das pálpebras superiores e/ou inferiores. Realizada sob anestesia local, sem necessidade de internamento, com recuperação rápida.',
    highlights: [
      'Blefaroplastia superior e inferior para excesso de pele e bolsas',
      'Incisões nas pregas naturais das pálpebras (cicatrizes discretas)',
      'Anestesia local; procedimento em ambulatório sem internamento',
      'Melhoria funcional do campo visual e rejuvenescimento do olhar',
      'Resultados estéticos expressivos e duradouros',
    ],
  },
  catarata_cirurgia: {
    icon: 'surgical',
    category: 'Cirurgias',
    title: 'Cirurgia de Catarata',
    desc: 'A cirurgia de catarata por facoemulsificação utiliza ultra-sons para fragmentar e aspirar a catarata através de uma incisão de 2,2–2,7 mm, seguida da colocação de lente intraocular. Realizada sob anestesia local, em ambulatório, com recuperação visual rápida.',
    highlights: [
      'Facoemulsificação microincisional (2,2–2,7 mm)',
      'Anestesia local (colírio ou bloqueio); sem internamento',
      'Lentes monofocais, bifocais e trifocais disponíveis',
      'Recuperação visual em 2–3 dias após a cirurgia',
      'Único tratamento eficaz — não existem alternativas médicas',
    ],
  },
  dacrio: {
    icon: 'water',
    category: 'Cirurgias',
    title: 'Dacriocistorrinostomia (DCR)',
    desc: 'A Dacriocistorrinostomia (DCR) desbloqueia o canal nasolacrimal para reduzir o lacrimejo excessivo (epífora) e as infeções recorrentes do saco lacrimal (dacriocistites). A cirurgia cria uma nova comunicação entre o saco lacrimal e as fossas nasais.',
    highlights: [
      'Desobstrução do canal nasolacrimal para tratar epífora crónica',
      'Prevenção de dacriocistites (infeções do saco lacrimal)',
      'Abordagem externa (cutânea) ou interna (endoscópica nasal)',
      'Taxa de sucesso aproximada de 85%',
      'Sonda de silicone temporária (1–3 meses) para manter o canal aberto',
    ],
  },
  estrabismo: {
    icon: 'child_care',
    category: 'Cirurgias',
    title: 'Cirurgia de Estrabismo',
    desc: 'A cirurgia de estrabismo reposiciona os músculos extraoculares para colocar os olhos de forma paralela e recuperar a visão binocular. Realizada sob anestesia geral, é indicada quando o tratamento conservador (óculos, oclusão) é insuficiente.',
    highlights: [
      'Alinhamento dos olhos para recuperação da visão binocular',
      'Manipulação dos músculos extraoculares (retrocesso/resseção)',
      'Realizada sob anestesia geral',
      'Intervenção precoce melhora o prognóstico na criança',
      'Correção estética possível em qualquer idade',
    ],
  },
  kc: {
    icon: 'blur_circular',
    category: 'Tratamentos',
    title: 'Ceratocone (KC)',
    desc: 'O ceratocone é uma doença ectásica que causa adelgaçamento e protrusão progressiva da córnea. O tratamento cirúrgico visa melhorar a visão e estabilizar a progressão, através de crosslinking, segmentos de anel intra-corneanos, ablação de superfície personalizada ou LIO Fáquica.',
    highlights: [
      'Crosslinking (CXL) para estabilização da progressão do ceratocone',
      'Segmentos de anel intra-corneanos com LASER Femtosegundo',
      'Ablação de superfície personalizada para melhoria da acuidade visual',
      'Lente Intraocular (LIO) Fáquica para casos selecionados',
      'Transplante de córnea nos casos avançados sem alternativa',
    ],
  },
  injecoes: {
    icon: 'medical_services',
    category: 'Tratamentos',
    title: 'Injeções Intravítreas',
    desc: 'As injeções intravítreas de medicamentos anti-VEGF (Avastin®, Lucentis®, Eylea®) revolucionaram o tratamento das doenças da retina, bloqueando a neovascularização e o edema macular. São também utilizados corticosteróides para inflamação persistente.',
    highlights: [
      'Anti-VEGF (Bevacizumab, Ranibizumab, Aflibercept) para neovascularização',
      'Tratamento da Degenerescência Macular Exsudativa (DMI húmida)',
      'Tratamento do edema macular diabético e por oclusão venosa',
      'Corticosteróides intravítreos para inflamação refratária',
      'Procedimento rápido, realizado em sala estéril sob anestesia tópica',
    ],
  },
  vitrectomia: {
    icon: 'lens_blur',
    category: 'Cirurgias',
    title: 'Vitrectomia Pars Plana',
    desc: 'A vitrectomia pars plana remove o vítreo para tratar doenças vítreo-retinianas como descolamento de retina, membrana epirretiniana, buraco macular, hemovítreo e complicações de retinopatia diabética. A cavidade é preenchida com ar, gás ou silicone.',
    highlights: [
      'Tratamento de descolamento de retina e membrana epirretiniana',
      'Cirurgia de buraco macular e hemovítreo',
      'Complicações avançadas de retinopatia diabética',
      'Remoção de corpo estranho intra-ocular',
      'Retinopexia pneumática para casos selecionados de descolamento',
    ],
  },
  crosslinking: {
    icon: 'science',
    category: 'Tratamentos',
    title: 'Crosslinking Córneo (CXL)',
    desc: 'O Crosslinking é uma técnica minimamente invasiva que aumenta a rigidez corneana através da combinação de riboflavina (vitamina B2) com radiação ultravioleta tipo A, estabilizando a biomecânica da córnea e reduzindo a progressão de doenças ectásicas.',
    highlights: [
      'Indicado para ceratocone, degeneração marginal pelúcida e ectasia pós-LASIK',
      'Protocolo de Dresden: desbridamento epitelial + riboflavina + UV-A 30 min',
      'Aumenta a rigidez e estabiliza a biomecânica corneana',
      'Pode melhorar a acuidade visual como efeito secundário benéfico',
      'Alto índice de segurança com complicações pouco frequentes',
    ],
  },
  glaucoma_cirurgia: {
    icon: 'ophthalmology',
    category: 'Tratamentos',
    title: 'Tratamento Cirúrgico do Glaucoma',
    desc: 'A cirurgia do glaucoma visa reduzir a pressão intraocular quando o tratamento médico (colírios) é insuficiente. A trabeculectomia é a cirurgia filtrante mais frequente, criando uma fístula para drenagem do humor aquoso. Em casos especiais, podem ser implantadas válvulas de filtração.',
    highlights: [
      'Trabeculectomia: cirurgia filtrante convencional do glaucoma',
      'Criação de canal de drenagem do humor aquoso',
      'Implante de válvula de filtração em casos especiais',
      'Indicada quando colírios e laser são insuficientes',
      'Redução sustentada da pressão intraocular para preservar o nervo ótico',
    ],
  },
};

function initServiceModal() {
  const overlay  = document.getElementById('serviceModal');
  const closeBtn = overlay?.querySelector('.modal__close');
  const cards    = document.querySelectorAll('.service-card[data-service]');

  if (!overlay) return;

  cards.forEach(card => {
    card.addEventListener('click', () => {
      const key  = card.dataset.service;
      const data = SERVICES_DATA[key];
      if (!data) return;
      populateModal(data);
      overlay.classList.add('open');
      document.body.style.overflow = 'hidden';
    });
  });

  /* Close on button, overlay click, or Escape */
  closeBtn?.addEventListener('click', closeModal);
  overlay.addEventListener('click', e => { if (e.target === overlay) closeModal(); });
  document.addEventListener('keydown', e => { if (e.key === 'Escape') closeModal(); });

  function closeModal() {
    overlay.classList.remove('open');
    document.body.style.overflow = '';
  }
}

function populateModal(data) {
  const overlay = document.getElementById('serviceModal');
  overlay.querySelector('.modal__icon .material-symbols-outlined').textContent = data.icon;
  overlay.querySelector('.modal__category').textContent = data.category;
  overlay.querySelector('.modal__title').textContent    = data.title;
  overlay.querySelector('.modal__desc').textContent     = data.desc;

  const list = overlay.querySelector('.modal__list');
  list.innerHTML = data.highlights
    .map(h => `<li><span class="material-symbols-outlined">check_circle</span>${h}</li>`)
    .join('');
}

/* ============================================================
   COUNTERS (animate when visible)
   ============================================================ */
function initCounters() {
  const counters = document.querySelectorAll('[data-counter]');
  if (!counters.length) return;

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

  counters.forEach(el => observer.observe(el));
}

function animateCounter(el) {
  const target   = parseInt(el.dataset.counter, 10);
  const suffix   = el.dataset.suffix ?? '';
  const duration = 1800;
  const start    = performance.now();

  const tick = (now) => {
    const progress = Math.min((now - start) / duration, 1);
    const ease     = 1 - Math.pow(1 - progress, 3); /* ease-out cubic */
    el.textContent = Math.floor(ease * target) + suffix;
    if (progress < 1) requestAnimationFrame(tick);
  };

  requestAnimationFrame(tick);
}

/* ============================================================
   TESTIMONIALS CAROUSEL
   ============================================================ */
function initTestimonialsCarousel() {
  const track       = document.getElementById('testimonialsTrack');
  const dotsWrap    = document.getElementById('testimonialsDots');
  const prevBtn     = document.getElementById('testimonialsPrev');
  const nextBtn     = document.getElementById('testimonialsNext');

  if (!track) return;

  const cards    = Array.from(track.querySelectorAll('.testimonial-card'));
  const total    = cards.length;
  let currentPage = 0;
  let autoTimer   = null;

  function getIPV() {
    if (window.innerWidth < 640)  return 1;
    if (window.innerWidth < 1024) return 2;
    return 3;
  }

  function totalPages() { return Math.ceil(total / getIPV()); }

  function setCardWidths() {
    const ipv = getIPV();
    const gap = 24; /* 1.5rem */
    const containerW = track.parentElement.offsetWidth;
    const cardW = (containerW - gap * (ipv - 1)) / ipv;
    cards.forEach(c => {
      c.style.flexBasis = cardW + 'px';
      c.style.minWidth  = cardW + 'px';
    });
  }

  function buildDots() {
    const pages = totalPages();
    dotsWrap.innerHTML = '';
    for (let i = 0; i < pages; i++) {
      const dot = document.createElement('button');
      dot.className = 'carousel-dot' + (i === currentPage ? ' active' : '');
      dot.setAttribute('aria-label', `Ir para página ${i + 1}`);
      dot.setAttribute('role', 'tab');
      dot.addEventListener('click', () => goTo(i));
      dotsWrap.appendChild(dot);
    }
  }

  function updateDots() {
    dotsWrap.querySelectorAll('.carousel-dot').forEach((d, i) => {
      d.classList.toggle('active', i === currentPage);
    });
  }

  function goTo(page) {
    const pages = totalPages();
    currentPage = ((page % pages) + pages) % pages;
    const ipv = getIPV();
    const gap = 24;
    const containerW = track.parentElement.offsetWidth;
    const cardW = (containerW - gap * (ipv - 1)) / ipv;
    const offset = currentPage * ipv * (cardW + gap);
    track.style.transform = `translateX(-${offset}px)`;
    updateDots();
  }

  function startAuto() {
    stopAuto();
    autoTimer = setInterval(() => goTo(currentPage + 1), 5000);
  }

  function stopAuto() {
    if (autoTimer) { clearInterval(autoTimer); autoTimer = null; }
  }

  prevBtn?.addEventListener('click', () => { goTo(currentPage - 1); startAuto(); });
  nextBtn?.addEventListener('click', () => { goTo(currentPage + 1); startAuto(); });

  track.parentElement.addEventListener('mouseenter', stopAuto);
  track.parentElement.addEventListener('mouseleave', startAuto);

  /* Touch swipe */
  let touchStartX = 0;
  track.addEventListener('touchstart', e => { touchStartX = e.touches[0].clientX; }, { passive: true });
  track.addEventListener('touchend', e => {
    const diff = touchStartX - e.changedTouches[0].clientX;
    if (Math.abs(diff) > 50) goTo(diff > 0 ? currentPage + 1 : currentPage - 1);
  });

  /* Resize */
  let resizeTimer;
  window.addEventListener('resize', () => {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(() => {
      setCardWidths();
      currentPage = 0;
      track.style.transition = 'none';
      track.style.transform = 'translateX(0)';
      setTimeout(() => { track.style.transition = ''; }, 50);
      buildDots();
    }, 150);
  });

  setCardWidths();
  buildDots();
  startAuto();
}

/* ============================================================
   CLINIC IMAGE CAROUSEL (Sobre Nós)
   ============================================================ */
function initClinicCarousel() {
  const slides   = document.querySelectorAll('.sobre__slide');
  const dots     = document.querySelectorAll('.sobre__dot');
  if (!slides.length) return;

  let current   = 0;
  let autoTimer = null;

  function goTo(index) {
    slides[current].classList.remove('active');
    dots[current].classList.remove('active');
    current = (index + slides.length) % slides.length;
    slides[current].classList.add('active');
    dots[current].classList.add('active');
  }

  function startAuto() {
    stopAuto();
    autoTimer = setInterval(() => goTo(current + 1), 4500);
  }

  function stopAuto() {
    if (autoTimer) { clearInterval(autoTimer); autoTimer = null; }
  }

  dots.forEach(dot => {
    dot.addEventListener('click', () => {
      goTo(parseInt(dot.dataset.slide, 10));
      startAuto();
    });
  });

  const wrap = document.querySelector('.sobre__carousel');
  wrap?.addEventListener('mouseenter', stopAuto);
  wrap?.addEventListener('mouseleave', startAuto);

  startAuto();
}

/* ============================================================
   COOKIE BANNER
   ============================================================ */
function initCookieBanner() {
  const banner  = document.getElementById('cookieBanner');
  const accept  = document.getElementById('cookieAccept');
  const decline = document.getElementById('cookieDecline');
  if (!banner) return;

  /* Show if not yet decided */
  if (!localStorage.getItem('cookieConsent')) {
    setTimeout(() => banner.classList.add('show'), 1200);
  }

  accept?.addEventListener('click', () => {
    localStorage.setItem('cookieConsent', 'accepted');
    banner.classList.remove('show');
    /* Fire pixel / analytics here if needed */
  });

  decline?.addEventListener('click', () => {
    localStorage.setItem('cookieConsent', 'declined');
    banner.classList.remove('show');
  });
}

/* ============================================================
   FORM SUBMIT (demo)
   ============================================================ */
function initFormSubmit() {
  const form = document.querySelector('.contact__form form');
  if (!form) return;

  form.addEventListener('submit', e => {
    e.preventDefault();

    const btn      = form.querySelector('.form__submit');
    const original = btn.innerHTML;

    btn.innerHTML  = '<span class="material-symbols-outlined" style="font-variation-settings:\'FILL\' 1">check_circle</span>Mensagem enviada!';
    btn.disabled   = true;
    btn.style.background = 'linear-gradient(135deg, #1a6b3a, #22a85c)';

    setTimeout(() => {
      btn.innerHTML  = original;
      btn.disabled   = false;
      btn.style.background = '';
      form.reset();
    }, 3500);
  });
}
