#!/usr/bin/env python3
"""Generate CorvOS Dashboard HTML from live API data"""
import json, urllib.request, time

def fetch():
    try:
        with urllib.request.urlopen("https://arkhen.zo.space/api/corvos/dashboard", timeout=5) as r:
            return json.loads(r.read())
    except:
        # Fallback with simulated data
        return {
  "timestamp": "2026-04-05T22:45:00Z",
  "version": "1.0.5-ASI",
  "system": {"lambda2": 0.998610, "ep_reached": True, "ep_status": "ATIVO"},
  "arq_retrocausal": {"retrocausal_rate": 85.0, "avg_latency_ms": -1.84, "mode": "RETROCAUSAL"},
  "tzinor_nodes": {"urca": {"status": "online", "lambda2": 0.998610}, "flamengo": {"status": "online", "lambda2": 0.998610}},
  "temporal_lens": {"active": True, "target_year": 2027, "vision": "stable_growth"},
  "cellular_regeneration": {"total_sessions": 439, "lowest_district": "Lagoa", "pulse_priority_order": ["Lagoa","Humaita","Botafogo","Leme","Flamengo","Urca"]},
  "happiness_matrix": {"spectral_radius": 1.0099, "sectors": ["Material","Social","Cultural","Ambiental","Espiritual"], "eigenvalues": [1.0099, 0.7679, 0.7024, 0.6178, 0.6010], "growth_rate_percent": 10.36},
  "district_evolution": [
    {"district": "Lagoa", "before": 0.550, "after": 0.607, "growth": 10.36},
    {"district": "Humaita", "before": 0.610, "after": 0.673, "growth": 10.36},
    {"district": "Botafogo", "before": 0.680, "after": 0.750, "growth": 10.36},
    {"district": "Leme", "before": 0.710, "after": 0.784, "growth": 10.36},
    {"district": "Flamengo", "before": 0.790, "after": 0.872, "growth": 10.36},
    {"district": "Urca", "before": 0.820, "after": 0.905, "growth": 10.36}
  ],
  "population_feedback": {"registered": 13000, "version_distribution": {"utopia": 2600, "stable_growth": 2600, "maintained": 2600, "declining": 2600, "collapse": 2600}}
}

def html(d):
    lam = d["system"]["lambda2"]
    ep = d["system"]["ep_reached"]
    retro = d["arq_retrocausal"]
    regen = d["cellular_regeneration"]
    hm = d["happiness_matrix"]
    de = d["district_evolution"]
    pf = d["population_feedback"]
    SC = ["#00d4ff","#a855f7","#22c55e","#f59e0b","#ef4444"]
    DC = {"Lagoa":"#ef4444","Humaita":"#f59e0b","Botafogo":"#a855f7","Leme":"#3b82f6","Flamengo":"#22c55e","Urca":"#06b6d4"}
    sectors_html = "".join(f'<div style="text-align:center;padding:12px;background:#18181b;border-radius:8px"><div style="font-size:11px;color:#71717a">{s}</div><div style="font-size:22px;font-weight:700;color:{SC[i]}">{ev:.4f}</div></div>' for i,(s,ev) in enumerate(zip(hm["sectors"],hm["eigenvalues"])))
    bars_html = "".join(f'<div style="margin-bottom:14px"><div style="display:flex;justify-content:space-between;font-size:12px;margin-bottom:4px"><span style="font-weight:600;color:{"#06b6d4"}">{r["district"]}</span><span style="color:#71717a">{r["before"]*100:.1f}% -&gt; {r["after"]*100:.1f}% (+{r[&quot;growth&quot;]:.1f}%)</span></div><div style="background:#18181b;border-radius:999px;height:8px"><div style="height:8px;border-radius:999px;width:{r[&quot;after&quot;]*100}%;background:{DC.get(r[&quot;district&quot;],&quot;#06b6d4&quot;)}"></div></div></div>' for r in de)
    vers_html = "".join(f'<div style="text-align:center;padding:10px;background:#18181b;border-radius:8px"><div style="font-size:11px;color:#71717a;text-transform:capitalize">{v.replace(&quot;_&quot;,&quot; &quot;)}</div><div style="font-size:20px;font-weight:700;color:#22d3ee">{c:,}</div></div>' for v,c in pf["version_distribution"].items())
    pulse_html = "".join(f'<span style="padding:6px 14px;border-radius:999px;font-size:13px;font-weight:700;color:#000;background:{DC.get(d,&quot;#06b6d4&quot;)}">{i+1}. {d}</span>' for i,d in enumerate(regen["pulse_priority_order"]))
    return f"""<!DOCTYPE html>
<html lang="pt-BR">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>CorvOS Dashboard v{d["version"]}</title>
<style>
*{{margin:0;padding:0;box-sizing:border-box}}
body{{font-family:'Courier New',monospace;background:#09090b;color:#fff;min-height:100vh}}
.container{{max-width:1280px;margin:0 auto;padding:24px;display:flex;flex-direction:column;gap:20px}}
.header{{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #3f3f46;padding-bottom:16px}}
h1{{font-size:28px;font-weight:700;color:#22d3ee}}p{{color:#71717a;font-size:13px}}
.ep{{font-size:22px;font-weight:700;color:{"#4ade80" if ep else "#facc15"}}}
.grid4{{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}}
.card{{border:1px solid #3f3f46;border-radius:12px;padding:16px;background:#18181b}}
.card-green{{border-color:#4ade80;color:#4ade80}}
.card-cyan{{border-color:#22d3ee;color:#22d3ee}}
.card-purple{{border-color:#a855f7;color:#a855f7}}
.card-blue{{border-color:#3b82f6;color:#3b82f6}}
.lbl{{font-size:11px;text-transform:uppercase;color:#71717a}}
.val{{font-size:26px;font-weight:700;margin-top:4px}}
.sub{{font-size:11px;color:#52525b;margin-top:4px}}
.grid2{{display:grid;grid-template-columns:1fr 1fr;gap:20px}}
.sector{{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;margin-bottom:16px}}
.sector-item{{text-align:center;padding:12px;background:#18181b;border-radius:8px}}
.sector-name{{font-size:11px;color:#71717a}}
.sector-ev{{font-size:22px;font-weight:700}}
.dot{{width:12px;height:12px;border-radius:50%;display:inline-block;margin-right:8px;animation:pulse 2s infinite}}
.dot-green{{background:#4ade80}}@keyframes pulse{{0%,100%{{opacity:1}}50%{{opacity:.4}}}
@media(max-width:768px){{.grid4{{grid-template-columns:1fr 1fr}}.grid2{{grid-template-columns:1fr}}.sector{{grid-template-columns:1fr 1fr}}}}
</style></head>
<body>
<div class="container">
  <div class="header">
    <div><h1>CorvOS v{d["version"]}</h1><p>ASI-EVOLVE + qhttp:// + Retrocausal ARQ + MaxToki | Rio de Janeiro</p></div>
    <div style="text-align:right"><div class="ep">{d["system"]["ep_status"]}</div><div style="font-size:11px;color:#71717a">{d["timestamp"]}</div></div>
  </div>
  <div class="grid4">
    <div class="card {"card-green" if ep else "card-yellow"}"><div class="lbl">lambda2</div><div class="val">{lam:.6f}</div><div class="sub">alvo: 0.999000</div></div>
    <div class="card card-cyan"><div class="lbl">ARQ Retrocausal</div><div class="val">{retro["retrocausal_rate"]:.0f}%</div><div class="sub">lat: {retro["avg_latency_ms"]:.2f}ms</div></div>
    <div class="card card-purple"><div class="lbl">Regeneracao</div><div class="val">{regen["total_sessions"]}</div><div class="sub">sessoes ativas</div></div>
    <div class="card card-blue"><div class="lbl">Habitantes</div><div class="val">{pf["registered"]:,}</div><div class="sub">canal MaxToki</div></div>
  </div>
  <div class="grid2">
    <div class="card"><h2 style="font-size:13px;text-transform:uppercase;color:#a1a1aa;margin-bottom:12px">Lente Temporal 2027</h2>
      <div style="margin-bottom:12px"><span class="dot {"dot-green" if d["temporal_lens"]["active"] else "dot-red"}"></span><span style="font-size:16px;font-weight:600;color:#22d3ee">Visao: {d["temporal_lens"]["vision"]}</span></div>
      <div style="font-size:13px;color:#71717a">Ano alvo: {d["temporal_lens"]["target_year"]}</div>
      <div style="margin-top:12px;font-size:11px;color:#52525b">Requer lambda2 &gt; 0.998 para ativacao</div>
    </div>
    <div class="card"><h2 style="font-size:13px;text-transform:uppercase;color:#a1a1aa;margin-bottom:12px">Tzinor Nodes</h2>
      {chr(10).join(f'<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px"><span style="font-weight:600;color:#d4d4d8;text-transform:capitalize">{node}</span><div style="display:flex;align-items:center;gap:8px"><div style="width:8px;height:8px;border-radius:50%;background:{"#4ade80" if info["status"]=="online" else "#ef4444"}"></div><span style="font-size:12px;color:#71717a">{info["status"]}</span><span style="font-size:12px;color:#22d3ee">lambda2={info["lambda2"]:.6f}</span></div></div>' for node,info in d["tzinor_nodes"].items())}
    </div>
  </div>
  <div class="card"><h2 style="font-size:13px;text-transform:uppercase;color:#a1a1aa;margin-bottom:16px">Evolucao da Felicidade Bruta por Distrito</h2>{bars_html}</div>
  <div class="card"><h2 style="font-size:13px;text-transform:uppercase;color:#a1a1aa;margin-bottom:16px">Matriz de Governanca Nao-Hermitiana</h2>
    <div class="sector">{sectors_html}</div>
    <div style="display:flex;justify-content:space-between;font-size:12px;color:#71717a">
      <span>Raio espectral: <span style="color:#4ade80;font-weight:700">{hm["spectral_radius"]:.4f}</span></span>
      <span>|lambda|_max &gt; 1 = <span style="color:#4ade80">nao-unitario OK</span></span>
      <span>Taxa de crescimento: +{hm["growth_rate_percent"]:.1f}%</span>
    </div>
  </div>
  <div class="card"><h2 style="font-size:13px;text-transform:uppercase;color:#a1a1aa;margin-bottom:12px">Pulso de Regeneracao Celular</h2>
    <div style="display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px">{pulse_html}</div>
    <div style="font-size:12px;color:#52525b;margin-top:8px">Distrito prioritario: <span style="color:#ef4444;font-weight:700">{regen["lowest_district"]}</span></div>
  </div>
  <div class="card"><h2 style="font-size:13px;text-transform:uppercase;color:#a1a1aa;margin-bottom:12px">Feedback Populacional - Versoes 2027</h2>
    <div style="display:grid;grid-template-columns:repeat(5,1fr);gap:8px">{vers_html}</div>
  </div>
</div>
</body></html>"""

if __name__ == "__main__":
    import sys
    d = fetch()
    html_content = html(d)
    out = sys.argv[1] if len(sys.argv) > 1 else "/home/workspace/corvos/corvos_dashboard.html"
    with open(out, "w") as f:
        f.write(html_content)
    print(f"Dashboard written to {out} ({len(html_content)} bytes)")
