/* ============================================================
   EDUCARE — Cliente da IA (ÚNICO ponto de acesso)

   Todo o app fala com a IA por aqui. A chave da API NÃO existe no
   navegador: a chamada vai para a Edge Function "ia" do Supabase,
   que guarda a chave e monta os prompts no servidor.

   Uso:
     const laudo = await window.EducareIA.gerar("abc", payload);
     <window.IaBloco ... />                  // card pronto com botão
     window.EducareIA.texto(laudo, fallback) // achata para PDF/prontuário
   ============================================================ */
(function () {
  const Icon = window.Icon;

  const FUNCAO = "ia";

  /* Rótulos de todas as seções que as tarefas podem devolver.
     A ordem aqui é a ordem de exibição. */
  const SECOES = [
    ["sintese", "Síntese"],
    ["sintese_geral", "Síntese geral"],
    ["pontos_fortes", "Pontos fortes"],
    ["areas_consolidadas", "Áreas consolidadas (azul)"],
    ["areas_em_desenvolvimento", "Áreas em desenvolvimento (verde)"],
    ["pontos_atencao", "Pontos de atenção"],
    ["areas_a_desenvolver", "Áreas a desenvolver (vermelho)"],
    ["interpretacao", "Interpretação"],
    ["implicacoes_alfabetizacao", "Implicações para a alfabetização"],
    ["recomendacoes", "Recomendações"],
    ["plano_de_trabalho", "Como trabalhar para melhorar"],
    ["observacao", "Observação"],
    ["explicacao_familia", "Para a família"],
  ];

  /* ---------------- chamada ---------------- */

  function configurada() { return !!window.sb; }

  async function gerar(task, payload) {
    if (!window.sb) throw new Error("Supabase não configurado neste dispositivo.");

    const { data: sessao } = await window.sb.auth.getSession();
    if (!sessao || !sessao.session) {
      throw new Error("Sessão expirada. Entre novamente para usar a IA.");
    }

    const { data, error } = await window.sb.functions.invoke(FUNCAO, {
      body: { task, payload },
    });

    if (error) {
      // O supabase-js só traz mensagens genéricas em inglês. A mensagem útil
      // vem no corpo da resposta, em { erro } — montado pela Edge Function.
      console.error("[EducareIA]", task, error);

      let msg = error.name === "FunctionsFetchError"
        ? "A IA não está publicada neste ambiente. Fale com o administrador."
        : "Não foi possível falar com a IA. Tente novamente.";

      if (error.context && typeof error.context.json === "function") {
        try {
          const corpo = await error.context.json();
          if (corpo && corpo.erro) msg = corpo.erro;
        } catch (e) { /* corpo não-JSON: mantém a mensagem acima */ }
      }
      throw new Error(msg);
    }

    if (!data || !data.resultado) throw new Error("A IA não retornou resultado.");
    return data.resultado;
  }

  /* ---------------- achatar para texto corrido ----------------
     Usado no campo "note" do prontuário e nos PDFs, que são texto puro. */
  function texto(report, fallback) {
    if (!report) return fallback || "";
    const partes = [];
    SECOES.forEach(([chave, rotulo]) => {
      const v = report[chave];
      if (v == null) return;
      if (Array.isArray(v)) {
        if (!v.length) return;
        partes.push(`${rotulo}: ${v.join(" ")}`);
      } else if (String(v).trim()) {
        partes.push(chave === "sintese" || chave === "sintese_geral"
          ? String(v).trim()
          : `${rotulo}: ${String(v).trim()}`);
      }
    });
    return partes.join(" ");
  }

  /* ---------------- render das seções ----------------
     Duas partes: a "Análise clínica" (todas as seções técnicas) e a
     "Explicação para a família" (o campo explicacao_familia), em linguagem
     simples e num bloco próprio. */
  const temValor = (v) => Array.isArray(v) ? v.length > 0 : (v != null && String(v).trim() !== "");
  function LaudoIA({ report }) {
    const clinicas = SECOES.filter(([c]) => c !== "explicacao_familia");
    const temClinica = clinicas.some(([c]) => temValor(report[c]));
    const familia = report.explicacao_familia;
    return (
      <>
        {temClinica && <div style={{ fontSize: 11, fontWeight: 800, letterSpacing: ".05em", textTransform: "uppercase", color: "var(--text-3)", margin: "6px 0 8px" }}>Análise clínica</div>}
        {clinicas.map(([chave, rotulo]) => {
          const v = report[chave];
          if (!temValor(v)) return null;
          return (
            <div className="kv" key={chave} style={{ marginBottom: 12 }}>
              <div className="k">{rotulo}</div>
              {Array.isArray(v)
                ? <ul style={{ margin: "4px 0 0", paddingLeft: 18 }}>
                    {v.map((x, i) => (
                      <li key={i} style={{ fontSize: 13.5, lineHeight: 1.55, marginBottom: 4 }}>{x}</li>
                    ))}
                  </ul>
                : <div style={{ fontSize: 13.5, lineHeight: 1.55 }}>{v}</div>}
            </div>
          );
        })}

        {temValor(familia) && (
          <div style={{ marginTop: 14, background: "var(--primary-soft)", border: "1px solid var(--primary)", borderRadius: 12, padding: "12px 14px" }}>
            <div style={{ display: "flex", alignItems: "center", gap: 7, color: "var(--primary)", fontWeight: 800, fontSize: 12.5, marginBottom: 6 }}>
              <Icon name="heart" size={15} /> Explicação para a família <span style={{ fontWeight: 600, color: "var(--text-3)", textTransform: "none" }}>(linguagem simples)</span>
            </div>
            <div style={{ fontSize: 14, lineHeight: 1.6 }}>{familia}</div>
          </div>
        )}
      </>
    );
  }

  /* ---------------- card completo (botão + resultado) ----------------
     Props:
       report   objeto devolvido pela IA, ou null
       fallback texto das regras locais (mostrado enquanto não há IA)
       busy     bool
       erro     string
       onGerar  função
       titulo   opcional
       nota     opcional (rodapé) */
  function IaBloco({ report, fallback, busy, erro, onGerar, titulo, nota }) {
    const disponivel = configurada();
    return (
      <div className="plan-goal" style={{ marginTop: 12 }}>
        <div className="k" style={{ display: "flex", alignItems: "center", gap: 7, flexWrap: "wrap" }}>
          <span style={{ display: "flex", alignItems: "center", gap: 7 }}>
            <Icon name="sparkles" size={14} /> {titulo || "ANÁLISE EDUCARE IA"}
          </span>
          {disponivel && (
            <button
              type="button"
              className="btn btn-ghost btn-xs"
              style={{ marginLeft: "auto" }}
              onClick={onGerar}
              disabled={busy}
            >
              <Icon name="sparkles" size={13} />
              {busy ? "Gerando…" : (report ? "Gerar novamente" : "Gerar análise com IA")}
            </button>
          )}
        </div>

        {report ? <LaudoIA report={report} /> : <p>{fallback}</p>}

        {erro && (
          <p className="form-err" role="alert" style={{ display: "flex", alignItems: "center", gap: 7, color: "#EF4444", fontWeight: 700, fontSize: 13, margin: "8px 0 0" }}>
            <Icon name="x" size={14} /> {erro}
          </p>
        )}

        <p style={{ fontSize: 12, color: "var(--text-3)", marginTop: 8 }}>
          {nota || "Interpretação automática de apoio — não substitui o julgamento clínico."}
          {!report && disponivel && " Sem IA, o texto acima vem das regras locais do instrumento."}
        </p>
      </div>
    );
  }

  window.EducareIA = { gerar, texto, configurada, SECOES };
  window.LaudoIA = LaudoIA;
  window.IaBloco = IaBloco;
})();
