/* ============================================================
   EDUCARE — ASRS-18 (Adult ADHD Self-Report Scale — OMS)
   Rastreio de TDAH em adultos. Parte A (6, com área sombreada) + Parte B (12, apoio).
   ============================================================ */
(function () {
  const { useState, useEffect } = React;
  const Icon = window.Icon;

  const ASRS_KEY = "educare-asrs-config";
  const LEVELS = ["Nunca", "Quase nunca", "De vez em quando", "Quase sempre", "Sempre"];

  const DEFAULT = {
    intro: "Responda às perguntas abaixo pensando em como você se sentiu e se comportou nos últimos 6 meses. Para cada pergunta, marque a frequência que melhor descreve você.",
    partA: [
      "Com que frequência você deixa um projeto pela metade depois de já ter feito as partes mais difíceis?",
      "Com que frequência você tem dificuldade para fazer um trabalho que exige organização?",
      "Com que frequência você tem dificuldade para lembrar de compromissos ou obrigações?",
      "Quando você precisa fazer algo que exige muita concentração, com que frequência você evita ou adia o início?",
      "Com que frequência você fica se mexendo na cadeira ou balançando as mãos ou os pés quando precisa ficar sentado(a) por muito tempo?",
      "Com que frequência você se sente ativo(a) demais e necessitando fazer coisas, como se estivesse “com um motor ligado”?",
    ],
    partB: [
      "Com que frequência você comete erros bobos por falta de atenção quando precisa trabalhar num projeto chato ou difícil?",
      "Com que frequência você tem dificuldade para manter a atenção quando está fazendo um trabalho chato ou repetitivo?",
      "Com que frequência você tem dificuldade para se concentrar no que as pessoas dizem, mesmo quando elas falam diretamente com você?",
      "Com que frequência você coloca as coisas fora do lugar ou tem dificuldade de encontrá-las em casa ou no trabalho?",
      "Com que frequência você se distrai com atividades ou barulho à sua volta?",
      "Com que frequência você se sente inquieto(a) ou agitado(a)?",
      "Com que frequência você tem dificuldade para sossegar e relaxar quando tem tempo livre?",
      "Com que frequência você se pega falando demais em situações sociais?",
      "Com que frequência você se levanta da cadeira em reuniões ou outras situações em que deveria ficar sentado(a)?",
      "Com que frequência você se pega terminando as frases das pessoas antes delas?",
      "Com que frequência você tem dificuldade para esperar nas situações em que cada um tem a sua vez?",
      "Com que frequência você interrompe os outros quando eles estão ocupados?",
    ],
  };

  const CRIT = [
    { k: "B", label: "B — Sintomas presentes antes dos 12 anos de idade." },
    { k: "C", label: "C — Prejuízo em 2 ou mais contextos (trabalho, social, família, estudos)." },
    { k: "D", label: "D — Prejuízo evidente na vida diária." },
    { k: "E", label: "E — Sintomas não explicados melhor por outro transtorno (depressão, ansiedade, etc.)." },
  ];
  const WARNING = "Este é um instrumento de rastreio, não um diagnóstico. O diagnóstico de TDAH só pode ser feito por profissional médico (psiquiatra, neurologista).";

  function loadConfig() {
    try { const s = JSON.parse(localStorage.getItem(ASRS_KEY) || "null"); if (s && Array.isArray(s.partA) && s.partA.length === 6 && Array.isArray(s.partB) && s.partB.length === 12) return s; } catch (e) { /* */ }
    return JSON.parse(JSON.stringify(DEFAULT));
  }
  function saveConfig(cfg) { try { localStorage.setItem(ASRS_KEY, JSON.stringify(cfg)); } catch (e) { /* */ } }

  // Área sombreada: A1-A3 contam com resposta >= "De vez em quando" (2); A4-A6 com >= "Quase sempre" (3).
  const isShadedCol = (qi, col) => (qi <= 2 ? col >= 2 : col >= 3);
  const countsShaded = (qi, ans) => ans != null && isShadedCol(qi, ans);
  function esc(s) { return String(s == null ? "" : s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"); }

  function buildAnalysis(aAns, bAns) {
    const freq = (v) => v != null && v >= 3; // Quase sempre / Sempre
    const aten = [aAns[0], aAns[1], aAns[2], aAns[3], bAns[0], bAns[1], bAns[2], bAns[3], bAns[4]].filter(freq).length;
    const hiper = [aAns[4], aAns[5], bAns[5], bAns[6], bAns[7], bAns[8], bAns[9], bAns[10], bAns[11]].filter(freq).length;
    let t = `Itens marcados como frequentes (“Quase sempre”/“Sempre”): ${aten} em desatenção e ${hiper} em hiperatividade/impulsividade.`;
    if (aten > hiper) t += " Predomínio de queixas de DESATENÇÃO.";
    else if (hiper > aten) t += " Predomínio de queixas de HIPERATIVIDADE/IMPULSIVIDADE.";
    else if (aten > 0) t += " Queixas equilibradas entre desatenção e hiperatividade/impulsividade.";
    else t += " Poucas queixas marcadas como frequentes.";
    return t;
  }

  /* ---------------- Imprimir teste em branco ---------------- */
  function printBlank(config) {
    const headCols = LEVELS.map((l) => `<th style="width:13%;font-size:10px">${esc(l)}</th>`).join("");
    const rows = (arr, part) => arr.map((q, i) => {
      const cells = LEVELS.map((_, col) => {
        const sh = part === "A" && isShadedCol(i, col);
        return `<td style="${sh ? "background:#c9c9c9" : ""}">&nbsp;</td>`;
      }).join("");
      return `<tr><td class="qn">${part}${i + 1}</td><td class="qt">${esc(q)}</td>${cells}</tr>`;
    }).join("");
    const html = `<!DOCTYPE html><html lang="pt-BR"><head><meta charset="UTF-8"><title>ASRS-18 — Autoteste de TDAH</title>
      <style>body{font-family:Arial,Helvetica,sans-serif;color:#000;padding:22px;font-size:11px}
      h1{font-size:15px;text-align:center;margin:0 0 4px}h2{font-size:12px;margin:16px 0 6px}
      .intro{margin:6px 0 10px}.meta{margin:6px 0}
      table{width:100%;border-collapse:collapse}th,td{border:1px solid #000;padding:5px 6px;text-align:center;vertical-align:middle}
      td.qt{text-align:left}td.qn{font-weight:bold;width:34px}</style></head><body>
      <h1>ASRS-18 — AUTOTESTE DE TDAH (ADULTOS) · OMS</h1>
      <div class="meta"><b>Nome:</b> ______________________________  <b>Data:</b> ____/____/______</div>
      <p class="intro">${esc(config.intro)}</p>
      <h2>Parte A</h2>
      <table><tr><th></th><th></th>${headCols}</tr>${rows(config.partA, "A")}</table>
      <p style="font-size:10px;color:#444">As células em cinza indicam a “área sombreada”: 4 ou mais marcações nessas células sugerem sintomas compatíveis com TDAH (investigação aprofundada).</p>
      <h2>Parte B</h2>
      <table><tr><th></th><th></th>${headCols}</tr>${rows(config.partB, "B")}</table>
      <p style="font-size:10px;color:#444">${esc(WARNING)}</p>
      </body></html>`;
    const w = window.open("", "_blank"); if (!w) { alert("Permita pop-ups para imprimir o teste."); return; }
    w.document.write(html); w.document.close(); w.focus(); setTimeout(() => { try { w.print(); } catch (e) { /* */ } }, 300);
  }

  /* ---------------- Editor ---------------- */
  function ConfigEditor({ config, onSave, onClose }) {
    const [c, setC] = useState(() => JSON.parse(JSON.stringify(config)));
    const setQ = (part, i, v) => setC((p) => ({ ...p, [part]: p[part].map((q, idx) => (idx === i ? v : q)) }));
    return (
      <div className="form-wrap">
        <button className="pt-back" onClick={onClose}><Icon name="chevL" size={16} /> Voltar</button>
        <div className="page-head"><div><h1>Gerenciar teste — ASRS-18</h1><p className="sub">Edite o texto introdutório e as questões. Fica salvo neste dispositivo.</p></div></div>
        <div className="form-card"><div className="sec-head">Introdução</div><div className="fld" style={{ marginBottom: 0 }}><textarea className="ctrl" value={c.intro} onChange={(e) => setC((p) => ({ ...p, intro: e.target.value }))}></textarea></div></div>
        <div className="form-card"><div className="sec-head">Parte A (6)</div>{c.partA.map((q, i) => <div className="fld" key={i} style={{ marginBottom: 8 }}><label>A{i + 1}</label><textarea className="ctrl" value={q} onChange={(e) => setQ("partA", i, e.target.value)}></textarea></div>)}</div>
        <div className="form-card"><div className="sec-head">Parte B (12)</div>{c.partB.map((q, i) => <div className="fld" key={i} style={{ marginBottom: 8 }}><label>B{i + 1}</label><textarea className="ctrl" value={q} onChange={(e) => setQ("partB", i, e.target.value)}></textarea></div>)}</div>
        <div className="save-bar"><button className="btn btn-primary" onClick={() => onSave(c)}><Icon name="clipboardCheck" size={18} /> Salvar</button></div>
        <div style={{ textAlign: "center", marginTop: 8 }}><button className="text-link" onClick={() => setC(JSON.parse(JSON.stringify(DEFAULT)))}>Restaurar padrão</button></div>
      </div>
    );
  }

  function Levels({ value, onChange }) {
    return (
      <div className="asrs-levels">
        {LEVELS.map((l, i) => (
          <button type="button" key={i} className={"asrs-lv" + (value === i ? " on" : "")} onClick={() => onChange(i)}>{l}</button>
        ))}
      </div>
    );
  }

  /* ---------------- Componente principal ---------------- */
  function AsrsTest({ onBack, onOpenPatient }) {
    const [config, setConfig] = useState(loadConfig);
    const [editing, setEditing] = useState(false);
    const [stage, setStage] = useState("menu"); // menu | form
    const [pid, setPid] = useState("");
    const [date, setDate] = useState(window.todayISO());
    const [aAns, setAAns] = useState(() => Array(6).fill(null));
    const [bAns, setBAns] = useState(() => Array(12).fill(null));
    const [crit, setCrit] = useState({ B: false, C: false, D: false, E: false });
    const [saved, setSaved] = useState(false);
    const [avalId, setAvalId] = useState(null);
    const [err, setErr] = useState("");
    const [ia, setIa] = useState(null);
    const [iaBusy, setIaBusy] = useState(false);
    const [iaErro, setIaErro] = useState("");

    if (editing) return <ConfigEditor config={config} onClose={() => setEditing(false)} onSave={(c) => { saveConfig(c); setConfig(c); setEditing(false); }} />;

    const patient = (window.PATIENTS || []).find((p) => p.id === pid);
    const shadedCount = aAns.reduce((s, ans, i) => s + (countsShaded(i, ans) ? 1 : 0), 0);
    const aDone = aAns.every((x) => x != null);
    const positive = shadedCount >= 4;
    const interp = positive
      ? "Sintomas altamente compatíveis com TDAH — investigação mais aprofundada recomendada."
      : "Rastreio negativo para os sintomas-núcleo.";
    const analysis = buildAnalysis(aAns, bAns);
    const freqB = config.partB.map((q, i) => ({ q, ans: bAns[i], i })).filter((x) => x.ans != null && x.ans >= 3);

    /* Payload da IA — respostas e contagens; só o primeiro nome. */
    function payloadIA() {
      return {
        primeiro_nome: patient ? String(patient.name).split(" ")[0] : "",
        data: date,
        contagem_area_sombreada: shadedCount,
        total_parte_a: 6,
        nota_de_corte: 4,
        rastreio: positive ? "compatível com TDAH" : "negativo",
        leitura_do_rastreio: interp,
        parte_a: config.partA.map((q, i) => ({
          item: "A" + (i + 1), questao: q,
          resposta: aAns[i] == null ? null : LEVELS[aAns[i]],
          conta_na_area_sombreada: countsShaded(i, aAns[i]),
        })),
        parte_b: config.partB.map((q, i) => ({
          item: "B" + (i + 1), questao: q,
          resposta: bAns[i] == null ? null : LEVELS[bAns[i]],
        })),
        criterios_de_apoio: CRIT.map((x) => ({ criterio: x.label, marcado: !!crit[x.k] })),
      };
    }
    async function gerarIA() {
      setIaBusy(true); setIaErro("");
      try { setIa(await window.EducareIA.gerar("asrs", payloadIA())); }
      catch (e) { setIaErro(e.message || "Falha ao gerar a análise."); }
      finally { setIaBusy(false); }
    }
    const analiseFinal = window.EducareIA.texto(ia, analysis);

    /* Conteúdo gravado no prontuário — usado ao salvar e ao ressincronizar
       depois que a IA responde. */
    function registro() {
      return {
        result: `${shadedCount}/6 · ${positive ? "Compatível" : "Negativo"}`,
        note: `${shadedCount}/6 na área sombreada. ${interp} ${analiseFinal}`,
        sheet: {
          kind: "asrs", shadedCount, positive, interp,
          partA: config.partA.map((q, i) => ({ q, ans: aAns[i] == null ? null : LEVELS[aAns[i]] })),
          partB: config.partB.map((q, i) => ({ q, ans: bAns[i] == null ? null : LEVELS[bAns[i]] })),
          crit, analysis: analiseFinal, ia,
        },
      };
    }

    function save() {
      const rec = window.addAvaliacao({ pid, name: "ASRS-18 — Rastreio de TDAH (adultos)", date, ...registro() });
      setAvalId(rec ? rec.id : null);
      setSaved(true);
    }

    /* Laudo gerado depois de salvar reescreve o registro já gravado. */
    useEffect(() => {
      if (!avalId || !ia) return;
      window.atualizarAvaliacao(avalId, registro());
    }, [ia, avalId]);
    function exportPDF() {
      const list = (arr, ans, part) => arr.map((q, i) => `<tr><td class="qn">${part}${i + 1}</td><td>${esc(q)}</td><td class="c">${ans[i] == null ? "—" : esc(LEVELS[ans[i]])}${part === "A" && countsShaded(i, ans[i]) ? " ◼" : ""}</td></tr>`).join("");
      const html = `<!DOCTYPE html><html lang="pt-BR"><head><meta charset="UTF-8"><title>ASRS-18 — ${esc(patient ? patient.name : "")}</title>
        <style>body{font-family:Arial,Helvetica,sans-serif;color:#142826;padding:24px;font-size:12px}h1{font-size:15px;text-align:center;margin:0 0 4px}h2{font-size:13px;background:#E9F0EE;padding:6px 8px;border-radius:6px;margin:16px 0 6px}.meta{margin:8px 0}.res{font-size:14px;margin:10px 0}table{width:100%;border-collapse:collapse}th,td{border:1px solid #B9C9C5;padding:5px 7px;text-align:left}td.c{text-align:center}td.qn{font-weight:bold;width:34px;text-align:center}.warn{margin-top:12px;padding:8px;border:1px solid #E0B; border-color:#d9a; background:#fdf3f3;font-size:11px}</style></head><body>
        <h1>ASRS-18 — RASTREIO DE TDAH (ADULTOS)</h1>
        <div class="meta"><b>Paciente:</b> ${esc(patient ? patient.name : "—")} &nbsp; <b>Data:</b> ${esc(date)}</div>
        <p class="res"><b>${shadedCount} de 6</b> na área sombreada (Parte A) — <b>${esc(interp)}</b></p>
        <h2>Parte A</h2><table><tr><th>#</th><th>Questão</th><th>Resposta</th></tr>${list(config.partA, aAns, "A")}</table>
        <h2>Parte B (apoio)</h2><table><tr><th>#</th><th>Questão</th><th>Resposta</th></tr>${list(config.partB, bAns, "B")}</table>
        <p><b>Parte B — itens frequentes (apoio qualitativo):</b> ${freqB.length ? freqB.map((x) => "B" + (x.i + 1)).join(", ") : "nenhum"}.</p>
        <p><b>Análise:</b> ${esc(analiseFinal)}</p>
        <h2>Critérios de apoio (não cobertos pelo ASRS)</h2>
        <table>${CRIT.map((x) => `<tr><td class="c">${crit[x.k] ? "☑" : "☐"}</td><td>${esc(x.label)}</td></tr>`).join("")}</table>
        <p class="warn">${esc(WARNING)}</p>
        </body></html>`;
      const w = window.open("", "_blank"); if (!w) { alert("Permita pop-ups para exportar o PDF."); return; }
      w.document.write(html); w.document.close(); w.focus(); setTimeout(() => { try { w.print(); } catch (e) { /* */ } }, 300);
    }

    return (
      <div className="form-wrap">
        <div className="hay-top">
          <button className="pt-back" onClick={onBack}><Icon name="chevL" size={16} /> Voltar para avaliações</button>
          <button className="btn btn-ghost btn-xs" onClick={() => setEditing(true)}><Icon name="fileText" size={14} /> Gerenciar teste</button>
        </div>
        <div className="page-head" style={{ marginBottom: 14 }}>
          <div><h1><Icon name="clipboardList" size={25} /> ASRS-18 — Rastreio de TDAH (adultos)</h1><p className="sub">Adult ADHD Self-Report Scale (OMS). Rastreio — não é diagnóstico.</p></div>
        </div>

        {stage === "menu" && (
          <div className="form-card">
            <p className="help-text" style={{ marginTop: 0 }}>{config.intro}</p>
            <div className="asrs-menu">
              <button className="cta-secondary" onClick={() => setStage("form")}><span className="ci"><Icon name="clipboardCheck" size={22} /></span><span className="ct"><b>Aplicar agora</b><span>O profissional lê e marca as respostas</span></span></button>
              <button className="cta-secondary" onClick={() => printBlank(config)}><span className="ci"><Icon name="download" size={22} /></span><span className="ct"><b>Imprimir teste</b><span>Gera o PDF em branco para aplicar no papel</span></span></button>
            </div>
          </div>
        )}

        {stage === "form" && (
          <>
            <div className="form-card">
              <div className="sec-head"><span className="si"><Icon name="users" size={18} /></span> Identificação</div>
              <div className="fld"><label>Paciente <span className="req">*</span></label><window.PatientPicker value={pid} onChange={setPid} /></div>
              <div className="fld" style={{ marginBottom: 0 }}><label>Data</label><input className="ctrl" type="date" value={date} onChange={(e) => setDate(e.target.value)} /></div>
            </div>

            <div className="form-card">
              <div className="sec-head">Parte A — rastreio principal</div>
              {config.partA.map((q, i) => (
                <div className="asrs-q" key={i}>
                  <div className="asrs-qt"><span className="hi-n">A{i + 1}</span> {q}</div>
                  <Levels value={aAns[i]} onChange={(v) => setAAns(aAns.map((x, idx) => (idx === i ? v : x)))} />
                  <div className="asrs-hint">Conta na área sombreada: {i <= 2 ? "“De vez em quando”, “Quase sempre” ou “Sempre”" : "“Quase sempre” ou “Sempre”"}.</div>
                </div>
              ))}
            </div>

            <div className="form-card">
              <div className="sec-head">Parte B — apoio</div>
              {config.partB.map((q, i) => (
                <div className="asrs-q" key={i}>
                  <div className="asrs-qt"><span className="hi-n">B{i + 1}</span> {q}</div>
                  <Levels value={bAns[i]} onChange={(v) => setBAns(bAns.map((x, idx) => (idx === i ? v : x)))} />
                </div>
              ))}
            </div>

            <div className="hay-scores">
              <div className="hsc"><span>Área sombreada (Parte A)</span><b>{shadedCount}/6</b><i>{aDone ? "" : "responda as 6"}</i></div>
              <div className="hsc"><span>Rastreio</span><b style={{ fontSize: 18, color: positive ? "#EF4444" : "var(--primary)" }}>{positive ? "Compatível" : "Negativo"}</b><i>≥ 4 = compatível</i></div>
            </div>

            <div className="plan-goal" style={{ marginTop: 14 }}>
              <div className="k">RESULTADO — PARTE A</div>
              <p><b>{shadedCount} de 6</b> na área sombreada. {interp}</p>
            </div>

            <div className="form-card">
              <div className="sec-head">Parte B — apoio qualitativo (sem nota de corte)</div>
              {freqB.length ? (
                <>
                  <p className="help-text" style={{ marginTop: 0 }}>{freqB.length} {freqB.length === 1 ? "item respondido" : "itens respondidos"} como “Quase sempre”/“Sempre”:</p>
                  <ul className="asrs-blist">
                    {freqB.map((x) => <li key={x.i}><span className="hi-n">B{x.i + 1}</span> {x.q} <b className="asrs-bans">{LEVELS[x.ans]}</b></li>)}
                  </ul>
                </>
              ) : (
                <p className="help-text" style={{ margin: 0 }}>Nenhum item da Parte B marcado como “Quase sempre”/“Sempre”.</p>
              )}
            </div>

            <div className="asrs-warn"><Icon name="help" size={18} /> {WARNING}</div>

            <div className="form-card">
              <div className="sec-head">Critérios de apoio (B–E) — não cobertos pelo ASRS</div>
              {CRIT.map((x) => (
                <label className="asrs-crit" key={x.k}><input type="checkbox" checked={crit[x.k]} onChange={(e) => setCrit({ ...crit, [x.k]: e.target.checked })} /> {x.label}</label>
              ))}
            </div>

            <window.IaBloco
              report={ia} fallback={analysis}
              busy={iaBusy} erro={iaErro} onGerar={gerarIA}
              nota="Interpretação automática de apoio. O ASRS é rastreio: não substitui avaliação diagnóstica por profissional habilitado."
            />

            {err && <p className="form-err" style={{ display: "flex", alignItems: "center", gap: 7, color: "#EF4444", fontWeight: 700, fontSize: 13.5 }}><Icon name="x" size={15} /> {err}</p>}
            {saved && <div className="save-ok"><span className="so-ic"><Icon name="clipboardCheck" size={18} stroke={2.6} /></span><div><b>Avaliação salva!</b><span>Vinculada ao prontuário{patient ? " de " + patient.name : ""}.</span></div></div>}

            <div className="asrs-actions">
              {!saved
                ? <button className="btn btn-primary" onClick={() => { if (!pid) { setErr("Selecione o paciente."); return; } if (!aDone) { setErr("Responda as 6 questões da Parte A."); return; } setErr(""); save(); }}><Icon name="clipboardCheck" size={18} /> Salvar no prontuário</button>
                : <button className="btn btn-primary" onClick={() => onOpenPatient && pid && onOpenPatient(pid)}><Icon name="users" size={18} /> Ver no prontuário</button>}
              <button className="btn btn-ghost" onClick={exportPDF}><Icon name="download" size={18} /> Exportar PDF</button>
              <button className="btn btn-ghost" onClick={() => printBlank(config)}><Icon name="download" size={18} /> Imprimir teste em branco</button>
            </div>
          </>
        )}
      </div>
    );
  }

  window.AsrsTest = AsrsTest;
})();
