/* ============================================================
   SYMPHO · K'IN — IA & control
   Copilot en vivo (Claude + RAG) · Automatización · Admin
   ============================================================ */

// ------------------------------------------------------------
//  K'IN COPILOT (PRD §12.7 / §15) — IA en vivo sobre datos del sitio
// ------------------------------------------------------------
const KIN_SYS = `Eres K'in Copilot, el asistente de inteligencia energética de la plataforma K'in (ecosistema Sympho). Respondes preguntas de negocio sobre UNA instalación industrial usando exclusivamente el contexto del sitio que se te da abajo (RAG).

Reglas de respuesta:
- Responde SIEMPRE en español, en tono profesional y claro, como un ingeniero energético senior.
- Sé conciso: máximo ~150 palabras. Sin encabezados markdown ni listas con asteriscos largas; usa frases y, si acaso, guiones simples.
- Fundamenta cada respuesta en los datos del contexto. Cita la fuente entre paréntesis al final, p. ej. (fuente: TD-Frío, calidad de energía) o (fuente: factura CFE mayo).
- Cuando propongas una recomendación, indica el ahorro estimado en MXN y un nivel de confianza en %.
- Si la pregunta es un "qué pasaría si", razona sobre el impacto en pico de demanda, costo y payback con los números del contexto.
- No inventes datos fuera del contexto. Si algo no está, dilo y sugiere qué módulo de K'in lo cubriría.

`;

// convierte **negritas** y limpia viñetas markdown en nodos React
function kinRich(text) {
  return String(text).split(/(\*\*[^*]+\*\*)/g).map((seg, i) =>
    seg.startsWith("**") && seg.endsWith("**")
      ? <b key={i} style={{ color: "var(--text)", fontWeight: 600 }}>{seg.slice(2, -2)}</b>
      : <React.Fragment key={i}>{seg}</React.Fragment>
  );
}

function KinCopilot({ role }) {
  const [msgs, setMsgs] = useState([
    { role: "ai", text: `Hola. Soy K'in Copilot para ${window.KIN_SITE.org} — ${window.KIN_SITE.site}. Tengo el estado en vivo de la planta: demanda, calidad de energía, tarifa CFE, DER y alertas. Pregúntame lo que quieras sobre el consumo, el costo o el riesgo del sitio.`, cite: "Digital Twin · telemetría en vivo" },
  ]);
  const [input, setInput] = useState("");
  const [busy, setBusy] = useState(false);
  const scrollRef = useRef(null);

  useEffect(() => {
    if (scrollRef.current) scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
  }, [msgs, busy]);

  const send = async (text) => {
    const q = (text != null ? text : input).trim();
    if (!q || busy) return;
    setInput("");
    const history = [...msgs, { role: "user", text: q }];
    setMsgs(history);
    setBusy(true);
    try {
      const apiMessages = [
        { role: "user", content: KIN_SYS + window.KIN_KB + "\n\n(A partir de aquí inicia la conversación con el usuario.)" },
        { role: "assistant", content: "Contexto del sitio cargado. Listo para responder sobre la Planta Celaya." },
        ...history.map(m => ({ role: m.role === "ai" ? "assistant" : "user", content: m.text })),
      ];
      const reply = await window.claude.complete({ messages: apiMessages });
      setMsgs(m => [...m, { role: "ai", text: (reply || "").trim() || "No pude generar una respuesta. Intenta reformular la pregunta." }]);
    } catch (e) {
      setMsgs(m => [...m, { role: "ai", text: "Hubo un problema al consultar el modelo. Verifica la conexión e intenta de nuevo. Mientras tanto, las recomendaciones priorizadas siguen disponibles en el panel derecho." }]);
    }
    setBusy(false);
  };

  const onKey = (e) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); send(); } };

  return (
    <div className="canvas-in wide rise kin" style={{ display: "flex", flexDirection: "column", minHeight: 0 }}>
      <KinHead role={role} title="K'in Copilot" sub="Pregunta de negocio en lenguaje natural · responde sobre los datos en vivo del sitio (RAG) y cita su fuente"
        right={<span className="badge" style={{ background: "var(--kin-dim)", color: "var(--kin)" }}><Icon name="sparkle" size={12} /> IA en vivo</span>} />
      <div className="grid-2" style={{ alignItems: "stretch", gridTemplateColumns: "minmax(0,1.5fr) minmax(0,1fr)", gap: 16 }}>
        {/* chat */}
        <div className="card" style={{ padding: 18, display: "flex", flexDirection: "column", height: "min(640px, 72vh)" }}>
          <div className="kin-chat">
            <div className="kin-chat-scroll" ref={scrollRef}>
              {msgs.map((m, i) => (
                <div key={i} className="kin-msg" data-role={m.role}>
                  <span className="kin-msg-av" data-role={m.role}><Icon name={m.role === "ai" ? "sparkle" : "users"} size={15} /></span>
                  <div>
                    <div className="kin-bubble">{kinRich(m.text)}</div>
                    {m.cite && <div className="kin-cite"><Icon name="link" size={12} /> {m.cite}</div>}
                  </div>
                </div>
              ))}
              {busy && (
                <div className="kin-msg" data-role="ai">
                  <span className="kin-msg-av" data-role="ai"><Icon name="sparkle" size={15} /></span>
                  <div className="kin-bubble thinking"><span className="kin-typing"><i /><i /><i /></span></div>
                </div>
              )}
            </div>
            {msgs.length <= 1 && (
              <div style={{ padding: "10px 2px" }}>
                <div className="kin-gauge-cap" style={{ marginBottom: 8 }}>Preguntas sugeridas</div>
                <div className="kin-chips">
                  {window.KIN_QUESTIONS.map((q, i) => (
                    <button key={i} className="kin-chip-q" onClick={() => send(q)}>{q}</button>
                  ))}
                </div>
              </div>
            )}
            <div className="kin-composer">
              <textarea value={input} onChange={e => setInput(e.target.value)} onKeyDown={onKey} rows={1}
                placeholder="Pregunta sobre el consumo, el costo o el riesgo de la planta…" disabled={busy} />
              <button className="kin-send" onClick={() => send()} disabled={busy || !input.trim()}><Icon name="send" size={18} /></button>
            </div>
          </div>
        </div>

        {/* recommendations + forecast */}
        <div style={{ display: "flex", flexDirection: "column", gap: 14, minWidth: 0 }}>
          <div className="card" style={{ padding: 18 }}>
            <Section title="Recomendaciones priorizadas" sub="Modo advisory · ordenadas por ahorro" style={{ marginBottom: 14 }} />
            <div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
              {window.KIN_RECS.slice(0, 3).map((r, i) => (
                <div key={i} className="kin-rec" style={{ padding: 14 }}>
                  <div style={{ display: "flex", justifyContent: "space-between", alignItems: "flex-start", gap: 10 }}>
                    <b style={{ fontSize: 13, lineHeight: 1.35 }}>{r.title}</b>
                    <span className="kin-level-tag" data-lvl={r.level}>{r.level === "Approval" ? "Aprobación" : r.level}</span>
                  </div>
                  <div style={{ display: "flex", alignItems: "baseline", gap: 8 }}>
                    <span className="kin-rec-impact" style={{ fontSize: 18 }}>{kinMoney(r.impact)}</span>
                    <span className="mono" style={{ fontSize: 10.5, color: "var(--text-4)" }}>{r.unit}</span>
                  </div>
                  <div className="kin-conf"><i style={{ width: (r.conf*100)+"%" }} /></div>
                  <div className="mono" style={{ fontSize: 10, color: "var(--text-4)" }}>{Math.round(r.conf*100)}% confianza · {r.type}</div>
                </div>
              ))}
            </div>
          </div>
          <div className="card" style={{ padding: 18 }}>
            <Section title="Pronóstico de costo" sub={`Cierre de mes estimado · ${Math.round(window.KIN_FORECAST.confidence*100)}% confianza`} style={{ marginBottom: 12 }} />
            <div className="disp" style={{ fontSize: 26, fontWeight: 600, color: "var(--kin)" }}>{kinMoney(window.KIN_FORECAST.monthEndMXN)}</div>
            <div className="mono" style={{ fontSize: 11, color: "var(--text-4)", marginTop: 4 }}>vs. ${ (window.KIN_LIVE.costMTD/1e6).toFixed(2)}M a la fecha</div>
          </div>
        </div>
      </div>
    </div>
  );
}

// ------------------------------------------------------------
//  MOTOR DE AUTOMATIZACIÓN (PRD §12.8 / §16)
// ------------------------------------------------------------
function KinAutomation({ role }) {
  const [tab, setTab] = useState("reglas");
  return (
    <div className="canvas-in wide rise kin">
      <KinHead role={role} title="Motor de automatización" sub="Reglas, escenarios y disparadores bajo el modelo de control de tres niveles con interlocks de seguridad"
        right={<div className="seg" style={{ marginRight: 8 }}>
          <button className="seg-btn" data-on={tab==="reglas"} onClick={() => setTab("reglas")}><Icon name="sliders" size={15} /> Reglas</button>
          <button className="seg-btn" data-on={tab==="builder"} onClick={() => setTab("builder")}><Icon name="flow" size={15} /> Constructor</button>
          <button className="seg-btn" data-on={tab==="bitacora"} onClick={() => setTab("bitacora")}><Icon name="doc" size={15} /> Bitácora</button>
        </div>} />

      {/* control de 3 niveles — siempre visible arriba */}
      <div className="grid-3" style={{ marginBottom: 16 }}>
        {window.KIN_CONTROL.map(c => (
          <div key={c.lvl} className="kin-ctrl">
            <div style={{ display: "flex", justifyContent: "space-between", alignItems: "flex-start" }}>
              <span className="kin-tile-ic"><Icon name={c.icon} size={16} /></span>
              <span className="kin-ctrl-num">{c.lvl}</span>
            </div>
            <b className="disp" style={{ fontSize: 15, display: "block", marginTop: 4 }}>{c.name}</b>
            <p className="muted" style={{ fontSize: 12, marginTop: 6, lineHeight: 1.5 }}>{c.sub}</p>
            <div className="mono" style={{ fontSize: 10.5, color: "var(--kin)", marginTop: 10 }}>{c.count} reglas en este nivel</div>
          </div>
        ))}
      </div>

      {tab === "reglas" && (
        <div className="card" style={{ padding: 0, overflow: "hidden" }}>
          <div className="card-head"><b style={{ fontSize: 14 }}>Reglas activas</b><button className="btn btn-sm btn-primary" style={{ background: "var(--kin)" }}><Icon name="plus" size={14} /> Nueva regla</button></div>
          <table className="tbl">
            <thead><tr><th>Regla</th><th>Disparador</th><th>Acción</th><th>Nivel</th><th>Ejecuciones</th><th>Estado</th></tr></thead>
            <tbody>
              {window.KIN_RULES.map((r, i) => (
                <tr key={i}>
                  <td style={{ color: "var(--text)", fontWeight: 500 }}>{r.name}</td>
                  <td className="muted" style={{ fontSize: 12 }}>{r.trigger}</td>
                  <td className="muted" style={{ fontSize: 12 }}>{r.action}</td>
                  <td><span className="kin-level-tag" data-lvl={r.level === "Autónomo" ? "Autónomo" : r.level}>{r.level}</span></td>
                  <td className="mono">{r.runs}</td>
                  <td><Pill status={r.status === "Activa" ? "Activo" : "Pausado"} /></td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      )}

      {tab === "builder" && <RuleBuilder />}

      {tab === "bitacora" && (
        <div className="card" style={{ padding: 0, overflow: "hidden" }}>
          <div className="card-head"><b style={{ fontSize: 14 }}>Bitácora de decisiones y acciones</b><span className="mono" style={{ fontSize: 11, color: "var(--text-4)" }}>auditable · inmutable</span></div>
          <table className="tbl">
            <thead><tr><th>Cuándo</th><th>Regla</th><th>Acción</th><th>Nivel</th><th>Resultado</th><th style={{ textAlign: "right" }}>Impacto</th></tr></thead>
            <tbody>
              {window.KIN_DECISIONS.map((d, i) => (
                <tr key={i}>
                  <td className="mono" style={{ fontSize: 12 }}>{d.when}</td>
                  <td style={{ color: "var(--text)", fontWeight: 500 }}>{d.rule}</td>
                  <td className="muted" style={{ fontSize: 12 }}>{d.action}</td>
                  <td><span className="kin-level-tag" data-lvl={d.level === "Autónomo" ? "Autónomo" : d.level}>{d.level}</span></td>
                  <td><Pill status={d.result === "Ejecutada" ? "Correcto" : d.result === "Pendiente" ? "Por aprobar" : "En proceso"} /></td>
                  <td className="num" style={{ color: "var(--ek)" }}>{d.saved}</td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      )}
    </div>
  );
}

function RuleBuilder() {
  return (
    <div className="grid-2" style={{ alignItems: "start", gridTemplateColumns: "minmax(0,1.2fr) minmax(0,1fr)" }}>
      <div className="card" style={{ padding: 22 }}>
        <Section title="Recorte de pico en punta" sub="Constructor visual · condición → acción" style={{ marginBottom: 18 }} />
        <div className="kin-flow">
          <div className="kin-flow-node" data-kind="trigger">
            <span className="kin-flow-ic" style={{ background: "var(--kin-dim)", color: "var(--kin)" }}><Icon name="flash" size={18} /></span>
            <div style={{ flex: 1 }}><div className="kin-gauge-cap">Disparador</div><b style={{ fontSize: 13.5 }}>Demanda &gt; 1650 kW en horario punta</b></div>
          </div>
          <div className="kin-flow-link" />
          <div className="kin-flow-node" data-kind="condition">
            <span className="kin-flow-ic" style={{ background: "var(--surface-3)", color: "var(--text-2)" }}><Icon name="filter" size={18} /></span>
            <div style={{ flex: 1 }}><div className="kin-gauge-cap">Condición</div><b style={{ fontSize: 13.5 }}>SoC batería &gt; 40% y reserva crítica protegida</b></div>
          </div>
          <div className="kin-flow-link" />
          <div className="kin-flow-node">
            <span className="kin-flow-ic" style={{ background: "var(--ek)", color: "oklch(0.16 0.02 264)" }}><Icon name="battery" size={18} /></span>
            <div style={{ flex: 1 }}><div className="kin-gauge-cap">Acción</div><b style={{ fontSize: 13.5 }}>Descargar BESS 110 kW</b></div>
          </div>
          <div className="kin-flow-link" />
          <div className="kin-flow-node">
            <span className="kin-flow-ic" style={{ background: "var(--zamna)", color: "oklch(0.16 0.02 264)" }}><Icon name="check" size={18} /></span>
            <div style={{ flex: 1 }}><div className="kin-gauge-cap">Aprobación</div><b style={{ fontSize: 13.5 }}>Esperar visto bueno del operador (Nivel 2)</b></div>
          </div>
        </div>
      </div>
      <div className="card" style={{ padding: 22 }}>
        <Section title="Configuración" style={{ marginBottom: 16 }} />
        <label className="lbl" style={{ marginTop: 0 }}>Nivel de control</label>
        <select className="field"><option>Nivel 2 · Aprobación requerida</option><option>Nivel 1 · Advisory</option><option>Nivel 3 · Autónomo con límites</option></select>
        <label className="lbl">Escenario</label>
        <select className="field"><option>Tarifa punta (19:00–21:00)</option><option>Falla de red CFE</option><option>Pico de proceso</option></select>
        <label className="lbl">Vigencia</label>
        <select className="field"><option>Lun–Vie · todo el año</option></select>
        <div style={{ marginTop: 16, padding: 13, borderRadius: 10, background: "color-mix(in oklch, var(--ek) 8%, transparent)", border: "1px solid color-mix(in oklch, var(--ek) 26%, transparent)" }}>
          <div style={{ display: "flex", gap: 8, alignItems: "center", fontSize: 12.5, color: "var(--text)" }}><Icon name="shield" size={15} style={{ color: "var(--ek)" }} /> Interlocks de seguridad activos</div>
          <p className="muted" style={{ fontSize: 11.5, marginTop: 6, lineHeight: 1.5 }}>Ninguna acción física se ejecuta sin autorización firmada. Límites duros (reserva de respaldo, cargas críticas) no se sobrepasan. Parada de emergencia disponible.</p>
        </div>
        <button className="btn btn-primary" style={{ width: "100%", justifyContent: "center", marginTop: 14, background: "var(--kin)" }}><Icon name="check" size={15} /> Activar regla</button>
      </div>
    </div>
  );
}

// ------------------------------------------------------------
//  ADMIN — Dispositivos / Conectores / RBAC (PRD §12.12)
// ------------------------------------------------------------
function KinDevices({ role }) {
  return (
    <div className="canvas-in wide rise kin">
      <KinHead role={role} title="Provisión de dispositivos" sub="Aprovisionar un dispositivo crea su gemelo en el Digital Twin"
        action={{ label: "Aprovisionar dispositivo", icon: "plus" }} />
      <div className="card" style={{ padding: 0, overflow: "hidden" }}>
        <table className="tbl">
          <thead><tr><th>ID</th><th>Dispositivo</th><th>Tipo</th><th>Protocolo</th><th>Nodo (gemelo)</th><th>Última lectura</th><th>Estado</th></tr></thead>
          <tbody>
            {window.KIN_DEVICES.map((d, i) => (
              <tr key={i}>
                <td className="mono" style={{ fontSize: 12, color: "var(--text)" }}>{d.id}</td>
                <td style={{ color: "var(--text)", fontWeight: 500 }}>{d.name}<div className="mono" style={{ fontSize: 10, color: "var(--text-4)" }}>{d.model}</div></td>
                <td>{d.type}</td>
                <td className="mono" style={{ fontSize: 12 }}>{d.proto}</td>
                <td className="mono" style={{ fontSize: 11.5 }}>{d.node}</td>
                <td className="mono" style={{ fontSize: 12, color: "var(--text-3)" }}>hace {d.last}</td>
                <td><span className="dot" style={{ background: d.status === "En línea" ? "var(--ek)" : d.status === "Alerta" ? "var(--warn)" : "var(--text-4)", marginRight: 6 }} /><span className="mono" style={{ fontSize: 11 }}>{d.status}</span></td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </div>
  );
}

function KinConnectors({ role }) {
  return (
    <div className="canvas-in wide rise kin">
      <KinHead role={role} title="Conectores & integraciones" sub="Catálogo multiprotocolo · MVP: Modbus y MQTT · fases posteriores: BACnet, OPC-UA, LoRaWAN"
        action={{ label: "Añadir conector", icon: "plus" }} />
      <div className="grid-3" style={{ marginBottom: 16 }}>
        {window.KIN_CONNECTORS.map(c => (
          <div key={c.id} className="kin-conn" data-on={c.devices > 0}>
            <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between" }}>
              <span className="kin-tile-ic" style={c.devices > 0 ? undefined : { background: "var(--surface-3)", color: "var(--text-3)", borderColor: "var(--line-2)" }}><Icon name={c.icon} size={17} /></span>
              <Pill status={c.status === "Activo" ? "Activo" : "Pendiente"} />
            </div>
            <div>
              <b className="disp" style={{ fontSize: 15 }}>{c.name}</b>
              <p className="muted" style={{ fontSize: 12, marginTop: 5, lineHeight: 1.45 }}>{c.desc}</p>
            </div>
            <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", paddingTop: 10, borderTop: "1px solid var(--line)" }}>
              <span className="mono" style={{ fontSize: 11, color: "var(--text-4)" }}>{c.devices} dispositivos</span>
              <span className="badge" style={c.devices > 0 ? { background: "var(--kin-dim)", color: "var(--kin)" } : undefined}>{c.phase}</span>
            </div>
          </div>
        ))}
      </div>
      <div className="card" style={{ padding: 20, display: "flex", gap: 16, alignItems: "center" }}>
        <span className="kin-tile-ic" style={{ width: 40, height: 40 }}><Icon name="cpu" size={20} /></span>
        <div style={{ flex: 1 }}>
          <b style={{ fontSize: 14 }}>Gateway de borde · {window.KIN_SITE.gatewayId}</b>
          <p className="muted" style={{ fontSize: 12.5, marginTop: 4, lineHeight: 1.5 }}>Adquisición, normalización y ejecución local de reglas críticas. Mantiene medición y buffer aun sin conexión a la nube, y sincroniza al reconectar.</p>
        </div>
        <span className="badge ok dot">en línea · offline-ready</span>
      </div>
    </div>
  );
}

function KinRBAC({ role }) {
  return (
    <div className="canvas-in wide rise kin">
      <KinHead role={role} title="Usuarios & RBAC" sub="Roles, permisos y vistas por defecto del tenant · aislamiento estricto de datos"
        action={{ label: "Invitar usuario", icon: "plus" }} />
      <div className="card" style={{ padding: 0, overflow: "hidden", marginBottom: 16 }}>
        <table className="tbl">
          <thead><tr><th>Usuario</th><th>Rol</th><th>Vista por defecto</th><th>Última actividad</th></tr></thead>
          <tbody>
            {window.KIN_USERS.map((u, i) => {
              const rk = Object.keys(window.KIN_ROLES).find(k => window.KIN_ROLES[k].label === u.role) || "fm";
              return (
                <tr key={i}>
                  <td><div style={{ display: "flex", alignItems: "center", gap: 10 }}><Avatar name={u.name} initials={u.initials} hue={u.hue} size={28} /><span style={{ color: "var(--text)", fontWeight: 500 }}>{u.name}</span></div></td>
                  <td>{u.role}</td>
                  <td className="mono" style={{ fontSize: 11.5, color: "var(--text-3)" }}>{window.KIN_NAV[rk] ? window.KIN_NAV[rk][0].label : "Cockpit"}</td>
                  <td className="mono" style={{ fontSize: 12, color: "var(--text-3)" }}>{u.last}</td>
                </tr>
              );
            })}
          </tbody>
        </table>
      </div>
      <div className="grid-3">
        {Object.entries(window.KIN_ROLES).map(([k, r]) => (
          <div key={k} className="card" style={{ padding: 16 }}>
            <div style={{ display: "flex", alignItems: "center", gap: 10, marginBottom: 8 }}>
              <span className="kin-tile-ic" style={{ width: 30, height: 30 }}><Icon name={r.icon} size={15} /></span>
              <b style={{ fontSize: 13.5 }}>{r.label}</b>
            </div>
            <p className="muted" style={{ fontSize: 12, lineHeight: 1.5 }}>{r.sub}</p>
            <div className="mono" style={{ fontSize: 10.5, color: "var(--text-4)", marginTop: 10 }}>{window.KIN_NAV[k].length} vistas asignadas</div>
          </div>
        ))}
      </div>
    </div>
  );
}

Object.assign(window, { KinCopilot, KinAutomation, KinDevices, KinConnectors, KinRBAC });
