// ============================================================
// Monarch — Simulateurs M&A : Cession de titres (abattements) ·
// Cession de fonds de commerce · Droits d'enregistrement
// Requiert window.MSC (simcore.jsx) et window.__mscShared (simulators2.jsx).
// AUCUN schéma : uniquement jauges, barres et chiffres.
// ============================================================

(function () {
  const { useState, useEffect } = React;
  const M = window.MSC;
  const { C, SERIF, BODY, IS, fmt, pct, CountEuro, injectCore, useReveal,
    Eyebrow, Label, MoneyInput, Toggle, Shell, InputsCard, Doctrine, Alert, CTAEmail, Gauge, ProsCons } = M;
  function shared() { return window.__mscShared; }

  // ---------- barre comparée ----------
  function Bar({ label, sub, value, base, run, color, good, segments }) {
    return (
      <div>
        <div style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline", marginBottom: 10, flexWrap: "wrap", gap: 8 }}>
          <span style={{ fontFamily: BODY, fontSize: 13, color: good ? C.sauge : C.ardoise, letterSpacing: "0.1em", textTransform: "uppercase", fontWeight: 600 }}>{label}</span>
          <CountEuro value={value} run={run} style={{ fontFamily: SERIF, fontSize: "clamp(22px,2.6vw,30px)", fontWeight: 500, color: color, letterSpacing: "-0.01em" }} />
        </div>
        <Gauge run={run} base={base} segments={segments} height={18} />
        {sub && <div style={{ fontFamily: BODY, fontSize: 13, color: C.gris, marginTop: 8 }}>{sub}</div>}
      </div>);
  }

  // =====================================================
  // 1. CESSION DE TITRES & ABATTEMENTS
  // =====================================================
  function SecuritiesGainAbatementSimulator() {
    useEffect(injectCore, []);
    const { ParamRecap, Panel, Synth } = shared();
    const [acq, setAcq] = useState(10000);
    const [cession, setCession] = useState(1500000);
    const [duree, setDuree] = useState("plus8");
    const [situation, setSituation] = useState("aucune");
    const [done, setDone] = useState(false);
    const [busy, setBusy] = useState(false);
    const reveal = useReveal(done, 250);

    const A = Math.max(0, Number(acq) || 0);
    const V = Math.max(0, Number(cession) || 0);
    const pv = Math.max(0, V - A);

    // Sphère privée
    const PS = 0.186;                 // prélèvements sociaux — jamais abattus
    const psTax = pv * PS;
    const pfu = pv * 0.314;           // Flat Tax (défaut)
    // Barème + abattement : IR (TMI 30%) sur assiette abattue, PS sur la totalité
    let abIR;
    if (situation === "retraite") abIR = Math.min(pv, 500000);
    else if (situation === "pme") abIR = pv * 0.85;
    else abIR = duree === "plus8" ? pv * 0.65 : (duree === "deux8" ? pv * 0.50 : 0);
    const irBase = Math.max(0, pv - abIR);
    const irBareme = irBase * 0.30;
    const baremeTotal = irBareme + psTax;
    const usesBareme = situation !== "aucune" && baremeTotal < pfu;
    const taxPrivee = usesBareme ? baremeTotal : pfu;
    const netPrivee = V - taxPrivee;

    // Holding — titres de participation
    const qpfc = pv * 0.12 * 0.25;   // ≈ 3 %
    const netHolding = V - qpfc;
    const gain = netHolding - netPrivee;
    const tauxEff = pv > 0 ? (qpfc / pv) * 100 : 0;

    const go = () => { setBusy(true); setDone(false); setTimeout(() => { setBusy(false); setDone(true); }, 700); };

    return (
      <Shell eyebrow="Cession & plus-values · Titres de société"
        title="Abattements personnels ou holding : la dichotomie fiscale."
        intro="Comparez la cession en nom propre (Flat Tax ou barème avec abattements) à la cession via une holding au régime des titres de participation.">
        {!done &&
          <InputsCard onCompute={go} computing={busy} label="Comparer les fiscalités">
            <div><Label>Prix d'acquisition / capital initial</Label><MoneyInput value={acq} onChange={setAcq} min={0} max={5000000} step={5000} /></div>
            <div><Label>Prix de cession</Label><MoneyInput value={cession} onChange={setCession} min={50000} max={50000000} step={50000} /></div>
            <div>
              <Label>Durée de détention</Label>
              <Toggle full options={[{ id: "moins2", label: "< 2 ans" }, { id: "deux8", label: "2 à 8 ans" }, { id: "plus8", label: "> 8 ans" }]} value={duree} onChange={setDuree} />
            </div>
            <div>
              <Label>Situation spécifique</Label>
              <div style={{ display: "flex", flexDirection: "column", gap: 8 }}>
                {[{ id: "aucune", label: "Aucune" }, { id: "retraite", label: "Départ à la retraite (150-0 D ter)" }, { id: "pme", label: "PME < 10 ans à l'acquisition" }].map((o) => {
                  const on = situation === o.id;
                  return <button key={o.id} onClick={() => setSituation(o.id)} style={{ textAlign: "left", fontFamily: BODY, fontSize: 14, fontWeight: on ? 600 : 500, color: on ? "#fff" : C.encre, background: on ? C.encre : C.blanc, border: `1px solid ${on ? C.encre : C.trait}`, padding: "11px 14px", cursor: "pointer", borderRadius: 2 }}>{o.label}</button>;
                })}
              </div>
            </div>
          </InputsCard>}

        {done &&
          <div style={{ marginTop: 36 }}>
            <ParamRecap items={[["Cession", fmt(V)], ["Plus-value", fmt(pv)], ["Détention", duree === "plus8" ? "> 8 ans" : duree === "deux8" ? "2-8 ans" : "< 2 ans"], ["Situation", situation === "retraite" ? "Retraite" : situation === "pme" ? "PME < 10 ans" : "Aucune"]]} onEdit={() => setDone(false)} />

            <div className="msc-grid2" style={{ marginTop: 16 }}>
              <Panel tone="light" eyebrow="Sphère privée" title="Imposition personnelle optimisée">
                <Bar label={usesBareme ? "Barème + abattement" : "Flat Tax (PFU)"} value={netPrivee} base={V} run={reveal} color={C.encre}
                  sub={usesBareme ? `Abattement IR de ${fmt(abIR)} appliqué` : "31,4 % sur la totalité de la plus-value"}
                  segments={[{ value: netPrivee, keep: true }, { value: taxPrivee }]} />
                <div style={{ marginTop: 18, padding: "14px 16px", background: C.albatre, border: `1px solid ${C.trait}` }}>
                  <div style={{ fontFamily: BODY, fontSize: 12, letterSpacing: "0.1em", textTransform: "uppercase", color: "#a23b3b", fontWeight: 600, marginBottom: 4 }}>Prélèvements sociaux incompressibles</div>
                  <div style={{ fontFamily: BODY, fontSize: 13, color: C.gris, lineHeight: 1.5 }}>
                    Les <b style={{ color: C.encre }}>{fmt(psTax)}</b> de prélèvements sociaux (18,6 %) <b>ne bénéficient d'aucun abattement</b> — ils amputent définitivement votre outil de travail.
                  </div>
                </div>
              </Panel>
              <Panel tone="dark" eyebrow="Ingénierie holding" title="Frottement confiné à ~3 %">
                <div style={{ fontFamily: BODY, fontSize: 12.5, color: "#9ea7a0", marginBottom: 6 }}>Conservé dans la holding pour réinvestir</div>
                <CountEuro value={netHolding} run={reveal} style={{ fontFamily: SERIF, fontSize: "clamp(32px,4.6vw,56px)", fontWeight: 500, color: "#fff", letterSpacing: "-0.01em", lineHeight: 1 }} />
                <div style={{ fontFamily: BODY, fontSize: 13, color: C.sauge, fontWeight: 600, marginTop: 10 }}>QPFC 12 % → taux effectif {tauxEff.toFixed(1).replace(".", ",")} %</div>
                <div style={{ fontFamily: BODY, fontSize: 13, color: "#9ea7a0", marginTop: 6, lineHeight: 1.6 }}>Régime mère-fille / titres de participation : la plus-value remonte quasiment sans friction.</div>
              </Panel>
            </div>

            <Synth reveal={reveal} value={gain} label="Capital supplémentaire préservé via la holding" sub="à objectif identique, par rapport à la meilleure imposition personnelle" />

            <Doctrine open={reveal} eyebrow="À retenir" title="Les abattements allègent l'impôt, la holding protège l'essentiel" accent={C.sauge}>
              <p style={{ margin: 0 }}>Les abattements personnels (retraite, durée) adoucissent la fiscalité mais <b style={{ color: "#fff" }}>détruisent définitivement une part de votre outil de travail</b> en prélèvements sociaux incompressibles. La structuration précoce via une holding sanctuarise jusqu'à 97 % du fruit de votre cession, vous offrant une puissance de réinvestissement ou de transmission décuplée — tout en verrouillant votre pouvoir via des actions de préférence, dans le respect de la prohibition des clauses léonines.</p>
            </Doctrine>

            <ProsCons open={reveal}
              pour={["Des abattements allègent l'impôt (départ en retraite, durée de détention).", "Vendre via une holding limite l'impôt à environ 3 %.", "Le capital reste disponible pour réinvestir."]}
              contre={["Les prélèvements sociaux (18,6 %) ne bénéficient d'aucun abattement.", "La voie holding suppose d'avoir structuré son groupe en amont.", "Sortir l'argent vers votre compte personnel sera taxé ensuite."]} />

            <CTAEmail />
          </div>}
      </Shell>);
  }

  // =====================================================
  // 2. CESSION DE FONDS DE COMMERCE
  // =====================================================
  function AssetSaleSimulator() {
    useEffect(injectCore, []);
    const { ParamRecap, Panel } = shared();
    const [origine, setOrigine] = useState(0);
    const [prix, setPrix] = useState(450000);
    const [done, setDone] = useState(false);
    const [busy, setBusy] = useState(false);
    const reveal = useReveal(done, 250);

    const O = Math.max(0, Number(origine) || 0);
    const P = Math.max(0, Number(prix) || 0);
    const pv = Math.max(0, P - O);

    // Exonération 238 quindecies — déterminée automatiquement par le prix
    const exoFraction = P <= 300000 ? 1 : (P >= 500000 ? 0 : (500000 - P) / 200000);
    const taxable = pv * (1 - exoFraction);
    const isTax = IS(taxable);
    const netSociete = P - isTax;
    // extraction
    const boni = netSociete * 0.314;
    const netPerso = netSociete - boni;

    const go = () => { setBusy(true); setDone(false); setTimeout(() => { setBusy(false); setDone(true); }, 700); };

    return (
      <Shell eyebrow="Cession & plus-values · Fonds de commerce"
        title="Vendre l'outil de travail — et ne pas piéger le cash dans la coquille."
        intro="L'exonération de la plus-value professionnelle (art. 238 quindecies) ne rend pas les liquidités personnellement disponibles. Mesurez le parcours réel du cash.">
        {!done &&
          <InputsCard onCompute={go} computing={busy} label="Tracer le parcours du cash">
            <div><Label>Valeur d'origine du fonds</Label><MoneyInput value={origine} onChange={setOrigine} min={0} max={10000000} step={10000} /></div>
            <div><Label>Prix de cession du fonds</Label><MoneyInput value={prix} onChange={setPrix} min={10000} max={20000000} step={10000} /></div>
          </InputsCard>}

        {done &&
          <div style={{ marginTop: 36 }}>
            <ParamRecap items={[["Origine", fmt(O)], ["Cession", fmt(P)], ["Plus-value", fmt(pv)], ["Exonération auto.", Math.round(exoFraction * 100) + " %"]]} onEdit={() => setDone(false)} />

            {/* Étape 1 */}
            <div style={{ marginTop: 16, border: `1px solid ${C.trait}`, background: C.blanc, padding: "clamp(22px,3vw,32px)" }}>
              <Eyebrow>Étape 1 · taxation de la société</Eyebrow>
              <h3 style={{ fontFamily: SERIF, fontSize: "clamp(20px,2.4vw,28px)", fontWeight: 500, letterSpacing: "-0.01em", margin: "10px 0 18px" }}>Net disponible dans la société</h3>
              <Bar label="Après impôt sur la plus-value" value={netSociete} base={P} run={reveal} color={C.encre} good
                sub={exoFraction >= 1 ? "Exonération totale (238 quindecies) — prix ≤ 300 k€" : exoFraction > 0 ? `Exonération partielle dégressive (${Math.round(exoFraction * 100)} %) — prix entre 300 et 500 k€` : `Au-delà de 500 k€, plus-value taxée à l'IS : ${fmt(isTax)}`}
                segments={[{ value: netSociete, keep: true, good: true }, { value: P - netSociete }]} />
            </div>

            {/* Étape 2 — l'extraction, toujours calculée */}
            <div style={{ marginTop: 16, border: `1px solid ${C.trait}`, background: C.blanc, padding: "clamp(22px,3vw,32px)" }}>
              <Eyebrow>Étape 2 · extraction vers votre patrimoine personnel</Eyebrow>
              <h3 style={{ fontFamily: SERIF, fontSize: "clamp(20px,2.4vw,28px)", fontWeight: 500, letterSpacing: "-0.01em", margin: "10px 0 18px" }}>Net réellement dans votre poche</h3>
              <Bar label="Après extraction (boni / dividendes 31,4 %)" value={netPerso} base={P} run={reveal} color={C.encre}
                sub={`Sur ${fmt(netSociete)} disponibles dans la société, l'extraction coûte ${fmt(boni)} (31,4 %).`}
                segments={[{ value: netPerso, keep: true }, { value: P - netPerso }]} />
              <p style={{ fontFamily: BODY, fontSize: 13, color: C.gris, lineHeight: 1.6, margin: "14px 0 0" }}>L'exonération profite à la société, pas à vous : sans structuration, vous reperdez {fmt(boni)} pour récupérer le cash personnellement.</p>
            </div>

            {/* Solution */}
            <Doctrine open={reveal} eyebrow="La solution Monarch" title="Conservez la coquille" accent={C.sauge}>
              <p style={{ margin: 0 }}>Une fois le fonds vendu, la société — gorgée de liquidités — n'est pas liquidée mais <b style={{ color: "#fff" }}>transformée en société civile ou holding d'investissement</b>. Le capital se réinvestit en franchise d'impôt personnel (immobilier, titres, private equity), au lieu d'être amputé une seconde fois à la sortie. Le cash travaille pour vous, dans votre structure.</p>
            </Doctrine>

            <ProsCons open={reveal}
              pour={["Des exonérations existent selon la valeur du fonds et votre situation.", "La société, devenue holding, peut réinvestir le cash sans nouvel impôt.", "Évite de liquider la société et d'être taxé une seconde fois."]}
              contre={["L'exonération profite à la société, pas directement à vous.", "Sortir l'argent personnellement coûte à nouveau 31,4 %.", "Demande d'anticiper la réutilisation de la société après la vente."]} />

            <CTAEmail />
          </div>}
      </Shell>);
  }

  // =====================================================
  // 3. DROITS D'ENREGISTREMENT (DMTO)
  // =====================================================
  function TransferTaxSimulator() {
    useEffect(injectCore, []);
    const { ParamRecap } = shared();
    const [montant, setMontant] = useState(1000000);
    const [done, setDone] = useState(false);
    const [busy, setBusy] = useState(false);
    const reveal = useReveal(done, 250);

    const V = Math.max(0, Number(montant) || 0);
    // Fonds de commerce : 0% <23k, 3% 23k-200k, 5% >200k
    const fonds = (() => {
      let t = 0;
      t += Math.max(0, Math.min(V, 200000) - 23000) * 0.03;
      t += Math.max(0, V - 200000) * 0.05;
      return Math.max(0, t);
    })();
    // Parts SARL : 3% après abattement 23k
    const sarl = Math.max(0, (V - 23000) * 0.03);
    // Actions SAS : 0,1%
    const sas = V * 0.001;
    const maxT = Math.max(fonds, sarl, sas, 1);
    const economie = fonds - sas;

    const go = () => { setBusy(true); setDone(false); setTimeout(() => { setBusy(false); setDone(true); }, 700); };

    const Row = ({ label, sub, tax }) => (
      <div style={{ marginBottom: 22 }}>
        <div style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline", marginBottom: 8, flexWrap: "wrap", gap: 8 }}>
          <span style={{ fontFamily: BODY, fontSize: 13, color: C.ardoise, letterSpacing: "0.08em", textTransform: "uppercase", fontWeight: 600 }}>{label}</span>
          <CountEuro value={tax} run={reveal} style={{ fontFamily: SERIF, fontSize: "clamp(22px,2.8vw,32px)", fontWeight: 500, color: C.encre, letterSpacing: "-0.01em" }} />
        </div>
        <div style={{ position: "relative", height: 16, background: C.albatre, border: `1px solid ${C.trait}`, overflow: "hidden" }}>
          <div style={{ height: "100%", width: reveal ? pct(tax, maxT) + "%" : 0, transition: "width 1.1s cubic-bezier(.2,.7,.3,1)", backgroundColor: "rgba(91,124,153,.12)", backgroundImage: "repeating-linear-gradient(135deg, rgba(91,124,153,.45) 0, rgba(91,124,153,.45) 1.5px, transparent 1.5px, transparent 6px)" }} />
        </div>
        <div style={{ fontFamily: BODY, fontSize: 12.5, color: C.gris, marginTop: 7 }}>{sub}</div>
      </div>);

    return (
      <Shell eyebrow="Cession & plus-values · Droits d'enregistrement"
        title="La forme juridique de votre société est un argument de prix."
        intro="Les droits de mutation supportés par l'acquéreur varient du simple au quarantuple selon la structure cédée. C'est un levier de négociation.">
        {!done &&
          <InputsCard onCompute={go} computing={busy} label="Comparer les droits">
            <div style={{ gridColumn: "1 / -1" }}><Label>Montant de l'opération (valorisation)</Label><MoneyInput value={montant} onChange={setMontant} min={50000} max={50000000} step={50000} /></div>
          </InputsCard>}

        {done &&
          <div style={{ marginTop: 36 }}>
            <ParamRecap items={[["Valorisation", fmt(V)]]} onEdit={() => setDone(false)} />
            <div style={{ marginTop: 16, border: `1px solid ${C.trait}`, background: C.blanc, padding: "clamp(22px,3vw,32px)" }}>
              <Eyebrow>Frottement à la charge de l'acquéreur</Eyebrow>
              <h3 style={{ fontFamily: SERIF, fontSize: "clamp(20px,2.4vw,28px)", fontWeight: 500, letterSpacing: "-0.01em", margin: "10px 0 22px" }}>Trois structures, trois coûts d'acquisition</h3>
              <Row label="Cession de fonds de commerce" sub="Barème progressif : 0 % < 23 k€ · 3 % jusqu'à 200 k€ · 5 % au-delà" tax={fonds} />
              <Row label="Cession de parts de SARL" sub="3 % après abattement de 23 000 €" tax={sarl} />
              <Row label="Cession d'actions de SAS" sub="Taux fixe de 0,1 %" tax={sas} />
            </div>

            <div className={"msc-soft" + (reveal ? " on" : "")} style={{ transitionDelay: ".2s", marginTop: 22, border: `1px solid ${C.trait}`, background: C.albatre, padding: "clamp(22px,3vw,32px)", display: "flex", alignItems: "center", justifyContent: "space-between", gap: 30, flexWrap: "wrap" }}>
              <div style={{ fontFamily: BODY, fontSize: 14, color: C.gris, lineHeight: 1.5, maxWidth: "32em" }}>Passer d'une cession de fonds (ou de parts SARL) à une cession d'actions de SAS efface, pour votre acquéreur :</div>
              <div style={{ textAlign: "right" }}>
                <CountEuro value={economie > 0 ? economie : 0} run={reveal} style={{ fontFamily: SERIF, fontSize: "clamp(30px,4vw,48px)", fontWeight: 500, color: C.saugeF, letterSpacing: "-0.01em" }} />
                <div style={{ fontFamily: BODY, fontSize: 13, color: C.gris, marginTop: 2 }}>de droits d'enregistrement</div>
              </div>
            </div>

            <Doctrine open={reveal} eyebrow="Le levier stratégique" title="Une économie qui justifie un prix de vente net plus élevé" accent={C.sauge}>
              <p style={{ margin: 0 }}>La forme juridique de votre entreprise n'est pas qu'une question statutaire, c'est un argument de valorisation. Une <b style={{ color: "#fff" }}>transformation de SARL en SAS préalablement à la cession</b> permet d'effacer la quasi-totalité des droits d'enregistrement pour votre acquéreur — une économie qui justifie une révision à la hausse de votre prix de vente net. Le cabinet pilote cette transformation et sa temporalité.</p>
            </Doctrine>

            <ProsCons open={reveal}
              pour={["Vendre des actions de SAS coûte très peu de droits à l'acheteur (0,1 %).", "Un acheteur moins taxé accepte plus facilement votre prix.", "La transformation en SAS se prépare en amont de la vente."]}
              contre={["Transformer la société a un coût et doit être fait au bon moment.", "La SAS a ses propres règles (gouvernance, charges sociales du dirigeant).", "L'économie bénéficie surtout à l'acheteur : c'est un levier de négociation."]} />

            <CTAEmail />
          </div>}
      </Shell>);
  }

  window.SecuritiesGainAbatementSimulator = SecuritiesGainAbatementSimulator;
  window.AssetSaleSimulator = AssetSaleSimulator;
  window.TransferTaxSimulator = TransferTaxSimulator;
})();
