/* =========================================================================
   KERIA — Simulateur « commissions perdues » (Agences immobilières)
   Brief : calcul par transactions × prix × commission × annulations × part financement
   Monté sur #sim-agences-root. Réutilise keria-sim-desist.css.
   ========================================================================= */
(function () {
  'use strict';
  var h = React.createElement;
  var useState = React.useState, useEffect = React.useEffect, useRef = React.useRef;

  var _nf = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 0 });
  var _nf1 = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 1 });
  function nf0(n) { return _nf.format(Math.round(n)); }
  function nf1(n) { return _nf1.format(n); }
  var REDUCE = !!(window.matchMedia && window.matchMedia('(prefers-reduced-motion:reduce)').matches);

  /* Intervalle non nominatif pour la mesure d'audience (aligné sur KeriaAnalytics.bucketize). */
  function analyticsBucket(value) {
    var n = typeof value === 'number' ? value : parseFloat(value);
    if (!isFinite(n)) return 'unknown';
    if (n < 0) return 'negative';
    if (n === 0) return '0';
    if (n < 1000) return '<1k';
    if (n < 5000) return '1k-5k';
    if (n < 10000) return '5k-10k';
    if (n < 50000) return '10k-50k';
    if (n < 100000) return '50k-100k';
    if (n < 500000) return '100k-500k';
    return '500k+';
  }

  /* ---- Valeurs sectorielles ("Je ne sais pas") ---- */
  var SECT = {
    transactions: {
      v: 80, disp: '80\u00A0ventes', note: 'FNAIM \u00B7 agence type',
      src: 'FNAIM \u2014 ~450\u00A0000 transactions/an, ~9\u00A0500 agences : 45\u201380 transactions par agence.',
      srcUrl: 'https://www.fnaim.fr'
    },
    prixMoyen: {
      v: 350000, disp: '350\u00A0000\u00A0\u20AC', note: 'CGDD / Notaires 2024',
      src: 'CGDD/SDES \u2014 prix moyen d\u2019une transaction immobili\u00E8re ancienne en France, 2024.',
      srcUrl: 'https://www.statistiques.developpement-durable.gouv.fr'
    },
    tauxCommission: {
      v: 5, disp: '5\u00A0%', note: 'FNAIM \u00B7 commission moyenne',
      src: 'FNAIM \u2014 commission moyenne agences immobili\u00E8res : 4 \u00E0 6\u00A0% du prix de vente.',
      srcUrl: 'https://www.fnaim.fr'
    },
    tauxAnnulation: {
      v: 10, disp: '10\u00A0%', note: 'Le Monde Immobilier 2025',
      src: 'Le Monde Immobilier 2025 \u2014 les professionnels estiment qu\u2019entre 7\u00A0% et 12\u00A0% des promesses de vente sont annul\u00E9es.',
      srcUrl: null
    },
    partFinancement: {
      v: 50, disp: '50\u00A0%', note: 'Estimation sectorielle',
      src: 'Estimation sectorielle \u2014 part des annulations de compromis li\u00E9e \u00E0 un refus ou une difficult\u00E9 de financement.',
      srcUrl: null
    },
    heuresParVente: {
      v: 20, disp: '20\u00A0h', note: 'Hypoth\u00E8se de calcul',
      src: 'Hypoth\u00E8se \u2014 temps moyen investi par vente annul\u00E9e : n\u00E9gociation, suivi, relances, r\u00E9-engagement du bien.',
      srcUrl: null
    },
    reductionKeria: {
      v: 50, disp: '50\u00A0%', note: 'Phase pilote Keria',
      src: 'Hypoth\u00E8se \u2014 r\u00E9duction des annulations financi\u00E8res gr\u00E2ce \u00E0 la qualification pr\u00E9alable Keria (technologie C\u00E9zam).',
      srcUrl: null
    },
    abonnementKeria: {
      v: 3600, disp: '3\u00A0600\u00A0\u20AC', note: 'Tarif indicatif Keria',
      src: 'Tarification indicative Keria \u2014 \u00E0 confirmer selon le p\u00E9rim\u00E8tre et le volume.',
      srcUrl: null
    }
  };

  var ATTESTATION_PRIX   = 30;   /* € par attestation */
  var ATTESTATION_CREDIT = 300;  /* € crédit par dossier courtage validé (10 × 30 €) */

  /* ---- Tween animé ---- */
  function useTween(target) {
    var _s = useState(target), val = _s[0], setVal = _s[1];
    var raf = useRef(0), cur = useRef(target);
    useEffect(function () {
      if (REDUCE) { cur.current = target; setVal(target); return; }
      var from = cur.current, start = performance.now();
      cancelAnimationFrame(raf.current);
      function step(now) {
        var p = Math.min((now - start) / 700, 1), e = 1 - Math.pow(1 - p, 3);
        cur.current = from + (target - from) * e; setVal(cur.current);
        if (p < 1) raf.current = requestAnimationFrame(step);
        else { cur.current = target; setVal(target); }
      }
      raf.current = requestAnimationFrame(step);
      return function () { cancelAnimationFrame(raf.current); };
    }, [target]);
    return val;
  }
  function AnimNum(p) { return nf0(useTween(p.value)); }

  function fillTrack(v, min, max, dark) {
    var p = ((v - min) / (max - min || 1)) * 100;
    return { background: 'linear-gradient(90deg,' + (dark ? 'var(--cobalt-bright)' : 'var(--cobalt)') + ' ' + p + '%,' + (dark ? 'rgba(255,255,255,.16)' : 'var(--line-2)') + ' ' + p + '%)' };
  }

  /* ---- Icônes ---- */
  function Ico(p) {
    return h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2, 'aria-hidden': 'true' },
      h('path', { d: p.d, strokeLinecap: 'round', strokeLinejoin: 'round' }));
  }
  var D_ARROW = 'M5 12h14M13 6l6 6-6 6';
  var D_INFO  = 'M12 16v-4M12 8h.01M12 22a10 10 0 100-20 10 10 0 000 20z';
  var D_RESET = 'M3 12a9 9 0 109-9 9 9 0 00-7 3.5M3 4v4h4';
  var D_CHECK = 'M20 6L9 17l-5-5';
  var D_EXT   = 'M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6M15 3h6v6M10 14L21 3';
  var D_CLOCK = 'M12 22a10 10 0 100-20 10 10 0 000 20zM12 6v6l4 2';
  var D_FILE  = 'M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8zM14 2v6h6M9 13h6M9 17h4';
  var D_BANK  = 'M3 21h18M3 10h18M5 6l7-3 7 3M4 10v11M20 10v11M8 10v11M12 10v11M16 10v11';
  var D_PHONE = 'M22 16.92v3a2 2 0 01-2.18 2A19.79 19.79 0 013.08 5.18 2 2 0 015 3h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L9.09 10a16 16 0 006.91 6.91l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z';

  /* ---- Toggle "Je ne sais pas" ---- */
  function UnkToggle(p) {
    return h('button', { type: 'button',
      className: 'dsim-unk' + (p.active ? ' active' : '') + (p.dark ? ' dark' : ''),
      onClick: p.onClick },
      p.active ? 'Estim\u00E9\u00A0\u00B7\u00A0secteur' : 'Je ne sais pas');
  }

  /* ---- Popover source ---- */
  function SourcePopover(p) {
    var s = p.sect || {};
    if (!s.src) return null;
    var _o = useState(false), open = _o[0], setOpen = _o[1];
    var ref = useRef(null);
    useEffect(function () {
      if (!open) return;
      function onDown(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }
      document.addEventListener('mousedown', onDown); document.addEventListener('touchstart', onDown);
      return function () { document.removeEventListener('mousedown', onDown); document.removeEventListener('touchstart', onDown); };
    }, [open]);
    return h('span', { className: 'dsim-src-wrap', ref: ref },
      h('button', { type: 'button',
        className: 'dsim-sect-info' + (open ? ' open' : '') + (p.dark ? ' dark' : ''),
        onClick: function (e) { e.stopPropagation(); setOpen(!open); },
        'aria-label': 'Source', 'aria-expanded': open },
        h(Ico, { d: D_INFO })),
      open ? h('div', { className: 'dsim-src-pop' + (p.dark ? ' dark' : '') },
        h('p', { className: 'dsim-src-text' }, s.src),
        s.srcUrl ? h('a', { href: s.srcUrl, target: '_blank', rel: 'noopener noreferrer',
          className: 'dsim-src-link', onClick: function (e) { e.stopPropagation(); } },
          'Consulter la source\u00A0', h(Ico, { d: D_EXT })) : null
      ) : null
    );
  }

  function SectVal(p) {
    var s = p.sect || {};
    return h('div', { className: 'dsim-sect-val' + (p.dark ? ' dark' : '') },
      h('span', { className: 'dsim-sect-badge' }, s.note || ''),
      h('span', { className: 'dsim-sect-num' }, s.disp || ''),
      h(SourcePopover, { sect: s, dark: p.dark })
    );
  }

  /* ---- Slider ---- */
  function Slider(p) {
    var dark = !!p.dark, isUnk = !!p.unknown;
    return h('div', { className: p.cls || 'dsim-field' },
      h('div', { className: 'top' },
        h('label', { htmlFor: p.id }, p.label),
        h('div', { className: 'dsim-top-right' },
          p.onToggleUnknown ? h(UnkToggle, { active: isUnk, onClick: p.onToggleUnknown, dark: dark }) : null,
          !isUnk ? h('span', { className: 'val' }, p.display) : null
        )
      ),
      p.hint && !isUnk ? h('p', { className: 'dsim-hint' }, p.hint) : null,
      isUnk ? h(SectVal, { sect: p.sect, dark: dark })
        : h('input', { className: dark ? 'range' : 'range-light', type: 'range', id: p.id,
            min: p.min, max: p.max, step: p.step, value: p.value,
            style: fillTrack(p.value, p.min, p.max, dark),
            onChange: function (e) { p.onChange(parseFloat(e.target.value)); } }),
      !isUnk && p.scale ? h('div', { className: 'dsim-scale' }, h('span', null, p.scale[0]), h('span', null, p.scale[1])) : null
    );
  }

  /* ---- Money ---- */
  function Money(p) {
    var isUnk = !!p.unknown;
    return h('div', { className: p.cls || 'dsim-field' },
      h('div', { className: 'top' },
        h('label', { htmlFor: p.id }, p.label),
        p.onToggleUnknown ? h(UnkToggle, { active: isUnk, onClick: p.onToggleUnknown, dark: !!p.dark }) : null
      ),
      isUnk ? h(SectVal, { sect: p.sect, dark: !!p.dark })
        : h('div', { className: 'dsim-money' + (p.dark ? ' dark' : '') },
            h('input', { id: p.id, type: 'text', inputMode: 'numeric',
              value: nf0(p.value), 'aria-label': p.label,
              onChange: function (e) {
                var n = parseInt((e.target.value || '').replace(/[^\d]/g, ''), 10) || 0;
                p.onChange(Math.min(n, p.max || 9999999));
              } }),
            h('span', { className: 'cur' }, '\u20AC')
          )
    );
  }

  /* ---- Carte KPI opérationnel ---- */
  function KpiCard(p) {
    return h('div', { className: 'dsim-kpi-card' },
      h('div', { className: 'dsim-kpi-ico' }, h(Ico, { d: p.ico })),
      h('div', { className: 'dsim-kpi-val' }, h(AnimNum, { value: p.value }), h('span', null, p.unit || '')),
      h('div', { className: 'dsim-kpi-label' }, p.label),
      h('div', { className: 'dsim-kpi-sub' }, p.sub)
    );
  }

  /* ---- Boîte tarification Keria ---- */
  function PricingBoxAgences(p) {
    var isGratuit = p.credit >= p.brut;
    var net = Math.max(0, p.brut - p.credit);
    return h('div', { className: 'dsim-pricing-box' },
      h('div', { className: 'pb-row' },
        h('span', { className: 'pb-label' }, 'Attestations'),
        h('span', { className: 'pb-calc' }, nf0(p.nb) + '\u00A0\u00D7\u00A030\u00A0\u20AC'),
        h('span', { className: 'pb-val' }, nf0(p.brut) + '\u00A0\u20AC')
      ),
      h('div', { className: 'pb-row pb-credit' },
        h('span', { className: 'pb-label' }, 'Cr\u00E9dit courtage'),
        h('span', { className: 'pb-calc' }, nf0(p.dossiers) + '\u00A0\u00D7\u00A0300\u00A0\u20AC'),
        h('span', { className: 'pb-val' }, '\u2212\u00A0' + nf0(p.credit) + '\u00A0\u20AC')
      ),
      h('div', { className: 'pb-total' + (isGratuit ? ' pb-free' : '') },
        h('span', null, 'Co\u00FBt net Keria'),
        h('span', null, isGratuit
          ? h(React.Fragment, null,
              h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2.5, width: 14, height: 14, style: { marginRight: '5px', verticalAlign: 'middle' } },
                h('path', { d: D_CHECK, strokeLinecap: 'round', strokeLinejoin: 'round' })),
              'Couvert par le courtage')
          : nf0(net) + '\u00A0\u20AC\u00A0/\u00A0an'
        )
      )
    );
  }

  /* ===== Composant principal ===== */
  function SimAgences() {
    /* ---- État ---- */
    var _tr = useState(80),    transactions    = _tr[0], setTransactions   = _tr[1];
    var _pm = useState(350000),prixMoyen       = _pm[0], setPrixMoyen      = _pm[1];
    var _tc = useState(5),     tauxCommission  = _tc[0], setTauxCommission = _tc[1];
    var _ta = useState(10),    tauxAnnulation  = _ta[0], setTauxAnnulation = _ta[1];
    var _pf = useState(50),    partFinancement = _pf[0], setPartFinancement= _pf[1];
    var _hp = useState(20),    heuresParVente  = _hp[0], setHeuresParVente = _hp[1];
    var _rk = useState(50),    reductionKeria  = _rk[0], setReductionKeria = _rk[1];
    var _dc = useState(30),    dossiersCourtage = _dc[0], setDossiersCourtage = _dc[1];
    var _u  = useState({}),    unknowns        = _u[0],  setUnknowns       = _u[1];
    var _em = useState(''),    email           = _em[0], setEmail          = _em[1];
    var _co = useState(false), consent         = _co[0], setConsent        = _co[1];
    var _sn = useState(false), sent            = _sn[0], setSent           = _sn[1];
    var _er = useState(''),    formErr         = _er[0], setFormErr        = _er[1];

    function toggleUnk(k) { setUnknowns(function (p) { var n = Object.assign({}, p); n[k] = !p[k]; return n; }); }

    /* ---- Valeurs effectives ---- */
    var eTr  = unknowns.transactions    ? SECT.transactions.v    : transactions;
    var ePm  = unknowns.prixMoyen       ? SECT.prixMoyen.v       : prixMoyen;
    var eTc  = unknowns.tauxCommission  ? SECT.tauxCommission.v  : tauxCommission;
    var eTa  = unknowns.tauxAnnulation  ? SECT.tauxAnnulation.v  : tauxAnnulation;
    var ePf  = unknowns.partFinancement ? SECT.partFinancement.v : partFinancement;
    var eHp  = unknowns.heuresParVente  ? SECT.heuresParVente.v  : heuresParVente;
    var eRk  = unknowns.reductionKeria  ? SECT.reductionKeria.v  : reductionKeria;
    /* Tarification attestations */
    var nbAttestations = Math.round(eTr * (1 + eTa / 100));
    var coutBrut       = nbAttestations * ATTESTATION_PRIX;
    var creditCourtage = dossiersCourtage * ATTESTATION_CREDIT;
    var coutNet        = Math.max(0, coutBrut - creditCourtage);

    /* ---- Calcul principal ---- */
    var commissionMoy  = ePm * (eTc / 100);
    var nbAnnulations  = eTr * (eTa / 100);
    var ventesPerduees = nbAnnulations * (ePf / 100);
    var caPerdu        = commissionMoy * ventesPerduees;

    /* ---- Calcul avec Keria ---- */
    var ventesEvitees  = ventesPerduees * (eRk / 100);
    var caRecupere     = commissionMoy * ventesEvitees;
    var caApres        = caPerdu - caRecupere;
    var roi            = coutNet > 0 ? caRecupere / coutNet : 0;
    var apresPct       = caPerdu > 0 ? (caApres / caPerdu) * 100 : 0;

    /* ---- Impact opérationnel ---- */
    var heuresEco      = ventesEvitees * eHp;
    var compromisEvit  = ventesEvitees;
    var dossiersBanc   = ventesEvitees * 2;
    var relancesEvit   = ventesEvitees * 5;

    function reset() {
      setReductionKeria(50);
      setDossiersCourtage(Math.round(eTr * 0.5) || 30);
      setUnknowns(function (p) { var n = Object.assign({}, p); delete n.reductionKeria; return n; });
    }

    function submit(e) {
      e.preventDefault();
      if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { setFormErr('Indiquez une adresse e\u2011mail valide.'); return; }
      if (!consent) { setFormErr('Merci d\u2019accepter d\u2019\u00EAtre recontact\u00E9(e) (RGPD).'); return; }
      setFormErr('');
      var details = 'Transactions/an : ' + eTr
        + ' · Prix moyen : ' + Math.round(ePm).toLocaleString('fr-FR') + ' €'
        + ' · Taux de commission : ' + eTc + ' %'
        + ' · Taux d’annulation : ' + eTa + ' %'
        + ' · Part financement : ' + ePf + ' %'
        + ' · CA perdu actuel : ' + Math.round(caPerdu).toLocaleString('fr-FR') + ' €'
        + ' · Réduction visée Keria : ' + eRk + ' %'
        + ' · CA récupéré estimé : ' + Math.round(caRecupere).toLocaleString('fr-FR') + ' €'
        + ' · ROI : ' + (Math.round(roi * 10) / 10) + '×';
      var fields = {
        email: email,
        simulateur_type: 'Agences',
        simulation_cout_actuel: String(Math.round(caPerdu)),
        simulation_gain_keria: String(Math.round(caRecupere)),
        simulation_details: details,
        source_provenance: 'simulateur-agences',
        page_d_origine: location.pathname + location.search
      };
      try { var qs = new URLSearchParams(location.search); ['utm_source','utm_medium','utm_campaign'].forEach(function(k){ var v = qs.get(k); if (v) fields[k] = v; }); } catch (_) {}
      setSent(true);
      if (window.keriaSubmitHubSpot) { window.keriaSubmitHubSpot('simulateur-agences', fields); }
      try {
        if (window.KeriaAnalytics && window.KeriaAnalytics.track) {
          window.KeriaAnalytics.track('keria_sim_result', {
            simulator: 'agences',
            cout_actuel_bucket: analyticsBucket(Math.round(caPerdu)),
            gain_keria_bucket: analyticsBucket(Math.round(caRecupere))
          });
        }
      } catch (_) {}
      try { if (window.plausible) window.plausible('sim_agences_lead', { props: { ca: Math.round(caPerdu) } }); } catch (_) {}
    }

    /* ---- Étape 1 ---- */
    var step1 = h('div', { className: 'dsim-step' },
      h('div', { className: 'dsim-step-head' },
        h('span', { className: 'n' }, '1'),
        h('h3', null, 'Activit\u00E9 de l\u2019agence'),
        h('span', { className: 'cap' }, 'Transactions')
      ),
      h(Slider, { id: 'ag-tr', label: 'Nombre de transactions annuelles',
        min: 0, max: 500, step: 5, value: transactions, onChange: setTransactions,
        display: nf0(transactions) + '\u00A0ventes', scale: ['0', '500'],
        unknown: unknowns.transactions, onToggleUnknown: function () { toggleUnk('transactions'); }, sect: SECT.transactions }),
      h(Money, { id: 'ag-pm', label: 'Prix moyen des biens vendus',
        value: prixMoyen, max: 5000000, onChange: setPrixMoyen,
        unknown: unknowns.prixMoyen, onToggleUnknown: function () { toggleUnk('prixMoyen'); }, sect: SECT.prixMoyen }),
      h(Slider, { id: 'ag-tc', label: 'Taux moyen de commission',
        min: 1, max: 10, step: 0.5, value: tauxCommission, onChange: setTauxCommission,
        display: nf1(tauxCommission) + '\u00A0%', scale: ['1\u00A0%', '10\u00A0%'],
        unknown: unknowns.tauxCommission, onToggleUnknown: function () { toggleUnk('tauxCommission'); }, sect: SECT.tauxCommission })
    );

    /* ---- Étape 2 ---- */
    var step2 = h('div', { className: 'dsim-step' },
      h('div', { className: 'dsim-step-head' },
        h('span', { className: 'n' }, '2'),
        h('h3', null, 'Risque de perte'),
        h('span', { className: 'cap' }, 'Financement')
      ),
      h(Slider, { id: 'ag-ta', label: 'Taux d\u2019annulation des compromis',
        min: 0, max: 20, step: 1, value: tauxAnnulation, onChange: setTauxAnnulation,
        display: tauxAnnulation + '\u00A0%', scale: ['0\u00A0%', '20\u00A0%'],
        hint: 'Entre 7\u00A0% et 12\u00A0% selon les professionnels du secteur \u00B7 Le Monde Immobilier 2025',
        unknown: unknowns.tauxAnnulation, onToggleUnknown: function () { toggleUnk('tauxAnnulation'); }, sect: SECT.tauxAnnulation }),
      h(Slider, { id: 'ag-pf', label: 'Part des annulations li\u00E9es au financement',
        min: 0, max: 100, step: 5, value: partFinancement, onChange: setPartFinancement,
        display: partFinancement + '\u00A0%', scale: ['0\u00A0%', '100\u00A0%'],
        unknown: unknowns.partFinancement, onToggleUnknown: function () { toggleUnk('partFinancement'); }, sect: SECT.partFinancement })
    );

    /* ---- Étape 3 ---- */
    var step3 = h('div', { className: 'dsim-step' },
      h('div', { className: 'dsim-step-head' },
        h('span', { className: 'n' }, '3'),
        h('h3', null, 'Temps investi'),
        h('span', { className: 'cap' }, 'Op\u00E9rationnel')
      ),
      h(Slider, { id: 'ag-hp', label: 'Heures de travail perdues par vente annul\u00E9e',
        min: 0, max: 60, step: 2, value: heuresParVente, onChange: setHeuresParVente,
        display: heuresParVente + '\u00A0h', scale: ['0', '60\u00A0h'],
        unknown: unknowns.heuresParVente, onToggleUnknown: function () { toggleUnk('heuresParVente'); }, sect: SECT.heuresParVente })
    );

    var controls = h('div', { className: 'dsim-controls dsim-in' },
      step1, step2, step3,
      h('p', { className: 'dsim-controls-note' },
        h(Ico, { d: D_INFO }),
        h('span', null, 'Estimation indicative. \u00AB\u00A0Je ne sais pas\u00A0\u00BB substitue une valeur de r\u00E9f\u00E9rence sectorielle (\u24D8\u00A0= source). Sans valeur contractuelle.')
      )
    );

    /* ---- Formule de calcul ---- */
    var formula = h('div', { className: 'dsim-formula' },
      h('span', { className: 'fv' }, nf0(eTr)),
      h('span', { className: 'fo' }, '\u00D7'),
      h('span', { className: 'fv' }, nf0(ePm) + '\u00A0\u20AC'),
      h('span', { className: 'fo' }, '\u00D7'),
      h('span', { className: 'fv' }, nf1(eTc) + '\u00A0%'),
      h('span', { className: 'fo' }, '\u00D7'),
      h('span', { className: 'fv' }, eTa + '\u00A0%'),
      h('span', { className: 'fo' }, '\u00D7'),
      h('span', { className: 'fv' }, ePf + '\u00A0%'),
      h('span', { className: 'fo' }, '\u003D'),
      h('span', { className: 'fr' }, nf0(caPerdu) + '\u00A0\u20AC')
    );

    /* ---- Carte résultat ---- */
    var result = h('div', { className: 'dsim-result dsim-in', style: { animationDelay: '.09s' } },
      h('span', { className: 'tag' }, 'Votre manque \u00E0 gagner annuel estim\u00E9'),
      h('div', { className: 'dsim-total' }, h(AnimNum, { value: caPerdu }), h('em', null, '\u00A0\u20AC')),
      h('p', { className: 'sub' }, 'Commissions non encaiss\u00E9es \u00E0 cause des acqu\u00E9reurs insuffisamment qualifi\u00E9s.'),
      formula,
      h('div', { className: 'dsim-foot' },
        h('div', { className: 'f' },
          h('div', { className: 'n' }, h(AnimNum, { value: ventesPerduees })),
          h('div', { className: 'l' }, 'Ventes perdues\u00A0/ an')
        ),
        h('div', { className: 'f' },
          h('div', { className: 'n' }, h(AnimNum, { value: nbAnnulations })),
          h('div', { className: 'l' }, 'Acqu\u00E9reurs mal qualifi\u00E9s')
        ),
        h('div', { className: 'f' },
          h('div', { className: 'n' }, h(AnimNum, { value: commissionMoy }), h('span', { className: 'eu' }, '\u00A0\u20AC')),
          h('div', { className: 'l' }, 'Commission\u00A0/ vente')
        )
      ),
      h('form', { className: 'lc' + (sent ? ' is-sent' : ''), onSubmit: submit, noValidate: true },
        h('label', { className: 'lc-label', htmlFor: 'ag-email' }, 'Recevez votre simulation compl\u00E8te \u2014 r\u00E9ponse Keria sous 24\u00A0h'),
        h('div', { className: 'lc-row' },
          h('input', { type: 'email', id: 'ag-email', name: 'email', autoComplete: 'email',
            placeholder: 'vous@agence.fr', value: email,
            onChange: function (e) { setEmail(e.target.value); } }),
          h('button', { type: 'submit', className: 'btn btn-gold' }, 'Recevoir\u00A0', h(Ico, { d: D_ARROW }))
        ),
        h('label', { className: 'consent' },
          h('input', { type: 'checkbox', name: 'consent', checked: consent,
            onChange: function (e) { setConsent(e.target.checked); } }),
          h('span', null, 'J\u2019accepte d\u2019\u00EAtre recontact\u00E9(e) par Keria (RGPD).')
        ),
        h('p', { className: 'lc-note', style: formErr ? { color: '#FCA5A5' } : null }, formErr || 'R\u00E9ponse sous 24\u00A0h\u00A0\u00B7 sans engagement\u00A0\u00B7 RGPD.'),
        h('div', { className: 'lc-success' },
          h('span', { className: 'ck' },
            h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2.6, 'aria-hidden': 'true' },
              h('path', { d: D_CHECK, strokeLinecap: 'round', strokeLinejoin: 'round' }))),
          h('div', null,
            h('b', null, 'E-mail envoy\u00E9 \u2014 votre simulation est en route.'),
            h('p', null, 'Vous recevez le d\u00E9tail chiffr\u00E9 + votre gain potentiel avec Keria. Un expert vous recontacte sous 24\u00A0h.')),
          h('div', { className: 'lc-actions' },
            h('button', { type: 'button', className: 'btn btn-ghost on-navy', onClick: function () { setSent(false); setEmail(''); setConsent(false); setFormErr(''); } }, h(Ico, { d: D_RESET }), 'Refaire une simulation'),
            h('a', { className: 'btn btn-gold', href: 'agences.html' }, 'Retour \u00E0 la page agences\u00A0', h(Ico, { d: D_ARROW })))
        )
      )
    );

    /* ---- Section "Avec Keria" ---- */
    var impactKeria = h('section', { className: 'section nocturne', id: 'avec-keria' },
      h('span', { className: 'beam', style: { top: '-30%', right: '-6%', opacity: '.45' } }),
      h('div', { className: 'wrap-wide', style: { position: 'relative', zIndex: 2 } },
        h('div', { className: 'section-head center' },
          h('span', { className: 'eyebrow' }, 'Avec Keria'),
          h('h2', null, 'Et si chaque acqu\u00E9reur \u00E9tait ', h('span', { className: 'serif-i gold' }, 'certifi\u00E9 finan\u00E7able avant l\u2019offre'), '\u00A0?'),
          h('p', { className: 'lead' }, 'En qualifiant la solvabilit\u00E9 d\u00E8s la premi\u00E8re visite, Keria r\u00E9duit les compromis caducs. Ajustez les hypoth\u00E8ses ci-dessous.')
        ),
        /* Hypothèses */
        h('div', { className: 'dsim-impact' },
          h('div', { className: 'dsim-hyp' },
            h('div', { className: 'hfield' },
              h('div', { className: 'top' },
                h('label', { htmlFor: 'ag-rk' }, 'R\u00E9duction des annulations financi\u00E8res avec Keria'),
                h('div', { className: 'dsim-top-right' },
                  h(UnkToggle, { active: !!unknowns.reductionKeria, onClick: function () { toggleUnk('reductionKeria'); }, dark: true }),
                  !unknowns.reductionKeria ? h('span', { className: 'val' }, eRk + '\u00A0%') : null
                )
              ),
              unknowns.reductionKeria
                ? h(SectVal, { sect: SECT.reductionKeria, dark: true })
                : h('input', { className: 'range', type: 'range', id: 'ag-rk',
                    min: 0, max: 100, step: 5, value: eRk,
                    style: fillTrack(eRk, 0, 100, true),
                    onChange: function (e) { setReductionKeria(parseFloat(e.target.value)); } })
            ),
            h('div', { className: 'hfield' },
              h('div', { className: 'top' },
                h('label', { htmlFor: 'ag-dc' }, 'Dossiers courtage Keria validés / an'),
                h('span', { className: 'val' }, nf0(dossiersCourtage))
              ),
              h('input', { className: 'range', type: 'range', id: 'ag-dc',
                min: 0, max: Math.max(1, eTr), step: 1, value: dossiersCourtage,
                style: fillTrack(dossiersCourtage, 0, Math.max(1, eTr), true),
                onChange: function (e) { setDossiersCourtage(parseInt(e.target.value, 10)); } })
            ),
            h('div', { className: 'reset' },
              h('button', { type: 'button', onClick: reset }, h(Ico, { d: D_RESET }), 'R\u00E9initialiser')
            )
          )
        ),
        h(PricingBoxAgences, { nb: nbAttestations, dossiers: dossiersCourtage, brut: coutBrut, credit: creditCourtage }),

        /* Barres + gain + ROI */
        h('div', { className: 'dsim-payoff' },
          h('div', { className: 'dsim-compare' },
            h('div', { className: 'dsim-bar avant' },
              h('div', { className: 'amt' }, h(AnimNum, { value: caPerdu }), '\u00A0\u20AC'),
              h('div', { className: 'track' }, h('div', { className: 'col', style: { height: '100%' } })),
              h('div', { className: 'cap' }, 'Avant Keria', h('span', { className: 'capn' }, nf1(eTa) + '\u00A0% d\u2019annulation'))
            ),
            h('div', { className: 'dsim-bar apres' },
              h('div', { className: 'amt' }, h(AnimNum, { value: caApres }), '\u00A0\u20AC'),
              h('div', { className: 'track' }, h('div', { className: 'col', style: { height: Math.max(2, apresPct).toFixed(1) + '%' } })),
              h('div', { className: 'cap' }, 'Avec Keria', h('span', { className: 'capn' }, eRk + '\u00A0% d\u2019annulations \u00E9vit\u00E9es'))
            )
          ),
          h('div', null,
            h('div', { className: 'dsim-gain' },
              h('span', { className: 'tag' }, 'CA r\u00E9cup\u00E9r\u00E9 annuel estim\u00E9'),
              h('div', { className: 'big' }, '+', h(AnimNum, { value: caRecupere }), '\u00A0\u20AC'),
              h('p', null, 'De chiffre d\u2019affaires s\u00E9curis\u00E9 chaque ann\u00E9e en qualifiant les acqu\u00E9reurs avant le compromis.')
            ),
            coutNet > 0
              ? h('div', { className: 'dsim-roi' },
                  h('div', { className: 'x' }, h(AnimNum, { value: roi }), h('i', null, '×')),
                  h('div', { className: 'rt' },
                    h('b', null, 'ROI estimé'),
                    h('p', null, 'Pour 1 € investi dans Keria, votre agence pourrait sécuriser jusqu’à ',
                      h('b', { style: { display: 'inline', color: 'var(--cobalt-bright)' } }, nf0(roi) + ' €'),
                      ' de chiffre d’affaires.')
                  )
                )
              : h('div', { className: 'dsim-roi' },
                  h('div', { className: 'x', style: { color: 'var(--green-bright)' } }, '∞'),
                  h('div', { className: 'rt' },
                    h('b', null, 'ROI estimé'),
                    h('p', null, 'Les commissions courtage couvrent intégralement le coût des attestations Keria.')
                  )
                )
          )
        ),
        h('p', { className: 'dsim-disclaimer' },
          h(Ico, { d: D_INFO }),
          h('span', null, 'Hypoth\u00E8ses ajustables et indicatives, sans valeur contractuelle. Variables selon le profil des acqu\u00E9reurs, la zone g\u00E9ographique et le p\u00E9rim\u00E8tre.')
        )
      )
    );

    /* ---- Section impact opérationnel ---- */
    var impactOps = h('section', { className: 'section', id: 'impact-ops', style: { background: 'var(--cream,#f9f7f3)' } },
      h('div', { className: 'wrap-wide' },
        h('div', { className: 'section-head center' },
          h('span', { className: 'eyebrow' }, 'Impact op\u00E9rationnel'),
          h('h2', null, 'Du temps retrouv\u00E9,\u00A0', h('span', { className: 'serif-i' }, 'des \u00E9quipes lib\u00E9r\u00E9es'), '.'),
          h('p', { className: 'lead' }, 'Chaque vente sauvegard\u00E9e r\u00E9duit aussi la charge op\u00E9rationnelle de vos n\u00E9gociateurs.')
        ),
        h('div', { className: 'dsim-kpi-grid' },
          h(KpiCard, { ico: D_CLOCK, value: heuresEco,     unit: '\u00A0h',  label: 'Heures \u00E9conomis\u00E9es',         sub: 'N\u00E9gociation, suivi, relances, r\u00E9-engagement du bien' }),
          h(KpiCard, { ico: D_FILE,  value: compromisEvit, unit: '',        label: 'Compromis inutiles \u00E9vit\u00E9s',   sub: 'Actes non r\u00E9dig\u00E9s, d\u00E9lais \u00E9conomis\u00E9s' }),
          h(KpiCard, { ico: D_BANK,  value: dossiersBanc,  unit: '',        label: 'Dossiers bancaires \u00E9vit\u00E9s',   sub: 'Instructions bancaires pr\u00E9matur\u00E9es \u00E9vit\u00E9es' }),
          h(KpiCard, { ico: D_PHONE, value: relancesEvit,  unit: '',        label: 'Relances \u00E9vit\u00E9es',            sub: 'Appels et emails de suivi \u00E9conomis\u00E9s' })
        ),
        h('p', { className: 'dsim-controls-note', style: { justifyContent: 'center', marginTop: '24px' } },
          h(Ico, { d: D_INFO }),
          h('span', null, 'KPIs calculés sur la base de ' + eHp + '\u00A0h de travail perdues par vente annulée (ajustable en étape 3) et de ratios observés en agence.')
        )
      )
    );

    /* ---- CTA ---- */
    var cta = h('section', { className: 'section', id: 'conversion' },
      h('div', { className: 'wrap' },
        h('div', { className: 'cta-band nocturne' },
          h('span', { className: 'beam' }),
          h('span', { className: 'eyebrow', style: { justifyContent: 'center', marginBottom: '16px' } }, 'Passons \u00E0 votre agence'),
          h('h2', { style: { position: 'relative', zIndex: 2 } }, 'Combien de ventes pourriez-vous s\u00E9curiser\u00A0?'),
          h('p', { className: 'lead', style: { position: 'relative', zIndex: 2, margin: '0 auto 32px' } },
            'D\u00E9couvrez comment Keria permet de qualifier financi\u00E8rement vos acqu\u00E9reurs avant l\u2019offre d\u2019achat.'),
          h('div', { className: 'row' },
            h('a', { href: 'contact.html', className: 'btn btn-gold btn-lg' }, 'Demander une d\u00E9monstration\u00A0', h(Ico, { d: D_ARROW })),
            h('a', { href: 'pilote-agence.html', className: 'btn btn-ghost on-navy btn-lg' }, 'Tester Keria')
          )
        )
      )
    );

    /* Section « Impact avec Keria » retirée du visible → projection envoyée par e-mail */
    var sentNotice = h('section', { className: 'section nocturne', id: 'avec-keria' },
      h('span', { className: 'beam', style: { top: '-30%', right: '-6%', opacity: '.45' } }),
      h('div', { className: 'wrap-wide', style: { position: 'relative', zIndex: 2 } },
        h('div', { className: 'section-head center' },
          h('span', { className: 'eyebrow' }, 'Votre projection personnalisée'),
          h('h2', null, 'Votre CA récupérable avec Keria ', h('span', { className: 'serif-i gold' }, 'arrive par e-mail'), '.'),
          h('p', { className: 'lead' }, 'Nous venons d’envoyer votre simulation complète — CA perdu aujourd’hui et chiffre d’affaires récupérable avec Keria — à votre adresse. Un expert vous recontacte sous 24 h ; pensez à vérifier vos courriers indésirables.')
        )
      )
    );

    return h(React.Fragment, null,
      h('section', { className: 'section', id: 'simulateur' },
        h('div', { className: 'wrap-wide' },
          h('div', { className: 'section-head center' },
            h('span', { className: 'eyebrow' }, 'Simulateur \u00B7 Agences immobili\u00E8res'),
            h('h2', null, 'R\u00E9glez vos param\u00E8tres,\u00A0', h('span', { className: 'serif-i gold' }, 'lisez le co\u00FBt r\u00E9el'), '.'),
            h('p', { className: 'lead' }, 'Tout se recalcule en direct. Les chiffres ci-contre s\u2019actualisent \u00E0 chaque r\u00E9glage.')
          ),
          h('div', { className: 'dsim dsim-grid' }, controls, result)
        )
      ),
      sent ? sentNotice : null,
      cta
    );
  }

  var mount = document.getElementById('sim-agences-root');
  if (mount) ReactDOM.createRoot(mount).render(h(SimAgences));
})();
