/* =========================================================================
   KERIA — Simulateur « revenu perdu » (Mandataires) — v2
   Brief : ventes × prix × honoraires × partReversée × annulations × financement
   Tarification : 30 €/attestation — 10 offertes par dossier courtage validé
   Monté sur #sim-mandataires-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 = {
    ventes: {
      v: 12, disp: '12\u00A0ventes', note: 'Mandataire actif \u00B7 estimation',
      src: 'Estimation \u2014 mandataire ind\u00E9pendant actif r\u00E9alisant 10\u201320 transactions par an.',
      srcUrl: null
    },
    prixMoyen: {
      v: 250000, disp: '250\u00A0000\u00A0\u20AC', note: 'SDES \u00B7 ECLN T2 2025',
      src: 'SDES, Enqu\u00EAte ECLN T2 2025 : prix moyen appartement neuf 4\u00A0953\u00A0\u20AC/m\u00B2 \u00D7 ~50\u00A0m\u00B2 \u2248 250\u00A0000\u00A0\u20AC.',
      srcUrl: 'https://www.statistiques.developpement-durable.gouv.fr/commercialisation-des-logements-neufs-vente-aux-particuliers-au-2e-trimestre-2025'
    },
    honoraires: {
      v: 5, disp: '5\u00A0%', note: 'FNAIM \u00B7 honoraires agences',
      src: 'FNAIM \u2014 honoraires moyens des agences : 4 \u00E0 6\u00A0% du prix de vente.',
      srcUrl: 'https://www.fnaim.fr'
    },
    partReversee: {
      v: 80, disp: '80\u00A0%', note: 'R\u00E9seaux mandataires',
      src: 'Donn\u00E9es r\u00E9seaux \u2014 reversement 70\u00A0% \u00E0 99\u00A0% des honoraires selon le r\u00E9seau et le palier de commissions.',
      srcUrl: null
    },
    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
    },
    tempsAvantCompromis: {
      v: 20, disp: '20\u00A0h', note: 'Hypoth\u00E8se de calcul',
      src: 'Hypoth\u00E8se \u2014 temps moyen investi par vente annul\u00E9e : prospection, visites, suivi, relances, remise en march\u00E9.',
      srcUrl: null
    },
    reductionAnnulations: {
      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
    }
  };

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

  /* ---- Tween ---- */
  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 + '%)' };
  }

  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_EURO   = 'M12 2a10 10 0 100 20 10 10 0 000-20zM8 12h8M8 9h5.5a3.5 3.5 0 010 7H8';
  var D_CLOCK  = 'M12 22a10 10 0 100-20 10 10 0 000 20zM12 6v6l4 2';
  var D_TREND  = 'M23 6l-9.5 9.5-5-5L1 18M17 6h6v6';

  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');
  }

  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 })
    );
  }

  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
    );
  }

  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')
          )
    );
  }

  function BkRow(p) {
    var pct = p.total > 0 ? (p.value / p.total) * 100 : 0;
    return h('div', { className: 'row ' + p.cls },
      h('div', { className: 'l' }, h('span', null, p.label), h('b', null, h(AnimNum, { value: p.value }), '\u00A0\u20AC')),
      h('div', { className: 'track' }, h('i', { style: { width: pct.toFixed(1) + '%' } }))
    );
  }

  /* ---- Boîte tarification Keria ---- */
  function PricingBox(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'
        )
      )
    );
  }

  /* ---- Carte impact personnel ---- */
  function ImpactCard(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)
    );
  }

  /* ===== Composant principal ===== */
  function SimMandataires() {
    var _ve = useState(12),    ventes               = _ve[0], setVentes              = _ve[1];
    var _pm = useState(250000),prixMoyen            = _pm[0], setPrixMoyen           = _pm[1];
    var _ho = useState(5),     honoraires           = _ho[0], setHonoraires          = _ho[1];
    var _pr = useState(80),    partReversee         = _pr[0], setPartReversee        = _pr[1];
    var _ta = useState(10),    tauxAnnulation       = _ta[0], setTauxAnnulation      = _ta[1];
    var _pf = useState(50),    partFinancement      = _pf[0], setPartFinancement     = _pf[1];
    var _tp = useState(20),    tempsAvantCompromis  = _tp[0], setTempsAvantCompromis = _tp[1];
    var _ra = useState(50),    reductionAnnulations = _ra[0], setReductionAnnulations= _ra[1];
    var _dc = useState(7),     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 eVe = unknowns.ventes              ? SECT.ventes.v              : ventes;
    var ePm = unknowns.prixMoyen           ? SECT.prixMoyen.v           : prixMoyen;
    var eHo = unknowns.honoraires          ? SECT.honoraires.v          : honoraires;
    var ePr = unknowns.partReversee        ? SECT.partReversee.v        : partReversee;
    var eTa = unknowns.tauxAnnulation      ? SECT.tauxAnnulation.v      : tauxAnnulation;
    var ePf = unknowns.partFinancement     ? SECT.partFinancement.v     : partFinancement;
    var eTp = unknowns.tempsAvantCompromis ? SECT.tempsAvantCompromis.v : tempsAvantCompromis;
    var eRa = unknowns.reductionAnnulations? SECT.reductionAnnulations.v: reductionAnnulations;

    /* ---- Calcul principal ---- */
    var commissionBrute  = ePm * (eHo / 100);
    var commissionNette  = commissionBrute * (ePr / 100);
    var ventesAnnulees   = eVe * (eTa / 100);
    var ventesPerdues    = ventesAnnulees * (ePf / 100);
    var revenuPerdu      = ventesPerdues * commissionNette;
    var heuresPerdues    = ventesPerdues * eTp;
    var revenuMensuel    = eVe > 0 ? (eVe * commissionNette) / 12 : 0;
    var moisEquivalent   = revenuMensuel > 0 ? revenuPerdu / revenuMensuel : 0;

    /* ---- Avec Keria ---- */
    var ventesEvitees    = ventesPerdues * (eRa / 100);
    var revenuRecupere   = ventesEvitees * commissionNette;
    var revenuApres      = revenuPerdu - revenuRecupere;
    var apresPct         = revenuPerdu > 0 ? (revenuApres / revenuPerdu) * 100 : 0;

    /* ---- Tarification attestations ---- */
    var nbAttestations   = Math.round(eVe * (1 + eTa / 100)); /* total compromis ≈ attestations */
    var coutBrut         = nbAttestations * ATTESTATION_PRIX;
    var creditCourtage   = dossiersCourtage * ATTESTATION_CREDIT;
    var coutNet          = Math.max(0, coutBrut - creditCourtage);
    var isGratuit        = creditCourtage >= coutBrut;
    var roi              = coutNet > 0 ? revenuRecupere / coutNet : 0;

    /* ---- Impact personnel ---- */
    var ventesEquiv      = commissionNette > 0 ? revenuRecupere / commissionNette : 0;
    var semainesRevenu   = revenuMensuel > 0 ? revenuRecupere / (revenuMensuel / 4.33) : 0;
    var heuresEco        = ventesEvitees * eTp;

    function reset() {
      setReductionAnnulations(50);
      setDossiersCourtage(Math.round(eVe * 0.6) || 7);
      setUnknowns(function (p) { var n = Object.assign({}, p); delete n.reductionAnnulations; 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 = 'Ventes/an : ' + eVe
        + ' · Commission nette/vente : ' + Math.round(commissionNette).toLocaleString('fr-FR') + ' €'
        + ' · Taux d’annulation : ' + eTa + ' %'
        + ' · Part financement : ' + ePf + ' %'
        + ' · Revenu annuel perdu : ' + Math.round(revenuPerdu).toLocaleString('fr-FR') + ' €'
        + ' · Réduction visée Keria : ' + eRa + ' %'
        + ' · Revenu récupéré estimé : ' + Math.round(revenuRecupere).toLocaleString('fr-FR') + ' €'
        + ' · ROI : ' + (Math.round(roi * 10) / 10) + '×';
      var fields = {
        email: email,
        simulateur_type: 'Mandataires',
        simulation_cout_actuel: String(Math.round(revenuPerdu)),
        simulation_gain_keria: String(Math.round(revenuRecupere)),
        simulation_details: details,
        source_provenance: 'simulateur-mandataires',
        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-mandataires', fields); }
      try {
        if (window.KeriaAnalytics && window.KeriaAnalytics.track) {
          window.KeriaAnalytics.track('keria_sim_result', {
            simulator: 'mandataires',
            cout_actuel_bucket: analyticsBucket(Math.round(revenuPerdu)),
            gain_keria_bucket: analyticsBucket(Math.round(revenuRecupere))
          });
        }
      } catch (_) {}
      try { if (window.plausible) window.plausible('sim_mandataires_lead', { props: { revenu: Math.round(revenuPerdu) } }); } catch (_) {}
    }

    /* ---- Étape 1 ---- */
    var step1 = h('div', { className: 'dsim-step' },
      h('div', { className: 'dsim-step-head' }, h('span', { className: 'n' }, '1'), h('h3', null, 'Votre activit\u00E9'), h('span', { className: 'cap' }, 'Revenus')),
      h(Slider, { id: 'md-ve', label: 'Ventes r\u00E9alis\u00E9es\u00A0/ an',
        min: 0, max: 50, step: 1, value: ventes, onChange: setVentes,
        display: nf0(ventes) + '\u00A0ventes', scale: ['0', '50'],
        unknown: unknowns.ventes, onToggleUnknown: function () { toggleUnk('ventes'); }, sect: SECT.ventes }),
      h(Money, { id: 'md-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: 'md-ho', label: 'Honoraires moyens',
        min: 2, max: 8, step: 0.5, value: honoraires, onChange: setHonoraires,
        display: nf1(honoraires) + '\u00A0%', scale: ['2\u00A0%', '8\u00A0%'],
        unknown: unknowns.honoraires, onToggleUnknown: function () { toggleUnk('honoraires'); }, sect: SECT.honoraires }),
      h(Slider, { id: 'md-pr', label: 'Part des honoraires revers\u00E9e',
        min: 50, max: 100, step: 1, value: partReversee, onChange: setPartReversee,
        display: partReversee + '\u00A0%', scale: ['50\u00A0%', '100\u00A0%'],
        hint: 'Les r\u00E9seaux reversent g\u00E9n\u00E9ralement entre 70\u00A0% et 99\u00A0% des honoraires.',
        unknown: unknowns.partReversee, onToggleUnknown: function () { toggleUnk('partReversee'); }, sect: SECT.partReversee })
    );

    /* ---- Étape 2 ---- */
    var step2 = h('div', { className: 'dsim-step' },
      h('div', { className: 'dsim-step-head' }, h('span', { className: 'n' }, '2'), h('h3', null, 'Ventes perdues'), h('span', { className: 'cap' }, 'Financement')),
      h(Slider, { id: 'md-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: 'md-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, 'Impact temps'), h('span', { className: 'cap' }, 'Op\u00E9rationnel')),
      h(Slider, { id: 'md-tp', label: 'Heures investies par vente perdue',
        min: 5, max: 50, step: 5, value: tempsAvantCompromis, onChange: setTempsAvantCompromis,
        display: tempsAvantCompromis + '\u00A0h', scale: ['5\u00A0h', '50\u00A0h'],
        unknown: unknowns.tempsAvantCompromis, onToggleUnknown: function () { toggleUnk('tempsAvantCompromis'); }, sect: SECT.tempsAvantCompromis })
    );

    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.')
      )
    );

    /* ---- Carte résultat ---- */
    var nbVentesPerdues = Math.round(ventesPerdues);
    var result = h('div', { className: 'dsim-result dsim-in', style: { animationDelay: '.09s' } },
      h('span', { className: 'tag' }, 'Votre revenu annuel perdu'),
      h('div', { className: 'dsim-total' }, h(AnimNum, { value: revenuPerdu }), h('em', null, '\u00A0\u20AC')),
      h('p', { className: 'sub' }, 'Commissions non encaiss\u00E9es \u00E0 cause des acqu\u00E9reurs insuffisamment qualifi\u00E9s.'),
      h('div', { className: 'dsim-bk' },
        h(BkRow, { cls: 'dsim-c-decote',  label: 'Commissions perdues',     value: revenuPerdu,  total: revenuPerdu }),
        h(BkRow, { cls: 'dsim-c-portage', label: 'Heures de travail (\u00D7 commission)', value: heuresPerdues * (commissionNette / Math.max(1, eTp)), total: revenuPerdu })
      ),
      h('div', { className: 'dsim-foot' },
        h('div', { className: 'f' },
          h('div', { className: 'n' }, h(AnimNum, { value: nbVentesPerdues })),
          h('div', { className: 'l' }, 'Ventes perdues\u00A0/ an')
        ),
        h('div', { className: 'f' },
          h('div', { className: 'n' }, h(AnimNum, { value: heuresPerdues }), h('span', { className: 'eu' }, '\u00A0h')),
          h('div', { className: 'l' }, 'Heures perdues')
        ),
        h('div', { className: 'f' },
          h('div', { className: 'n' }, h(AnimNum, { value: moisEquivalent }), h('span', { className: 'eu' }, '\u00A0mois')),
          h('div', { className: 'l' }, 'De revenus perdus')
        )
      ),
      h('form', { className: 'lc' + (sent ? ' is-sent' : ''), onSubmit: submit, noValidate: true },
        h('label', { className: 'lc-label', htmlFor: 'md-email' }, 'Recevez votre simulation compl\u00E8te \u2014 r\u00E9ponse Keria sous 24\u00A0h'),
        h('div', { className: 'lc-row' },
          h('input', { type: 'email', id: 'md-email', name: 'email', autoComplete: 'email',
            placeholder: 'vous@mandataire.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: 'mandataires.html' }, 'Retour \u00E0 la page mandataires\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, 'S\u00E9curisez davantage de ventes,\u00A0', h('span', { className: 'serif-i gold' }, 'sans abonnement'), '.'),
          h('p', { className: 'lead' }, 'Keria facture 30\u00A0\u20AC par attestation de finan\u00E7abilit\u00E9. Chaque dossier de courtage valid\u00E9 via Keria offre 10\u00A0attestations\u00A0\u2014 soit 300\u00A0\u20AC de cr\u00E9dit.')
        ),

        /* Hypothèses */
        h('div', { className: 'dsim-impact' },
          h('div', { className: 'dsim-hyp', style: { gridTemplateColumns: '1fr 1fr auto' } },
            h('div', { className: 'hfield' },
              h('div', { className: 'top' },
                h('label', { htmlFor: 'md-ra' }, 'R\u00E9duction des annulations financi\u00E8res avec Keria'),
                h('div', { className: 'dsim-top-right' },
                  h(UnkToggle, { active: !!unknowns.reductionAnnulations, onClick: function () { toggleUnk('reductionAnnulations'); }, dark: true }),
                  !unknowns.reductionAnnulations ? h('span', { className: 'val' }, eRa + '\u00A0%') : null
                )
              ),
              unknowns.reductionAnnulations ? h(SectVal, { sect: SECT.reductionAnnulations, dark: true })
                : h('input', { className: 'range', type: 'range', id: 'md-ra', min: 0, max: 100, step: 5, value: eRa,
                    style: fillTrack(eRa, 0, 100, true),
                    onChange: function (e) { setReductionAnnulations(parseFloat(e.target.value)); } })
            ),
            h('div', { className: 'hfield' },
              h('div', { className: 'top' },
                h('label', { htmlFor: 'md-dc' }, 'Dossiers courtage Keria valid\u00E9s\u00A0/\u00A0an'),
                h('span', { className: 'val' }, nf0(dossiersCourtage))
              ),
              h('input', { className: 'range', type: 'range', id: 'md-dc', min: 0, max: Math.max(1, Math.round(eVe)), step: 1, value: dossiersCourtage,
                style: fillTrack(dossiersCourtage, 0, Math.max(1, Math.round(eVe)), 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\u00E9init.')
            )
          )
        ),

        /* Boîte tarification */
        h(PricingBox, { nb: nbAttestations, dossiers: dossiersCourtage, brut: coutBrut, credit: creditCourtage }),

        /* Barres + gain */
        h('div', { className: 'dsim-payoff' },
          h('div', { className: 'dsim-compare' },
            h('div', { className: 'dsim-bar avant' },
              h('div', { className: 'amt' }, h(AnimNum, { value: revenuPerdu }), '\u00A0\u20AC'),
              h('div', { className: 'track' }, h('div', { className: 'col', style: { height: '100%' } })),
              h('div', { className: 'cap' }, 'Avant Keria', h('span', { className: 'capn' }, eTa + '\u00A0% d\u2019annulation'))
            ),
            h('div', { className: 'dsim-bar apres' },
              h('div', { className: 'amt' }, h(AnimNum, { value: revenuApres }), '\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' }, eRa + '\u00A0% annulations \u00E9vit\u00E9es'))
            )
          ),
          h('div', null,
            h('div', { className: 'dsim-gain' },
              h('span', { className: 'tag' }, 'Revenu r\u00E9cup\u00E9r\u00E9 estim\u00E9'),
              h('div', { className: 'big' }, '+', h(AnimNum, { value: revenuRecupere }), '\u00A0\u20AC'),
              h('p', null, 'De commissions s\u00E9curis\u00E9es 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, '\u00D7')),
              h('div', { className: 'rt' },
                h('b', null, 'ROI estim\u00E9'),
                h('p', null, 'Pour 1\u00A0\u20AC investi dans Keria, vous pourriez s\u00E9curiser jusqu\u2019\u00E0\u00A0',
                  h('b', { style: { display: 'inline', color: 'var(--cobalt-bright)' } }, nf0(roi) + '\u00A0\u20AC'),
                  '\u00A0de commissions.')
              )
            ) : h('div', { className: 'dsim-roi' },
              h('div', { className: 'x', style: { color: 'var(--green)' } }, '\u221E'),
              h('div', { className: 'rt' },
                h('b', null, 'Keria est couvert'),
                h('p', null, 'Le cr\u00E9dit des dossiers de courtage couvre enti\u00E8rement le co\u00FBt des attestations. Keria est effectivement gratuit pour vous.')
              )
            )
          )
        ),

        h('p', { className: 'dsim-disclaimer' },
          h(Ico, { d: D_INFO }),
          h('span', null, '30\u00A0\u20AC par attestation de finan\u00E7abilit\u00E9. 10\u00A0attestations offertes par dossier de courtage valid\u00E9 (= 300\u00A0\u20AC de cr\u00E9dit). Indicatif, sans valeur contractuelle.')
        )
      )
    );

    /* ---- Section impact personnel ---- */
    var impactPersonnel = h('section', { className: 'section', id: 'impact-personnel', style: { background: 'var(--cream,#f9f7f3)' } },
      h('div', { className: 'wrap-wide' },
        h('div', { className: 'section-head center' },
          h('span', { className: 'eyebrow' }, 'Impact personnel'),
          h('h2', null, h(AnimNum, { value: revenuRecupere }), '\u00A0\u20AC r\u00E9cup\u00E9r\u00E9s, c\u2019est\u00A0', h('span', { className: 'serif-i' }, 'concr\u00E8tement'), '\u2026'),
          h('p', { className: 'lead' }, 'Transformez ce chiffre en r\u00E9alit\u00E9 quotidienne.')
        ),
        h('div', { className: 'dsim-kpi-grid' },
          h(ImpactCard, { ico: D_TREND,  value: ventesEquiv,   unit: '',         label: 'Ventes suppl\u00E9mentaires',       sub: 'L\u2019\u00E9quivalent de ventes s\u00E9curis\u00E9es suppl\u00E9mentaires chaque ann\u00E9e' }),
          h(ImpactCard, { ico: D_CLOCK,  value: semainesRevenu, unit: '\u00A0sem.', label: 'Semaines de revenu',              sub: 'R\u00E9cup\u00E9r\u00E9es chaque ann\u00E9e sur des commissions aujourd\u2019hui perdues' }),
          h(ImpactCard, { ico: D_EURO,   value: commissionNette, unit: '\u00A0\u20AC', label: 'Commission\u00A0/ vente',       sub: 'Votre commission nette par vente — chaque vente sauvegard\u00E9e a cette valeur' }),
          h(ImpactCard, { ico: D_ARROW,  value: heuresEco,     unit: '\u00A0h',   label: 'Heures de prospection \u00E9conomis\u00E9es', sub: 'Temps r\u00E9invest\u00ED dans de nouvelles opportunit\u00E9s' })
        )
      )
    );

    /* ---- 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 activit\u00E9'),
          h('h2', { style: { position: 'relative', zIndex: 2 } }, 'S\u00E9curisez davantage de ventes.'),
          h('p', { className: 'lead', style: { position: 'relative', zIndex: 2, margin: '0 auto 32px' } },
            'D\u00E9couvrez comment Keria v\u00E9rifie la finan\u00E7abilit\u00E9 r\u00E9elle de vos acqu\u00E9reurs avant l\u2019offre d\u2019achat. 30\u00A0\u20AC par attestation, couvert par le courtage.'),
          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-mandataire.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 revenu 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 — revenu perdu aujourd’hui et commissions récupérables 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 Mandataires'),
            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-mandataires-root');
  if (mount) ReactDOM.createRoot(mount).render(h(SimMandataires));
})();
