const RDS = window.EPCMDesignSystem_e7f830;
const { Button: RB, Icon: RI, Eyebrow: REye, SectionHeading: RSH, ServiceCard: RSC, FeatureItem: RFe, Testimonial: RT, Field: RFi } = RDS;

function tt(node, lang) { return window.EPCM_T(node, lang); }

/* ---------- shared shells ---------- */
function Shell({ children, grid, light, style }) {
  return (
    <section style={{ background: light ? 'var(--steel-mist)' : 'transparent', position: 'relative', ...style }}>
      {grid && <div aria-hidden className="epcm-grid-bg" style={{ position: 'absolute', inset: 0, opacity: 0.55, pointerEvents: 'none', maskImage: 'linear-gradient(180deg,#000,transparent)' }} />}
      <div style={{ maxWidth: 'var(--container)', margin: '0 auto', padding: 'var(--section-y) var(--gutter)', position: 'relative' }}>{children}</div>
    </section>
  );
}

function Breadcrumb({ page, lang, onNavigate }) {
  const P = window.EPCM_PAGES;
  const crumbs = [{ label: window.EPCM_SHARED.ui.home, id: 'home' }];
  if (page.parent && P[page.parent]) crumbs.push({ label: P[page.parent].nav, id: page.parent });
  crumbs.push({ label: page.nav, id: null });
  return (
    <nav style={{ display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 8, fontSize: '0.82rem', color: 'var(--text-muted)' }}>
      {crumbs.map((c, i) => (
        <span key={i} style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>
          {i > 0 && <RI name="chevron-right" size={13} color="var(--text-muted)" />}
          {c.id ? <button onClick={() => onNavigate(c.id)} style={{ background: 'none', border: 'none', cursor: 'pointer', font: 'inherit', color: 'var(--text-muted)', padding: 0 }} onMouseOver={(e) => (e.currentTarget.style.color = 'var(--accent)')} onMouseOut={(e) => (e.currentTarget.style.color = 'var(--text-muted)')}>{tt(c.label, lang)}</button>
            : <span style={{ color: 'var(--text-secondary)' }}>{tt(c.label, lang)}</span>}
        </span>
      ))}
    </nav>
  );
}

function PageHero({ page, lang, onNavigate, onBook }) {
  const heroImg = ({ heating: 'banner-coil', furnace: 'banner-coil', boiler: 'banner-coil', cooling: 'banner-wallunit', 'wall-ac': 'banner-wallunit', 'central-ac': 'banner-ducts', 'heat-pump': 'banner-heatpump', 'central-heat-pump': 'banner-heatpump', 'wall-heat-pump': 'banner-wallunit', 'mini-split': 'banner-wallunit', 'air-duct-cleaning': 'banner-ducts', brands: 'banner-heatpump' })[page.id];
  return (
    <section style={{ position: 'relative', overflow: 'hidden', background: 'var(--gradient-hero)', borderBottom: '1px solid var(--border)' }}>
      {heroImg && <img src={'/assets/photos/' + heroImg + '.png'} alt="" aria-hidden style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover', display: 'block', opacity: 0.32, maskImage: 'linear-gradient(90deg, transparent 0%, #000 55%)', WebkitMaskImage: 'linear-gradient(90deg, transparent 0%, #000 55%)' }} />}
      <div aria-hidden className="epcm-grid-bg" style={{ position: 'absolute', inset: 0, opacity: 0.6, maskImage: 'radial-gradient(120% 100% at 60% 0%, #000 30%, transparent 75%)' }} />
      <div style={{ maxWidth: 'var(--container)', margin: '0 auto', padding: 'clamp(2.5rem,5vw,3.5rem) var(--gutter) clamp(2.5rem,5vw,4rem)', position: 'relative' }}>
        <Breadcrumb page={page} lang={lang} onNavigate={onNavigate} />
        <div style={{ marginTop: 22 }}><REye>{tt(page.nav, lang)}</REye></div>
        <h1 style={{ marginTop: 18, fontSize: 'var(--text-h1)', fontWeight: 500, letterSpacing: '-0.03em', lineHeight: 1.05, maxWidth: '20ch', textWrap: 'balance' }}>{tt(page.h1, lang)}</h1>
        <p style={{ marginTop: 20, fontSize: 'var(--text-body-lg)', color: 'var(--text-secondary)', lineHeight: 1.6, maxWidth: '58ch' }}>{tt(page.intro, lang)}</p>
        <div style={{ display: 'flex', gap: 14, marginTop: 30, flexWrap: 'wrap' }}>
          <RB variant="primary" size="lg" uppercase iconRight="arrow-right" onClick={onBook}>{tt(window.EPCM_SHARED.ui.bookAppt, lang)}</RB>
          <RB variant="outline" size="lg" iconLeft="phone" href={window.EPCM_SHARED.contact.phoneHref}>{window.EPCM_SHARED.contact.phone}</RB>
        </div>
      </div>
    </section>
  );
}

function EmergencyBand({ page, lang }) {
  const c = window.EPCM_SHARED.contact;
  return (
    <Shell>
      <div style={{ display: 'grid', gridTemplateColumns: '1.4fr 1fr', gap: 'clamp(1.5rem,4vw,3rem)', alignItems: 'center', background: 'var(--surface-1)', border: '1px solid var(--border-accent)', borderRadius: 'var(--radius-xl)', padding: 'clamp(1.75rem,4vw,2.5rem)', boxShadow: 'var(--glow-accent)' }} className="epcm-2col">
      <div>
        <REye>{lang === 'fr' ? 'Service d’urgence' : 'Emergency Service'}</REye>
        <p style={{ marginTop: 14, fontSize: '1.08rem', color: 'var(--text-secondary)', lineHeight: 1.6, maxWidth: '52ch' }}>{tt(page.emergency.note, lang)}</p>
      </div>
      <a href={c.emergencyHref} style={{ display: 'block', textAlign: 'center', background: 'var(--obsidian-900)', border: '1px solid var(--border-strong)', borderRadius: 'var(--radius-lg)', padding: '22px' }}>
        <div style={{ fontSize: '0.78rem', textTransform: 'uppercase', letterSpacing: '0.14em', color: 'var(--text-muted)' }}>{lang === 'fr' ? 'Ligne d’urgence plomberie' : 'Emergency Plumbing Hotline'}</div>
        <div style={{ fontSize: '1.9rem', fontWeight: 600, color: 'var(--accent)', marginTop: 8, letterSpacing: '-0.02em' }}>{c.emergencyPhone}</div>
        <div style={{ fontSize: '0.85rem', color: 'var(--text-muted)', marginTop: 6 }}>{lang === 'fr' ? 'Répartition immédiate' : 'Immediate dispatch available'}</div>
      </a>
      </div>
    </Shell>
  );
}

function BreakdownCards({ data, lang }) {
  return (
    <Shell>
      <RSH align="center" eyebrow={tt(data.heading, lang)} title={tt(data.heading, lang)} intro={tt(data.sub, lang)} />
      <div style={{ display: 'grid', gridTemplateColumns: `repeat(${Math.min(3, data.items.length)}, 1fr)`, gap: 20, marginTop: 'var(--space-12)' }} className="epcm-grid-3">
        {data.items.map((it, i) => (
          <div key={i} style={{ display: 'flex', flexDirection: 'column', background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 'var(--space-6)', boxShadow: 'var(--inner-hairline)', backgroundImage: 'var(--gradient-card)' }}>
            <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 18 }}>
              <span style={{ display: 'inline-flex', width: 50, height: 50, borderRadius: 'var(--radius-md)', background: 'var(--accent-soft)', border: '1px solid var(--accent-line)', alignItems: 'center', justifyContent: 'center' }}><RI name={it.icon} size={23} color="var(--arctic-blue)" /></span>
              <span style={{ fontSize: '0.72rem', textTransform: 'uppercase', letterSpacing: '0.12em', color: 'var(--accent)', border: '1px solid var(--accent-line)', borderRadius: 'var(--radius-pill)', padding: '4px 10px' }}>{tt(it.badge, lang)}</span>
            </div>
            <h3 style={{ fontSize: 'var(--text-h4)', fontWeight: 500, letterSpacing: '-0.01em' }}>{tt(it.title, lang)}</h3>
            <p style={{ marginTop: 10, color: 'var(--text-secondary)', fontSize: '0.96rem', lineHeight: 1.6 }}>{tt(it.desc, lang)}</p>
            <ul style={{ listStyle: 'none', padding: 0, margin: '18px 0 0', display: 'grid', gap: 9 }}>
              {it.bullets.map((bl, j) => (
                <li key={j} style={{ display: 'flex', gap: 10, alignItems: 'flex-start', fontSize: '0.9rem', color: 'var(--text-secondary)' }}>
                  <RI name="check" size={16} color="var(--accent)" strokeWidth={2.4} style={{ marginTop: 2 }} />{tt(bl, lang)}
                </li>
              ))}
            </ul>
          </div>
        ))}
      </div>
    </Shell>
  );
}

function SubservicesGrid({ ids, lang, onNavigate }) {
  const P = window.EPCM_PAGES;
  const items = ids.map((id) => P[id]).filter(Boolean);
  return (
    <Shell grid>
      <RSH eyebrow={lang === 'fr' ? 'Explorer' : 'Explore'} title={lang === 'fr' ? 'Nos services spécialisés' : 'Our specialized services'} intro={lang === 'fr' ? 'Choisissez le service qui correspond à votre besoin.' : 'Choose the service that matches what you need.'} />
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 18, marginTop: 'var(--space-10)' }} className="epcm-grid-4">
        {items.map((c) => (
          <RSC key={c.id} icon={(c.options && c.options.items[0] && c.options.items[0].icon) || (c.breakdown && c.breakdown.items[0].icon) || 'wrench'} title={tt(c.nav, lang)} description={tt(c.intro, lang)} cta={tt(window.EPCM_SHARED.ui.learnMore, lang)} href="#" onClick={(e) => { e.preventDefault(); onNavigate(c.id); }} />
        ))}
      </div>
    </Shell>
  );
}

function OptionsCards({ data, lang }) {
  return (
    <Shell grid>
      <RSH eyebrow={lang === 'fr' ? 'Options' : 'Options'} title={tt(data.heading, lang)} intro={tt(data.sub, lang)} />
      <div style={{ display: 'grid', gridTemplateColumns: `repeat(${Math.min(3, data.items.length)}, 1fr)`, gap: 20, marginTop: 'var(--space-10)' }} className="epcm-grid-3">
        {data.items.map((it, i) => (
          <div key={i} style={{ background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 'var(--space-6)', boxShadow: 'var(--inner-hairline)' }}>
            <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 14 }}>
              <span style={{ display: 'inline-flex', width: 46, height: 46, borderRadius: 'var(--radius-md)', background: 'var(--accent-soft)', border: '1px solid var(--accent-line)', alignItems: 'center', justifyContent: 'center' }}><RI name={it.icon} size={22} color="var(--arctic-blue)" /></span>
              <span style={{ fontSize: '0.72rem', textTransform: 'uppercase', letterSpacing: '0.1em', color: 'var(--text-secondary)' }}>{tt(it.badge, lang)}</span>
            </div>
            <h3 style={{ fontSize: 'var(--text-h5)', fontWeight: 500 }}>{tt(it.title, lang)}</h3>
            <p style={{ marginTop: 8, color: 'var(--text-secondary)', fontSize: '0.94rem', lineHeight: 1.6 }}>{tt(it.desc, lang)}</p>
            {it.bullets && <ul style={{ listStyle: 'none', padding: 0, margin: '16px 0 0', display: 'grid', gap: 8 }}>{it.bullets.map((bl, j) => <li key={j} style={{ display: 'flex', gap: 9, fontSize: '0.88rem', color: 'var(--text-secondary)' }}><RI name="check" size={15} color="var(--accent)" strokeWidth={2.4} style={{ marginTop: 2 }} />{tt(bl, lang)}</li>)}</ul>}
          </div>
        ))}
      </div>
    </Shell>
  );
}

function PricingPlans({ plans, lang, onBook }) {
  return (
    <Shell grid>
      <RSH align="center" eyebrow={lang === 'fr' ? 'Forfaits' : 'Plans'} title={lang === 'fr' ? 'Choisissez votre forfait d’entretien' : 'Choose your maintenance plan'} intro={lang === 'fr' ? 'Des forfaits clairs et abordables pour protéger vos systèmes toute l’année.' : 'Clear, affordable plans that protect your systems year-round.'} />
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 20, marginTop: 'var(--space-12)', alignItems: 'start' }} className="epcm-grid-3">
        {plans.map((p, i) => (
          <div key={i} style={{ position: 'relative', display: 'flex', flexDirection: 'column', background: 'var(--surface-1)', border: '1px solid ' + (p.featured ? 'var(--border-accent)' : 'var(--border)'), borderRadius: 'var(--radius-lg)', padding: '34px var(--space-6) var(--space-6)', boxShadow: p.featured ? 'var(--glow-accent)' : 'var(--inner-hairline)', backgroundImage: p.featured ? 'var(--gradient-card)' : undefined }}>
            {p.featured && <span style={{ position: 'absolute', top: -12, left: '50%', transform: 'translateX(-50%)', background: 'var(--accent)', color: 'var(--on-accent)', fontSize: '0.72rem', fontWeight: 600, letterSpacing: '0.08em', textTransform: 'uppercase', padding: '5px 14px', borderRadius: 'var(--radius-pill)' }}>{lang === 'fr' ? 'Le plus populaire' : 'Most Popular'}</span>}
            <div style={{ fontSize: '0.8rem', textTransform: 'uppercase', letterSpacing: '0.12em', color: 'var(--accent)' }}>{tt(p.name, lang)}</div>
            <div style={{ display: 'flex', alignItems: 'baseline', gap: 6, marginTop: 12 }}><span style={{ fontSize: '3rem', fontWeight: 500, letterSpacing: '-0.03em', color: 'var(--text)' }}>{p.price}</span><span style={{ color: 'var(--text-muted)', fontSize: '1rem' }}>{tt(p.period, lang)}</span></div>
            <div style={{ marginTop: 6, fontSize: '0.95rem', fontWeight: 500, color: 'var(--text-secondary)' }}>{tt(p.visits, lang)}</div>
            <p style={{ marginTop: 12, color: 'var(--text-secondary)', fontSize: '0.92rem', lineHeight: 1.55 }}>{tt(p.desc, lang)}</p>
            <ul style={{ listStyle: 'none', padding: 0, margin: '18px 0 0', display: 'grid', gap: 10, flex: 1 }}>{p.features.map((f, j) => <li key={j} style={{ display: 'flex', gap: 10, alignItems: 'flex-start', fontSize: '0.9rem', color: 'var(--text-secondary)' }}><RI name="check" size={16} color="var(--accent)" strokeWidth={2.4} style={{ marginTop: 2 }} />{tt(f, lang)}</li>)}</ul>
            <div style={{ marginTop: 24 }}><RB variant={p.featured ? 'primary' : 'secondary'} full uppercase iconRight="arrow-right" onClick={onBook}>{lang === 'fr' ? 'Choisir ce forfait' : 'Choose plan'}</RB></div>
          </div>
        ))}
      </div>
      <p style={{ textAlign: 'center', marginTop: 22, fontSize: '0.88rem', color: 'var(--text-muted)' }}>{lang === 'fr' ? 'Besoin d’un forfait sur mesure pour plusieurs systèmes ou bâtiments? Contactez-nous.' : 'Need a custom plan for multiple systems or properties? Just ask.'}</p>
    </Shell>
  );
}

function WhyChoose({ lang }) {
  const S = window.EPCM_SHARED;
  return (
    <Shell grid>
      <RSH align="center" eyebrow={lang === 'fr' ? 'Pourquoi EPCM' : 'Why EPCM'} title={tt(S.ui.whyChoose, lang)} intro={tt(S.ui.whyChooseSub, lang)} />
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 20, marginTop: 'var(--space-10)' }} className="epcm-grid-3">
        {S.why.map((w, i) => (
          <div key={i} style={{ background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 'var(--space-6)', boxShadow: 'var(--inner-hairline)' }}>
            <span style={{ display: 'inline-flex', width: 46, height: 46, borderRadius: 'var(--radius-md)', background: 'var(--accent-soft)', border: '1px solid var(--accent-line)', alignItems: 'center', justifyContent: 'center', marginBottom: 16 }}><RI name={w.icon} size={22} color="var(--arctic-blue)" /></span>
            <h3 style={{ fontSize: 'var(--text-h5)', fontWeight: 500 }}>{tt(w.title, lang)}</h3>
            <p style={{ marginTop: 8, color: 'var(--text-secondary)', fontSize: '0.94rem', lineHeight: 1.6 }}>{tt(w.desc, lang)}</p>
          </div>
        ))}
      </div>
    </Shell>
  );
}

function AreasBand({ lang, onBook }) {
  const S = window.EPCM_SHARED;
  const areas = lang === 'fr' ? S.areasFr : S.areas;
  const areaSlugs = S.areaSlugs || [];
  return (
    <Shell>
      <div style={{ position: 'relative', overflow: 'hidden', background: 'var(--gradient-environment)', border: '1px solid var(--border-strong)', borderRadius: 'var(--radius-xl)', padding: 'clamp(2rem,5vw,3.5rem)' }}>
        <div aria-hidden className="epcm-grid-bg" style={{ position: 'absolute', inset: 0, opacity: 0.5 }} />
        <div style={{ position: 'relative', display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 'clamp(2rem,5vw,4rem)', alignItems: 'center' }} className="epcm-2col">
          <div>
            <REye>{tt(S.ui.areasTitle, lang)}</REye>
            <p style={{ marginTop: 16, color: 'var(--text-secondary)', fontSize: '1.05rem', lineHeight: 1.6 }}>{tt(S.ui.areasSub, lang)}</p>
            <div style={{ marginTop: 24 }}><RB variant="primary" iconRight="map-pin" onClick={onBook}>{lang === 'fr' ? 'Obtenir un service' : 'Get service'}</RB></div>
          </div>
          <div style={{ display: 'flex', flexWrap: 'wrap', gap: 10 }}>
            {areas.map((a, i) => <a key={a} href={`/chauffage-climatisation-${areaSlugs[i]}/`} style={{ display: 'inline-flex', alignItems: 'center', gap: 8, background: 'rgba(16,16,20,0.5)', border: '1px solid var(--border-strong)', borderRadius: 'var(--radius-pill)', padding: '10px 16px', fontSize: '0.95rem', color: 'var(--text)', textDecoration: 'none', transition: 'border-color .15s, background .15s' }} onMouseEnter={(e) => { e.currentTarget.style.borderColor = 'var(--accent)'; e.currentTarget.style.background = 'rgba(104,134,252,0.12)'; }} onMouseLeave={(e) => { e.currentTarget.style.borderColor = 'var(--border-strong)'; e.currentTarget.style.background = 'rgba(16,16,20,0.5)'; }}><RI name="map-pin" size={14} color="var(--accent)" />{a}</a>)}
          </div>
        </div>
      </div>
    </Shell>
  );
}

function FAQ({ faqs, lang }) {
  const [open, setOpen] = React.useState(0);
  return (
    <Shell>
      <RSH align="center" eyebrow="FAQ" title={tt(window.EPCM_SHARED.ui.faqTitle, lang)} />
      <div style={{ maxWidth: 820, margin: 'var(--space-10) auto 0', display: 'grid', gap: 12 }}>
        {faqs.map((f, i) => (
          <div key={i} style={{ background: 'var(--surface-1)', border: '1px solid ' + (open === i ? 'var(--border-accent)' : 'var(--border)'), borderRadius: 'var(--radius-md)', overflow: 'hidden' }}>
            <button onClick={() => setOpen(open === i ? -1 : i)} style={{ display: 'flex', width: '100%', justifyContent: 'space-between', alignItems: 'center', gap: 16, background: 'none', border: 'none', cursor: 'pointer', font: 'inherit', textAlign: 'left', color: 'var(--text)', fontSize: '1.05rem', fontWeight: 500, padding: '18px 20px' }}>
              {tt(f.q, lang)}
              <RI name={open === i ? 'minus' : 'plus'} size={18} color="var(--accent)" />
            </button>
            {open === i && (
              <div style={{ padding: '0 20px 20px', color: 'var(--text-secondary)', fontSize: '0.98rem', lineHeight: 1.65 }}>
                {tt(f.a, lang)}
                {f.bullets && <ul style={{ margin: '12px 0 0', paddingLeft: 18 }}>{f.bullets.map((bl, j) => <li key={j} style={{ marginBottom: 5 }}>{tt(bl, lang)}</li>)}</ul>}
              </div>
            )}
          </div>
        ))}
      </div>
    </Shell>
  );
}

function Reviews({ items, lang }) {
  return (
    <Shell grid>
      <RSH align="center" eyebrow={lang === 'fr' ? 'Avis' : 'Reviews'} title={tt(window.EPCM_SHARED.ui.reviewsTitle, lang)} />
      <div style={{ display: 'grid', gridTemplateColumns: `repeat(${Math.min(3, items.length)}, 1fr)`, gap: 20, marginTop: 'var(--space-10)' }} className="epcm-grid-3">
        {items.map((t, i) => <RT key={i} quote={tt(t.quote, lang)} name={t.name} role={(tt(t.place, lang) || '') + ' · ' + (tt(t.tag, lang) || '')} rating={5} />)}
      </div>
    </Shell>
  );
}

function RelatedNav({ page, lang, onNavigate }) {
  const P = window.EPCM_PAGES;
  let siblings = [];
  if (page.parent && P[page.parent] && P[page.parent].subservices) siblings = P[page.parent].subservices.filter((id) => id !== page.id);
  if (!siblings.length) return null;
  const items = siblings.map((id) => P[id]).filter(Boolean).slice(0, 4);
  return (
    <Shell>
      <RSH eyebrow={lang === 'fr' ? 'Voir aussi' : 'See also'} title={tt(window.EPCM_SHARED.ui.relatedTitle, lang)} />
      <div style={{ display: 'flex', flexWrap: 'wrap', gap: 12, marginTop: 'var(--space-8)' }}>
        {items.map((c) => <button key={c.id} onClick={() => onNavigate(c.id)} style={{ display: 'inline-flex', alignItems: 'center', gap: 9, background: 'var(--surface-1)', border: '1px solid var(--border-strong)', borderRadius: 'var(--radius-pill)', padding: '11px 18px', cursor: 'pointer', font: 'inherit', color: 'var(--text)', fontSize: '0.95rem' }} onMouseOver={(e) => (e.currentTarget.style.borderColor = 'var(--accent)')} onMouseOut={(e) => (e.currentTarget.style.borderColor = 'var(--border-strong)')}>{tt(c.nav, lang)}<RI name="arrow-right" size={15} color="var(--accent)" /></button>)}
      </div>
    </Shell>
  );
}

function BookingBand({ lang, onBook }) {
  const S = window.EPCM_SHARED;
  return (
    <Shell>
      <div style={{ position: 'relative', overflow: 'hidden', borderRadius: 'var(--radius-xl)', border: '1px solid var(--border-accent)', background: 'var(--surface-1)', padding: 'clamp(2rem,5vw,3.5rem)', boxShadow: 'var(--glow-accent)' }}>
        <div style={{ position: 'absolute', inset: 0, background: 'var(--gradient-hero)', opacity: 0.7, pointerEvents: 'none' }} />
        <div style={{ position: 'relative', display: 'grid', gridTemplateColumns: '1.1fr 0.9fr', gap: 'clamp(2rem,5vw,4rem)', alignItems: 'center' }} className="epcm-2col">
          <div>
            <REye>{tt(S.ui.bookingEyebrow, lang)}</REye>
            <h2 style={{ marginTop: 18, fontSize: 'var(--text-h2)', fontWeight: 500, letterSpacing: '-0.025em', lineHeight: 1.08, textWrap: 'balance' }}>{tt(S.ui.bookingTitle, lang)}</h2>
            <p style={{ marginTop: 18, color: 'var(--text-secondary)', fontSize: '1.06rem', lineHeight: 1.6, maxWidth: '46ch' }}>{tt(S.ui.bookingIntro, lang)}</p>
            <div style={{ marginTop: 28 }}><RB variant="primary" size="lg" uppercase iconRight="arrow-right" onClick={onBook}>{tt(S.ui.requestConsult, lang)}</RB></div>
          </div>
          <div style={{ display: 'grid', gap: 13 }}>{S.promises.map((p, i) => <RFe key={i} variant="plain" icon="check" title={tt(p, lang)} />)}</div>
        </div>
      </div>
    </Shell>
  );
}

/* ---------- bespoke pages ---------- */
function AboutPage({ page, lang, onNavigate, onBook }) {
  return (
    <main>
      <PageHero page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />
      <Shell grid>
        <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 'clamp(2rem,5vw,4rem)', alignItems: 'center' }} className="epcm-2col">
          <div>{page.story.map((p, i) => <p key={i} style={{ color: 'var(--text-secondary)', fontSize: '1.08rem', lineHeight: 1.7, marginTop: i ? 16 : 0 }}>{tt(p, lang)}</p>)}</div>
          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 }}>
            {page.stats.map(([big, small], i) => <div key={i} style={{ background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 24 }}><div style={{ fontSize: '1.7rem', fontWeight: 500, letterSpacing: '-0.02em' }}>{big}</div><div style={{ color: 'var(--text-muted)', fontSize: '0.9rem', marginTop: 4 }}>{tt(small, lang)}</div></div>)}
          </div>
        </div>
      </Shell>
      <Shell>
        <RSH align="center" eyebrow={lang === 'fr' ? 'Nos valeurs' : 'Our Values'} title={lang === 'fr' ? 'Ce qui distingue EPCM' : 'What sets EPCM apart'} />
        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 20, marginTop: 'var(--space-10)' }} className="epcm-grid-3">
          {page.values.map((v, i) => <div key={i} style={{ background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 30, boxShadow: 'var(--inner-hairline)' }}><span style={{ display: 'inline-flex', width: 50, height: 50, borderRadius: 'var(--radius-md)', background: 'var(--accent-soft)', border: '1px solid var(--accent-line)', alignItems: 'center', justifyContent: 'center', marginBottom: 20 }}><RI name={v.icon} size={23} color="var(--arctic-blue)" /></span><h3 style={{ fontSize: 'var(--text-h4)', fontWeight: 500 }}>{tt(v.title, lang)}</h3><p style={{ marginTop: 10, color: 'var(--text-secondary)', lineHeight: 1.6 }}>{tt(v.desc, lang)}</p></div>)}
        </div>
      </Shell>
      <WhyChoose lang={lang} />
      <AreasBand lang={lang} onBook={onBook} />
      {page.faqs && <FAQ faqs={page.faqs} lang={lang} />}
      <BookingBand lang={lang} onBook={onBook} />
    </main>
  );
}

function ContactPage({ page, lang, onNavigate, onBook }) {
  const c = window.EPCM_SHARED.contact;
  const [sent, setSent] = React.useState(false);
  const rows = [['map-pin', lang === 'fr' ? 'Adresse' : 'Visit us', c.address], ['phone', lang === 'fr' ? 'Téléphone' : 'Call us', c.phone], ['mail', lang === 'fr' ? 'Courriel' : 'Email', c.email], ['clock', lang === 'fr' ? 'Heures' : 'Hours', tt(c.hours, lang)]];
  return (
    <main>
      <PageHero page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />
      <Shell>
        <div style={{ display: 'grid', gridTemplateColumns: '0.85fr 1.15fr', gap: 'clamp(2rem,5vw,4rem)' }} className="epcm-2col">
          <div style={{ display: 'grid', gap: 14, alignContent: 'start' }}>
            {rows.map(([ic, k, v]) => <div key={k} style={{ display: 'flex', gap: 16, alignItems: 'flex-start', background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-md)', padding: '18px 20px' }}><span style={{ flex: 'none', display: 'inline-flex', width: 42, height: 42, borderRadius: 'var(--radius-sm)', background: 'var(--accent-soft)', alignItems: 'center', justifyContent: 'center' }}><RI name={ic} size={19} color="var(--arctic-blue)" /></span><div><div style={{ fontSize: '0.76rem', textTransform: 'uppercase', letterSpacing: '0.12em', color: 'var(--text-muted)' }}>{k}</div><div style={{ marginTop: 4, color: 'var(--text)', fontSize: '1rem' }}>{v}</div></div></div>)}
            <div style={{ display: 'inline-flex', alignItems: 'center', gap: 8, fontFamily: 'var(--font-mono)', fontSize: '0.8rem', color: 'var(--text-muted)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)', padding: '10px 14px' }}><RI name="shield-check" size={15} color="var(--accent)" />{c.rbq}</div>
          </div>
          <div style={{ background: 'var(--surface-1)', border: '1px solid var(--border-strong)', borderRadius: 'var(--radius-xl)', padding: 'clamp(1.75rem,3vw,2.25rem)', boxShadow: 'var(--inner-hairline)' }}>
            {sent ? (
              <div style={{ textAlign: 'center', padding: '30px 0' }}><div style={{ display: 'inline-flex', width: 60, height: 60, borderRadius: 999, background: 'rgba(79,178,134,0.16)', border: '1px solid rgba(79,178,134,0.4)', alignItems: 'center', justifyContent: 'center', marginBottom: 18 }}><RI name="check" size={30} color="#7BD3AC" strokeWidth={2.4} /></div><h3 style={{ fontSize: '1.4rem', fontWeight: 500 }}>{lang === 'fr' ? 'Message envoyé' : 'Message sent'}</h3><p style={{ marginTop: 10, color: 'var(--text-secondary)' }}>{lang === 'fr' ? `Nous vous répondrons sous peu. Pour une urgence, appelez le ${c.phone}.` : `We'll be in touch shortly. For urgent service, call ${c.phone}.`}</p></div>
            ) : (
              <form onSubmit={(e) => { e.preventDefault(); setSent(true); }} style={{ display: 'grid', gap: 16 }}>
                <h3 style={{ fontSize: '1.3rem', fontWeight: 500 }}>{lang === 'fr' ? 'Envoyez-nous un message' : 'Send us a message'}</h3>
                <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 }}>
                  <RFi label={lang === 'fr' ? 'Nom complet' : 'Full name'} placeholder="Jane Tremblay" required />
                  <RFi label={lang === 'fr' ? 'Téléphone' : 'Phone'} type="tel" placeholder="(450) 000-0000" />
                </div>
                <RFi label={lang === 'fr' ? 'Courriel' : 'Email'} type="email" placeholder="you@email.com" required />
                <RFi label="Service" type="select" options={lang === 'fr' ? ['Chauffage', 'Climatisation', 'Thermopompe', 'Entretien', 'Autre'] : ['Heating', 'Air Conditioning', 'Heat Pump', 'Maintenance', 'Other']} />
                <RFi label="Message" type="textarea" rows={4} placeholder={lang === 'fr' ? 'Comment pouvons-nous aider?' : 'How can we help?'} />
                <RB variant="primary" size="lg" uppercase full iconRight="arrow-right" as="button" type="submit">{lang === 'fr' ? 'Envoyer' : 'Send message'}</RB>
              </form>
            )}
          </div>
        </div>
      </Shell>
    </main>
  );
}

function BlogPage({ page, lang, onNavigate, onBook }) {
  return (
    <main>
      <PageHero page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />
      <Shell>
        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: 20 }} className="epcm-2col">
          {page.posts.map((p, i) => (
            <a key={i} href="#" onClick={(e) => e.preventDefault()} className="epcm-card-hover" style={{ display: 'block', background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 30, boxShadow: 'var(--inner-hairline)', textDecoration: 'none' }}>
              <span style={{ display: 'inline-flex', fontSize: '0.72rem', textTransform: 'uppercase', letterSpacing: '0.12em', color: 'var(--accent)', border: '1px solid var(--accent-line)', borderRadius: 'var(--radius-pill)', padding: '4px 12px' }}>{tt(p.tag, lang)}</span>
              <h3 style={{ marginTop: 16, fontSize: 'var(--text-h4)', fontWeight: 500, letterSpacing: '-0.01em', color: 'var(--text)' }}>{tt(p.title, lang)}</h3>
              <p style={{ marginTop: 10, color: 'var(--text-secondary)', lineHeight: 1.6 }}>{tt(p.excerpt, lang)}</p>
              <span className="epcm-link-arrow" style={{ display: 'inline-flex', alignItems: 'center', gap: 8, marginTop: 18, fontSize: '0.8125rem', fontWeight: 500, letterSpacing: '0.1em', textTransform: 'uppercase', color: 'var(--text)' }}>{lang === 'fr' ? 'Lire' : 'Read'} <RI name="arrow-right" size={15} color="var(--accent)" /></span>
            </a>
          ))}
        </div>
      </Shell>
      <BookingBand lang={lang} onBook={onBook} />
    </main>
  );
}

function HiringPage({ page, lang, onNavigate, onBook }) {
  return (
    <main>
      <PageHero page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />
      <Shell>
        <div style={{ display: 'grid', gridTemplateColumns: '1.3fr 0.7fr', gap: 'clamp(2rem,5vw,3.5rem)' }} className="epcm-2col">
          <div style={{ display: 'grid', gap: 16 }}>
            {page.roles.map((r, i) => (
              <div key={i} style={{ display: 'flex', justifyContent: 'space-between', gap: 20, flexWrap: 'wrap', background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 26, boxShadow: 'var(--inner-hairline)' }}>
                <div style={{ maxWidth: '46ch' }}>
                  <h3 style={{ fontSize: 'var(--text-h4)', fontWeight: 500 }}>{tt(r.title, lang)}</h3>
                  <div style={{ fontSize: '0.85rem', color: 'var(--accent)', marginTop: 4 }}>{tt(r.type, lang)}</div>
                  <p style={{ marginTop: 10, color: 'var(--text-secondary)', lineHeight: 1.6 }}>{tt(r.desc, lang)}</p>
                </div>
                <div style={{ alignSelf: 'center' }}><RB variant="secondary" iconRight="arrow-right" onClick={onBook}>{lang === 'fr' ? 'Postuler' : 'Apply'}</RB></div>
              </div>
            ))}
          </div>
          <div style={{ background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 28, alignSelf: 'start', boxShadow: 'var(--inner-hairline)' }}>
            <h3 style={{ fontSize: 'var(--text-h5)', fontWeight: 500, marginBottom: 16 }}>{lang === 'fr' ? 'Avantages' : 'Why work with us'}</h3>
            <div style={{ display: 'grid', gap: 12 }}>{page.perks.map((p, i) => <RFe key={i} variant="plain" icon="check" title={tt(p, lang)} />)}</div>
          </div>
        </div>
      </Shell>
    </main>
  );
}

function LegalPage({ page, lang, onNavigate, onBook }) {
  return (
    <main>
      <PageHero page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />
      <Shell>
        <div style={{ maxWidth: 760, margin: '0 auto', display: 'grid', gap: 28 }}>
          {page.sections.map((s, i) => <div key={i}><h2 style={{ fontSize: 'var(--text-h4)', fontWeight: 500, marginBottom: 10 }}>{tt(s.h, lang)}</h2><p style={{ color: 'var(--text-secondary)', lineHeight: 1.7 }}>{tt(s.p, lang)}</p></div>)}
        </div>
      </Shell>
    </main>
  );
}

/* ---------- Our Brands showcase ---------- */
function BrandsPage({ page, lang, onNavigate, onBook, onQuote }) {
  return (
    <main>
      <PageHero page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />
      {/* Brand grid */}
      <Shell>
        <RSH align="center" eyebrow={lang === 'fr' ? 'Marques' : 'Brands'} title={lang === 'fr' ? 'Les marques que nous installons' : 'Brands we sell & install'} intro={lang === 'fr' ? 'Un entrepreneur multimarque — nous recommandons objectivement le bon système pour vous.' : 'A multi-brand contractor — we objectively recommend the right system for you.'} />
        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 16, marginTop: 'var(--space-12)' }} className="epcm-brand-strip">
          {[...new Set((page.machines || []).flatMap((c) => c.items.map((m) => m.brand)))].map((name) => (
            <div key={name} className="epcm-card-hover" style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: 80, borderRadius: 'var(--radius-lg)', background: 'var(--surface-1)', border: '1px solid var(--border)', boxShadow: 'var(--inner-hairline)' }}>
              <span style={{ fontSize: '1.2rem', fontWeight: 700, letterSpacing: '0.01em', color: 'var(--text)' }}>{name}</span>
            </div>
          ))}
        </div>
      </Shell>

      {page.machines && <MachineCatalog cats={page.machines} lang={lang} onBook={onBook} onQuote={onQuote} />}

      <WhyChoose lang={lang} />
      <AreasBand lang={lang} onBook={onBook} />
      {page.faqs && <FAQ faqs={page.faqs} lang={lang} />}
      {page.testimonials && <Reviews items={page.testimonials} lang={lang} />}
      <BookingBand lang={lang} onBook={onBook} />
    </main>
  );
}

function MachineCatalog({ cats, lang, onBook, onQuote }) {
  return (
    <Shell>
      <RSH align="center" eyebrow={lang === 'fr' ? 'À l’honneur' : 'Featured'} title={lang === 'fr' ? 'Équipement que nous recommandons' : 'Equipment we recommend most'} intro={lang === 'fr' ? 'Une sélection de l’équipement précis que nous recommandons et installons le plus — demandez une soumission pour n’importe lequel.' : 'The specific systems we recommend and install most — ask for a quote on any of them.'} />
      <div style={{ display: 'grid', gap: 'var(--space-8)', marginTop: 'var(--space-12)' }}>
        {cats.map((c, ci) => (
          <div key={ci}>
            <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 18 }}>
              <span style={{ display: 'inline-flex', width: 40, height: 40, borderRadius: 'var(--radius-md)', background: 'var(--accent-soft)', border: '1px solid var(--accent-line)', alignItems: 'center', justifyContent: 'center' }}><RI name={c.icon} size={20} color="var(--arctic-blue)" /></span>
              <h3 style={{ fontSize: 'var(--text-h4)', fontWeight: 500, letterSpacing: '-0.01em' }}>{tt(c.cat, lang)}</h3>
              <span style={{ flex: 1, height: 1, background: 'var(--border)' }} />
              <span style={{ fontFamily: 'var(--font-mono)', fontSize: '0.78rem', color: 'var(--text-muted)' }}>{c.items.length}</span>
            </div>
            <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 16 }} className="epcm-grid-3">
              {c.items.map((m, mi) => (
                <div key={mi} className="epcm-card-hover" style={{ display: 'flex', flexDirection: 'column', background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 'var(--space-6)', boxShadow: 'var(--inner-hairline)', backgroundImage: 'var(--gradient-card)' }}>
                  <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 10 }}>
                    <span style={{ flex: 'none', display: 'inline-flex', width: 44, height: 44, borderRadius: 'var(--radius-md)', background: 'var(--accent-soft)', border: '1px solid var(--accent-line)', alignItems: 'center', justifyContent: 'center' }}><RI name={c.icon} size={21} color="var(--arctic-blue)" /></span>
                    {m.note && <span style={{ fontSize: '0.7rem', fontWeight: 600, color: 'var(--on-accent)', background: 'var(--accent)', borderRadius: 'var(--radius-pill)', padding: '4px 11px', whiteSpace: 'nowrap' }}>{tt(m.note, lang)}</span>}
                  </div>
                  <div style={{ marginTop: 16, fontFamily: 'var(--font-mono)', fontSize: '0.72rem', letterSpacing: '0.08em', textTransform: 'uppercase', color: 'var(--accent)' }}>{m.brand}</div>
                  <div style={{ marginTop: 4, fontSize: '1.05rem', fontWeight: 500, color: 'var(--text)', letterSpacing: '-0.01em' }}>{m.name}</div>
                  <div style={{ marginTop: 4, fontSize: '0.86rem', color: 'var(--text-secondary)', lineHeight: 1.4 }}>{tt(m.type, lang)}</div>
                  <div style={{ marginTop: 14, display: 'inline-flex', alignSelf: 'flex-start', alignItems: 'center', gap: 7, fontFamily: 'var(--font-mono)', fontSize: '0.78rem', color: 'var(--text)', background: 'var(--obsidian-900)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)', padding: '6px 11px' }}><RI name="ruler" size={13} color="var(--text-muted)" />{m.sizes}</div>
                  <ul style={{ listStyle: 'none', padding: 0, margin: '16px 0 0', display: 'grid', gap: 9, borderTop: '1px solid var(--border)', paddingTop: 16 }}>
                    {(m.stats || []).map((st, si) => (
                      <li key={si} style={{ display: 'flex', gap: 9, alignItems: 'flex-start', fontSize: '0.86rem', color: 'var(--text-secondary)' }}><RI name="check" size={15} color="var(--accent)" strokeWidth={2.4} style={{ marginTop: 2, flex: 'none' }} />{tt(st, lang)}</li>
                    ))}
                  </ul>
                </div>
              ))}
            </div>
          </div>
        ))}
      </div>
      <div style={{ display: 'flex', justifyContent: 'center', marginTop: 'var(--space-10)' }}>
        <RB variant="primary" size="lg" uppercase iconRight="arrow-right" onClick={onQuote}>{lang === 'fr' ? 'Demander une soumission' : 'Request a quote'}</RB>
      </div>
    </Shell>
  );
}

function FinanceCalculator({ data, lang, onBook, onQuote }) {
  const [amount, setAmount] = React.useState(6000);
  const [months, setMonths] = React.useState(60);
  const apr = data.apr || 9.99;
  const fmt = (n) => '$' + Math.round(n).toLocaleString(lang === 'fr' ? 'fr-CA' : 'en-CA');
  const r = apr / 100 / 12;
  const monthly = r > 0 ? (amount * r) / (1 - Math.pow(1 + r, -months)) : amount / months;
  const total = monthly * months;
  const terms = [24, 36, 48, 60, 72, 120, 180];
  const fieldBg = { background: 'var(--obsidian-900)', border: '1px solid var(--border-strong)', borderRadius: 'var(--radius-sm)' };

  return (
    <Shell grid>
      <RSH align="center" eyebrow={tt(data.eyebrow, lang)} title={tt(data.heading, lang)} intro={tt(data.sub, lang)} />
      <div style={{ display: 'grid', gridTemplateColumns: '1.1fr 0.9fr', gap: 'clamp(1.5rem,4vw,2.5rem)', marginTop: 'var(--space-12)', alignItems: 'stretch' }} className="epcm-2col">
        {/* Controls */}
        <div style={{ background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 'clamp(1.5rem,3vw,2.25rem)', boxShadow: 'var(--inner-hairline)' }}>
          <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }}>
            <label style={{ fontSize: '0.85rem', textTransform: 'uppercase', letterSpacing: '0.1em', color: 'var(--text-secondary)' }}>{lang === 'fr' ? 'Montant du projet' : 'Project amount'}</label>
            <span style={{ fontSize: '1.5rem', fontWeight: 500, color: 'var(--text)', letterSpacing: '-0.02em' }}>{fmt(amount)}</span>
          </div>
          <input type="range" min="1500" max="40000" step="500" value={amount} onChange={(e) => setAmount(+e.target.value)} className="epcm-range" style={{ width: '100%', marginTop: 14 }} />
          <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: '0.72rem', color: 'var(--text-muted)', fontFamily: 'var(--font-mono)' }}><span>$1,500</span><span>$40,000</span></div>

          <label style={{ display: 'block', marginTop: 28, marginBottom: 12, fontSize: '0.85rem', textTransform: 'uppercase', letterSpacing: '0.1em', color: 'var(--text-secondary)' }}>{lang === 'fr' ? 'Durée du terme' : 'Term length'}</label>
          <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>
            {terms.map((m) => (
              <button key={m} onClick={() => setMonths(m)} style={{ flex: '1 0 auto', minWidth: 64, cursor: 'pointer', font: 'inherit', fontSize: '0.85rem', fontWeight: 500, padding: '10px 6px', borderRadius: 'var(--radius-sm)', border: '1px solid ' + (months === m ? 'var(--accent)' : 'var(--border-strong)'), background: months === m ? 'var(--accent-soft)' : 'transparent', color: months === m ? 'var(--arctic-blue)' : 'var(--text-secondary)' }}>{m} {lang === 'fr' ? 'mois' : 'mo'}</button>
            ))}
          </div>
          <p style={{ marginTop: 22, fontSize: '0.8rem', color: 'var(--text-muted)', lineHeight: 1.5 }}>{lang === 'fr' ? `Estimation à un taux annuel représentatif de ${apr}%. Le taux réel dépend de l’approbation de crédit Financeit.` : `Estimated at a representative ${apr}% APR. Your actual rate depends on Financeit credit approval.`}</p>
        </div>

        {/* Result */}
        <div style={{ position: 'relative', overflow: 'hidden', display: 'flex', flexDirection: 'column', justifyContent: 'center', background: 'var(--surface-1)', border: '1px solid var(--border-accent)', borderRadius: 'var(--radius-lg)', padding: 'clamp(1.5rem,3vw,2.25rem)', boxShadow: 'var(--glow-accent)' }}>
          <div style={{ position: 'absolute', inset: 0, background: 'var(--gradient-hero)', opacity: 0.6, pointerEvents: 'none' }} />
          <div style={{ position: 'relative' }}>
            <div style={{ fontSize: '0.85rem', textTransform: 'uppercase', letterSpacing: '0.12em', color: 'var(--text-secondary)' }}>{lang === 'fr' ? 'Paiement mensuel estimé' : 'Estimated monthly payment'}</div>
            <div style={{ display: 'flex', alignItems: 'baseline', gap: 8, marginTop: 8 }}>
              <span style={{ fontSize: 'clamp(3rem,7vw,4.25rem)', fontWeight: 500, letterSpacing: '-0.03em', color: 'var(--text)', lineHeight: 1 }}>{fmt(monthly)}</span>
              <span style={{ fontSize: '1.1rem', color: 'var(--text-muted)' }}>{lang === 'fr' ? '/mois' : '/mo'}</span>
            </div>
            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12, marginTop: 24 }}>
              <div style={{ padding: '14px 16px', ...fieldBg }}><div style={{ fontSize: '0.72rem', color: 'var(--text-muted)', textTransform: 'uppercase', letterSpacing: '0.08em' }}>{lang === 'fr' ? 'Terme' : 'Term'}</div><div style={{ fontSize: '1.1rem', fontWeight: 500, color: 'var(--text)', marginTop: 4 }}>{months} {lang === 'fr' ? 'mois' : 'months'}</div></div>
              <div style={{ padding: '14px 16px', ...fieldBg }}><div style={{ fontSize: '0.72rem', color: 'var(--text-muted)', textTransform: 'uppercase', letterSpacing: '0.08em' }}>{lang === 'fr' ? 'Coût total' : 'Total cost'}</div><div style={{ fontSize: '1.1rem', fontWeight: 500, color: 'var(--text)', marginTop: 4 }}>{fmt(total)}</div></div>
            </div>
            <div style={{ marginTop: 24 }}><RB variant="primary" full uppercase iconRight="arrow-right" onClick={onQuote}>{lang === 'fr' ? 'Obtenir une soumission' : 'Get my quote'}</RB></div>
          </div>
        </div>
      </div>

      {/* Example projects */}
      <div style={{ fontSize: '0.8125rem', textTransform: 'uppercase', letterSpacing: '0.16em', color: 'var(--text-muted)', margin: 'var(--space-10) 0 var(--space-6)' }}>{lang === 'fr' ? 'Exemples de projets' : 'Example projects'}</div>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 16 }} className="epcm-grid-3">
        {data.examples.map((ex, i) => {
          const m60 = (ex.price * r) / (1 - Math.pow(1 + r, -60));
          return (
            <button key={i} onClick={() => { setAmount(ex.price); setMonths(60); }} className="epcm-card-hover" style={{ textAlign: 'left', cursor: 'pointer', font: 'inherit', display: 'flex', flexDirection: 'column', background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 'var(--space-6)', boxShadow: 'var(--inner-hairline)' }}>
              <span style={{ display: 'inline-flex', width: 44, height: 44, borderRadius: 'var(--radius-md)', background: 'var(--accent-soft)', border: '1px solid var(--accent-line)', alignItems: 'center', justifyContent: 'center', marginBottom: 16 }}><RI name={ex.icon} size={21} color="var(--arctic-blue)" /></span>
              <div style={{ fontSize: '1rem', fontWeight: 500, color: 'var(--text)' }}>{tt(ex.name, lang)}</div>
              <div style={{ fontSize: '0.85rem', color: 'var(--text-muted)', marginTop: 4 }}>{lang === 'fr' ? 'à partir d’environ' : 'from approx.'} {fmt(ex.price)}</div>
              <div style={{ marginTop: 16, display: 'flex', alignItems: 'baseline', gap: 6 }}>
                <span style={{ fontSize: '1.9rem', fontWeight: 500, letterSpacing: '-0.02em', color: 'var(--arctic-blue)' }}>{fmt(m60)}</span>
                <span style={{ fontSize: '0.85rem', color: 'var(--text-muted)' }}>{lang === 'fr' ? '/mois · 60 mois' : '/mo · 60 months'}</span>
              </div>
            </button>
          );
        })}
      </div>
    </Shell>
  );
}

function FinanceitBlock({ data, lang, onBook }) {
  return (
    <Shell grid>
      <RSH align="center" eyebrow={tt(data.eyebrow, lang)} title={tt(data.heading, lang)} intro={tt(data.sub, lang)} />
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 20, marginTop: 'var(--space-12)' }} className="epcm-grid-3">
        {data.plans.map((p, i) => (
          <div key={i} style={{ display: 'flex', flexDirection: 'column', background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: 'var(--space-6)', boxShadow: 'var(--inner-hairline)', backgroundImage: 'var(--gradient-card)' }}>
            <span style={{ alignSelf: 'flex-start', fontSize: '0.72rem', textTransform: 'uppercase', letterSpacing: '0.1em', color: 'var(--accent)', border: '1px solid var(--accent-line)', borderRadius: 'var(--radius-pill)', padding: '5px 12px' }}>{tt(p.tag, lang)}</span>
            <h3 style={{ marginTop: 16, fontSize: 'var(--text-h4)', fontWeight: 500, letterSpacing: '-0.01em' }}>{tt(p.title, lang)}</h3>
            <p style={{ marginTop: 10, color: 'var(--text-secondary)', fontSize: '0.94rem', lineHeight: 1.6, flex: 1 }}>{tt(p.desc, lang)}</p>
            <div style={{ marginTop: 18, display: 'inline-flex', alignItems: 'center', gap: 9, fontSize: '0.92rem', fontWeight: 500, color: 'var(--arctic-blue)' }}><RI name="check-circle" size={17} color="var(--accent)" />{tt(p.highlight, lang)}</div>
          </div>
        ))}
      </div>
      <div style={{ display: 'flex', flexWrap: 'wrap', alignItems: 'center', justifyContent: 'space-between', gap: 20, marginTop: 'var(--space-8)', padding: 'var(--space-6)', background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)' }}>
        <div style={{ display: 'flex', flexWrap: 'wrap', gap: '12px 28px' }}>{data.perks.map((pk, i) => <span key={i} style={{ display: 'inline-flex', alignItems: 'center', gap: 9, fontSize: '0.92rem', color: 'var(--text-secondary)' }}><RI name="check" size={15} color="var(--accent)" strokeWidth={2.4} />{tt(pk, lang)}</span>)}</div>
        <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}>
          <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8, fontSize: '0.8rem', color: 'var(--text-muted)' }}>{lang === 'fr' ? 'Propulsé par' : 'Powered by'}<span style={{ fontWeight: 700, fontSize: '1.05rem', color: 'var(--text)', letterSpacing: '-0.01em' }}>Financeit<span style={{ color: 'var(--accent)' }}>.</span></span></span>
          <RB variant="primary" uppercase iconRight="arrow-up-right" href={data.link} target="_blank" rel="noopener">{lang === 'fr' ? 'Faire une demande' : 'Apply now'}</RB>
        </div>
      </div>
    </Shell>
  );
}

/* ---------- main service/category renderer ---------- */
function ServicePage({ page, lang, onNavigate, onBook, onQuote }) {
  return (
    <main>
      <PageHero page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />
      {page.emergency && <EmergencyBand page={page} lang={lang} />}
      {page.breakdown && <BreakdownCards data={page.breakdown} lang={lang} />}
      {page.plans && <PricingPlans plans={page.plans} lang={lang} onBook={onBook} />}
      {page.financeit && <FinanceitBlock data={page.financeit} lang={lang} onBook={onBook} />}
      {page.calculator && <FinanceCalculator data={page.calculator} lang={lang} onBook={onBook} onQuote={onQuote} />}
      {page.subservices && <SubservicesGrid ids={page.subservices} lang={lang} onNavigate={onNavigate} />}
      {page.options && <OptionsCards data={page.options} lang={lang} />}
      <WhyChoose lang={lang} />
      <AreasBand lang={lang} onBook={onBook} />
      {page.faqs && <FAQ faqs={page.faqs} lang={lang} />}
      {page.testimonials && <Reviews items={page.testimonials} lang={lang} />}
      <RelatedNav page={page} lang={lang} onNavigate={onNavigate} />
      <BookingBand lang={lang} onBook={onBook} />
    </main>
  );
}

function PageView({ id, lang, onNavigate, onBook, onQuote }) {
  const page = window.EPCM_PAGES[id];
  React.useEffect(() => {
    if (page && page.meta) {
      document.title = tt(page.meta.title, lang);
      let m = document.querySelector('meta[name="description"]');
      if (!m) { m = document.createElement('meta'); m.name = 'description'; document.head.appendChild(m); }
      m.content = tt(page.meta.description, lang);
    }
  }, [id, lang]);
  if (!page) return null;
  if (page.kind === 'about') return <AboutPage page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />;
  if (page.kind === 'contact') return <ContactPage page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />;
  if (page.kind === 'blog') return <BlogPage page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />;
  if (page.kind === 'hiring') return <HiringPage page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />;
  if (page.kind === 'legal') return <LegalPage page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} />;
  if (page.kind === 'brands') return <BrandsPage page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} onQuote={onQuote} />;
  return <ServicePage page={page} lang={lang} onNavigate={onNavigate} onBook={onBook} onQuote={onQuote} />;
}

window.PageView = PageView;
