/* Raportul credintelor cu motor "profiluri" - structura pe sectiunile din docurile 4
   ("Structura rezultatului automat"): validitate / rezultat global / distributie /
   harta ariilor (+ harta celor 50 de indicatori la formatul A) / alerte / resurse /
   decodificare. Formatul B (Recunostinta, Smerenia) = 50 seturi; formatul A (Iubirea,
   Grija, Iertarea) = 150 seturi per-actiune. Scoringul vine din anamneza_scoring_plus.js;
   decodificarile structurate stau in banca.decodificarePlus. Bunatatea NU trece pe aici.
   Frazele meta din decodificari (banca..note) NU se afiseaza (decizia Marian 24.07). */
(function () {
  "use strict";

  function rasp(store, cred, m) {
    return (store.anamneza && store.anamneza[cred] && store.anamneza[cred][m]) || {};
  }
  function numeScala(banca, n) {
    var s = banca.scale[n - 1];
    return s ? s.nume : "?";
  }
  function eNoua(banca) {
    return banca && banca.motor === "profiluri";
  }

  /* formularea verdictului global - textele din docurile 4, adaptate la nume */
  function verdictGlobal(banca, rez) {
    var p = rez.profil;
    if (banca.format === "A") {
      if (p.tip === "clar") {
        return numeScala(banca, p.dominant) + ". Rezultatul global este clar și validat: " +
          "punctajul, distribuția alegerilor și harta ariilor indică aceeași direcție de dezvoltare.";
      }
      if (p.tip === "tranzitie") {
        var bazaA = "Tranziție globală de la " + numeScala(banca, p.jos) + " spre " + numeScala(banca, p.sus);
        if (p.echilibrata) return bazaA + " - tranziție echilibrată între cele două stadii.";
        return bazaA + ", cu predominanța " + numeScala(banca, p.predominant) + ".";
      }
      if (p.tip === "polarizat" || p.tip === "mixt-polarizat") {
        return "Profil global mixt și polarizat: punctajul global rămâne orientativ - nu se " +
          "atribuie o singură etichetă finală. Comportamentele negative și resursele pozitive " +
          "se raportează separat.";
      }
      if (p.tip === "heterogen") {
        return (p.puternicHeterogen
          ? "Profil puternic heterogen: minimum patru arii se află la două sau mai multe niveluri distanță de stadiul global - "
          : "Profil heterogen: manifestarea diferă semnificativ între ariile vieții - ") +
          "harta ariilor și a indicatorilor devine rezultatul principal.";
      }
      return "Profil global mixt sau heterogen: nu se atribuie o singură etichetă finală - " +
        "harta ariilor și a indicatorilor devine rezultatul principal.";
    }
    var R = banca.regulaVerdict !== "S";
    if (p.tip === "coerent" || p.tip === "clar") {
      return R
        ? numeScala(banca, p.dominant) + " - profil global coerent."
        : "Rezultat clar și validat: " + numeScala(banca, p.dominant) +
          ". Punctajul global, distribuția alegerilor și rezultatele ariilor indică aceeași direcție de dezvoltare.";
    }
    if (p.tip === "tranzitie") {
      var baza = "Tranziție de la " + numeScala(banca, p.jos) + " spre " + numeScala(banca, p.sus);
      if (p.echilibrata) return baza + " - tranziție globală echilibrată între cele două stadii.";
      return baza + ", cu predominanța " + numeScala(banca, p.predominant) + ".";
    }
    if (p.tip === "polarizat" || p.tip === "mixt-polarizat") {
      return "Profil " + (p.tip === "polarizat" ? "global polarizat" : "mixt și polarizat") +
        ": manifestarea diferă radical între indicatori sau între ariile vieții. " +
        "Comportamentele negative primesc prioritate de intervenție.";
    }
    if (p.tip === "heterogen") {
      return "Profil heterogen: manifestarea diferă semnificativ între ariile vieții - " +
        "harta celor zece arii este mai relevantă decât eticheta globală.";
    }
    return "Profil global mixt: nu se atribuie un singur stadiu final - " +
      "harta celor zece arii devine rezultatul principal.";
  }

  function verdictArie(banca, a) {
    var p = a.profil;
    if (p.tip === "coerent" || p.tip === "clar") return numeScala(banca, p.dominant) + " - " + (p.tip === "clar" ? "rezultat clar" : "profil coerent");
    if (p.tip === "tranzitie") return "Tranziție " + numeScala(banca, p.jos) + " → " + numeScala(banca, p.sus);
    if (p.tip === "polarizat") return "Profil polarizat";
    if (p.tip === "mixt-polarizat") return "Mixt și polarizat";
    if (p.tip === "neuniform") return "Neuniform - se citește pe indicatori";
    return "Profil mixt";
  }

  var SECTIUNI_DEC = [
    ["definitie", "Definirea stadiului"],
    ["stadiu", "Stadiul curent de dezvoltare"],
    ["cauze", "Cauzele instalării stadiului"],
    ["programe", "Programele care stau la baza stadiului"],
    ["impactPersonal", "Impactul asupra vieții personale"],
    ["impactJur", "Impactul asupra celor din jur"],
    ["directii", "Direcții concrete de reconstrucție sau consolidare"],
  ];

  function Decodificare(props) {
    var banca = props.banca;
    var nivel = props.nivel;
    var titluMic = props.titluMic;
    var doarManifestari = props.doarManifestari;
    var d = (banca.decodificarePlus || {})[String(nivel)];
    if (!d || d.lipsaSursa) {
      return (
        <div className="panel-sect" style={{ marginTop: 10 }}>
          <p className="sect-label">Decodificarea stadiului {numeScala(banca, nivel)}</p>
          <p className="small muted" style={{ margin: 0 }}>
            Decodificarea acestui stadiu este în pregătire la Dr. Petre - se activează imediat ce sosește.
          </p>
        </div>
      );
    }
    var sectiuni = doarManifestari ? [SECTIUNI_DEC[0], SECTIUNI_DEC[1]] : SECTIUNI_DEC;
    return (
      <div className="panel-sect" style={{ marginTop: 10 }}>
        <p className="sect-label">{titluMic || ("Decodificarea stadiului: " + numeScala(banca, nivel))}</p>
        {sectiuni.map(function (sd) {
          var cheie = sd[0], titlu = sd[1];
          if (cheie === "definitie") {
            return d.definitie ? (
              <div key={cheie} style={{ marginBottom: 10 }}>
                <p style={{ fontWeight: 600, margin: "0 0 4px" }}>{titlu}</p>
                <p className="small" style={{ margin: 0 }}>{d.definitie}</p>
              </div>
            ) : null;
          }
          var iteme = d[cheie] || [];
          if (!iteme.length) return null;
          return (
            <div key={cheie} style={{ marginBottom: 10 }}>
              <p style={{ fontWeight: 600, margin: "0 0 4px" }}>{titlu}</p>
              {iteme.map(function (it, i) {
                return (
                  <p key={i} className="small" style={{ margin: "0 0 4px" }}>
                    {it.titlu ? <b>{it.titlu}{it.text ? ": " : ""}</b> : null}
                    {it.text}
                  </p>
                );
              })}
            </div>
          );
        })}
      </div>
    );
  }

  function Bara(props) {
    var pct = props.pct;
    return (
      <div className="anm-bar" style={{ flex: 1 }}>
        <i style={{ width: Math.min(100, pct) + "%", background: props.culoare }} />
      </div>
    );
  }

  function ListaAlerte(props) {
    var titlu = props.titlu, randuri = props.randuri, banca = props.banca;
    if (!randuri.length) return null;
    return (
      <div style={{ marginTop: 8 }}>
        <p style={{ fontWeight: 600, margin: "0 0 4px" }}>{titlu} ({randuri.length})</p>
        {randuri.map(function (r) {
          var aria = banca.arii[r.aria - 1];
          return (
            <p key={r.gind} className="small" style={{ margin: "0 0 4px" }}>
              <b>{aria ? aria.nume : "Aria " + r.aria}</b> · Ind. {r.ind}
              {r.act ? " · Acț. " + r.act : ""}: {r.text}
            </p>
          );
        })}
      </div>
    );
  }

  /* eticheta scurta a profilului unui indicator (formatul A) */
  function profilIndicatorTxt(banca, p) {
    if (p.tip === "clar") return "Clar: " + numeScala(banca, p.dominant);
    if (p.tip === "tranzitie") return "Tranziție " + numeScala(banca, p.jos) + " → " + numeScala(banca, p.sus);
    if (p.tip === "polarizat") return "Polarizat";
    return "Neuniform";
  }

  function RezultatPlus(props) {
    var banca = props.banca, cred = props.cred, m = props.m, store = props.store;
    var r = rasp(store, cred, m);
    var rez = window.AnamnezaPlusScoring.rezultat(banca, r);
    var titlu = (m === "p1" ? "Rezultatul măsurării P1" : "Rezultatul măsurării P2");

    if (!rez.valid) {
      return (
        <div className="panel">
          <p className="sect-label">{titlu}</p>
          <p className="small muted">{rez.motiv}</p>
          <button className="btn btn-primary btn-sm" onClick={props.spreChestionar}>Deschide chestionarul</button>
        </div>
      );
    }

    var eA = banca.format === "A";
    var maxG = eA ? 900 : 300;
    var totalAlegeri = eA ? 150 : 50;
    var maxArie = eA ? 90 : 30;
    var p = rez.profil;
    var decodificari;
    if (p.tip === "coerent" || p.tip === "clar") {
      decodificari = <Decodificare banca={banca} nivel={p.dominant} />;
    } else if (p.tip === "tranzitie") {
      decodificari = (
        <div>
          <Decodificare banca={banca} nivel={p.jos} />
          <Decodificare banca={banca} nivel={p.sus} doarManifestari={true}
            titluMic={"Manifestările stadiului superior: " + numeScala(banca, p.sus)} />
        </div>
      );
    } else if (p.tip === "polarizat" || p.tip === "mixt-polarizat") {
      var negDom = rez.distributie.slice(0, 3).indexOf(Math.max(rez.distributie[0], rez.distributie[1], rez.distributie[2])) + 1;
      var pozDom = 4 + rez.distributie.slice(3).indexOf(Math.max(rez.distributie[3], rez.distributie[4], rez.distributie[5]));
      decodificari = (
        <div>
          <Decodificare banca={banca} nivel={negDom} titluMic={"Polul negativ dominant: " + numeScala(banca, negDom)} doarManifestari={true} />
          <Decodificare banca={banca} nivel={pozDom} titluMic={"Polul pozitiv dominant: " + numeScala(banca, pozDom)} doarManifestari={true} />
        </div>
      );
    } else {
      decodificari = (
        <div className="panel-sect" style={{ marginTop: 10 }}>
          <p className="small muted" style={{ margin: 0 }}>
            Nu se atribuie o decodificare globală unică - rezultatul se citește pe harta celor zece arii și pe indicatori.
          </p>
        </div>
      );
    }

    return (
      <div className="panel">
        <p className="sect-label">{titlu} - {banca.titlu}</p>

        {/* 1+2. validitate + rezultat global */}
        <div className="row" style={{ gap: 16, flexWrap: "wrap", alignItems: "baseline" }}>
          <span className="chip">Valid tehnic</span>
          <span>Scor global <b>{rez.scorGlobal}</b> / {maxG}</span>
          <span>Media <b>{rez.medie.toFixed(2)}</b></span>
          <span>Stadiul matematic <b>{numeScala(banca, rez.stadiuMat)}</b></span>
        </div>
        <div className="anm-verdict" style={{ marginTop: 10 }}>
          <b>Verdict.</b> {verdictGlobal(banca, rez)}
        </div>

        {/* 3. distributia celor sase scale */}
        <p className="sect-label" style={{ marginTop: 14 }}>Distribuția celor {totalAlegeri} de alegeri</p>
        {banca.scale.map(function (sc) {
          var n = rez.distributie[sc.num - 1];
          return (
            <div key={sc.num} className="row" style={{ gap: 8, alignItems: "center", marginBottom: 4 }}>
              <span className="small" style={{ minWidth: 210 }}>{sc.nume}</span>
              <Bara pct={(n / totalAlegeri) * 100} culoare={sc.culoare} />
              <span className="small" style={{ minWidth: 70 }}>{n} · {Math.round((n / totalAlegeri) * 100)}%</span>
            </div>
          );
        })}

        {/* 4. harta celor zece arii */}
        <p className="sect-label" style={{ marginTop: 14 }}>Harta celor zece arii</p>
        <div style={{ overflowX: "auto" }}>
          <table className="tbl">
            <thead>
              <tr><th>Aria</th><th>Scor / {maxArie}</th><th>Media</th><th>Stadiul matematic</th><th>Profilul ariei</th></tr>
            </thead>
            <tbody>
              {rez.arii.map(function (a) {
                return (
                  <tr key={a.idx}>
                    <td>{a.nume}</td>
                    <td style={{ textAlign: "center", fontWeight: 700 }}>{a.scor}</td>
                    <td style={{ textAlign: "center" }}>{a.medie.toFixed(2)}</td>
                    <td>{numeScala(banca, a.stadiuMat)}</td>
                    <td>{verdictArie(banca, a)}</td>
                  </tr>
                );
              })}
            </tbody>
          </table>
        </div>

        {/* 4b. harta celor 50 de indicatori (doar formatul A - ceruta de doc 4) */}
        {eA ? (
          <div>
            <p className="sect-label" style={{ marginTop: 14 }}>Harta celor 50 de indicatori</p>
            <div style={{ overflowX: "auto" }}>
              <table className="tbl">
                <thead>
                  <tr><th>Aria</th><th>Indicatorul</th><th>Scor / 18</th><th>Stadiul matematic</th><th>Profilul</th></tr>
                </thead>
                <tbody>
                  {rez.arii.map(function (a) {
                    return a.indicatori.map(function (ind, k) {
                      return (
                        <tr key={a.idx + "-" + ind.ind}>
                          {k === 0 ? <td rowSpan={a.indicatori.length} style={{ verticalAlign: "top", fontWeight: 600 }}>{a.nume}</td> : null}
                          <td>{ind.ind}. {ind.nume}</td>
                          <td style={{ textAlign: "center", fontWeight: 700 }}>{ind.scor}</td>
                          <td>{numeScala(banca, ind.stadiuMat)}</td>
                          <td>{profilIndicatorTxt(banca, ind.profil)}</td>
                        </tr>
                      );
                    });
                  })}
                </tbody>
              </table>
            </div>
          </div>
        ) : null}

        {/* 5. alertele comportamentale */}
        {(rez.alerte.critice.length || rez.alerte.majore.length || rez.alerte.vulnerabilitati.length) ? (
          <div>
            <p className="sect-label" style={{ marginTop: 14 }}>Alertele comportamentale (independente de scor)</p>
            <ListaAlerte titlu={"Alerte critice - " + numeScala(banca, 1)} randuri={rez.alerte.critice} banca={banca} />
            <ListaAlerte titlu={"Alerte majore - " + numeScala(banca, 2)} randuri={rez.alerte.majore} banca={banca} />
            <ListaAlerte titlu={"Vulnerabilități - " + numeScala(banca, 3)} randuri={rez.alerte.vulnerabilitati} banca={banca} />
          </div>
        ) : (
          <p className="small muted" style={{ marginTop: 14 }}>Nicio alertă comportamentală - nicio selecție pe polul negativ.</p>
        )}

        {/* 6. resursele pozitive */}
        <p className="sect-label" style={{ marginTop: 14 }}>Resursele dezvoltate</p>
        <div className="row" style={{ gap: 16, flexWrap: "wrap" }}>
          <span className="chip">{numeScala(banca, 4)}: {rez.resurse.p1}</span>
          <span className="chip">{numeScala(banca, 5)}: {rez.resurse.p2}</span>
          <span className="chip">{numeScala(banca, 6)}: {rez.resurse.p3}</span>
        </div>

        {/* 7. decodificarea activata de profil */}
        <p className="sect-label" style={{ marginTop: 14 }}>Decodificarea</p>
        {decodificari}

        <div className="row" style={{ gap: 8, marginTop: 14 }}>
          <button className="btn btn-ghost btn-sm" onClick={props.onInapoi}>{"←"} Înapoi</button>
          <button className="btn btn-ghost btn-sm" onClick={props.spreChestionar}>Deschide chestionarul</button>
        </div>
      </div>
    );
  }

  function EcranInPregatire(props) {
    return (
      <div className="panel empty">
        <div className="empty-title">{props.titlu}</div>
        <div className="small" style={{ maxWidth: 460 }}>
          Pentru {props.numeCredinta}, această secțiune se construiește pe mecanismul propriu al
          credinței - se activează într-o etapă următoare.
        </div>
        <button className="btn btn-ghost btn-sm" onClick={props.onInapoi}>{"←"} Înapoi</button>
      </div>
    );
  }

  window.AnamnezaPlus = {
    are: eNoua,
    Rezultat: RezultatPlus,
    InPregatire: EcranInPregatire,
    rezultatExport: function (banca, r) {
      var rez = window.AnamnezaPlusScoring.rezultat(banca, r);
      if (!rez.valid) return { valid: false, motiv: rez.motiv };
      return {
        valid: true, scorGlobal: rez.scorGlobal, medie: rez.medie,
        stadiuMat: rez.stadiuMat, stadiuNume: numeScala(banca, rez.stadiuMat),
        profil: rez.profil, verdict: verdictGlobal(banca, rez),
        distributie: rez.distributie,
        arii: rez.arii.map(function (a) {
          var rand = { idx: a.idx, nume: a.nume, scor: a.scor, stadiuMat: a.stadiuMat, profil: a.profil };
          if (a.indicatori) {
            rand.indicatori = a.indicatori.map(function (i) {
              return { ind: i.ind, nume: i.nume, scor: i.scor, stadiuMat: i.stadiuMat, profil: i.profil };
            });
          }
          return rand;
        }),
        alerte: rez.alerte, resurse: rez.resurse,
      };
    },
  };
})();
