#!/usr/bin/env python3
from pathlib import Path
from datetime import datetime
import html

W = Path('/Users/ahmad/.openclaw/workspace')
KB = W / 'knowledge_base'
OUTDIR = W / 'apps' / 'mission_control'
OUT = OUTDIR / 'index.html'

SOURCES = [
    ('Email Triage', 'email_triage_daily.md', 'ops'),
    ('Sender Heatmap', 'email_sender_heatmap_weekly.md', 'ops'),
    ('X Signal Scan', 'twitter_x_signal_scan.md', 'intel'),
    ('Video Pipeline', 'video_idea_pipeline.md', 'content'),
    ('Pain Mining', 'market_pain_mining_daily.md', 'intel'),
    ('Daily Tasks', 'goal_aligned_tasks_daily.md', 'execution'),
    ('BI Deep Dive', 'business_intelligence_weekly.md', 'intel'),
    ('CEO Mission Control', 'ceo_mission_control_weekly.md', 'execution'),
    ('Content Factory', 'content_factory_daily.md', 'content'),
]


def read_text(path: Path):
    if not path.exists():
        return None
    return path.read_text(encoding='utf-8', errors='ignore').strip() or None


def extract_points(text: str, limit=5):
    points = []
    for ln in text.splitlines():
        s = ln.strip()
        if not s:
            continue
        if s.startswith('#'):
            continue
        s = s.lstrip('-* ').strip()
        if len(s) < 18:
            continue
        points.append(s)
        if len(points) >= limit:
            break
    return points


def freshness(path: Path):
    if not path.exists():
        return 'Missing', 'bad'
    age_h = (datetime.now().timestamp() - path.stat().st_mtime) / 3600
    if age_h < 12:
        return f'{age_h:.1f}h ago', 'good'
    if age_h < 48:
        return f'{age_h:.1f}h ago', 'warn'
    return f'{age_h:.1f}h ago', 'bad'


def main():
    OUTDIR.mkdir(parents=True, exist_ok=True)

    cards = []
    present = 0
    for title, filename, cat in SOURCES:
        p = KB / filename
        txt = read_text(p)
        status_txt, status_cls = freshness(p)
        if txt:
            present += 1
        points = extract_points(txt or 'Not generated yet.', 5)
        bullets = ''.join([f"<li>{html.escape(x)}</li>" for x in points]) or '<li>No summary yet.</li>'
        full = html.escape((txt or 'Not generated yet.'))
        cards.append(f"""
        <article class='card' data-cat='{cat}'>
          <div class='cardHead'>
            <h3>{html.escape(title)}</h3>
            <span class='pill {status_cls}'>{status_txt}</span>
          </div>
          <div class='file'>{html.escape(filename)}</div>
          <ul>{bullets}</ul>
          <details>
            <summary>View full report</summary>
            <pre>{full}</pre>
          </details>
        </article>
        """)

    total = len(SOURCES)
    coverage = int((present / total) * 100)
    updated = datetime.now().strftime('%Y-%m-%d %H:%M')

    html_doc = f"""<!doctype html>
<html>
<head>
  <meta charset='utf-8'/>
  <meta name='viewport' content='width=device-width,initial-scale=1'/>
  <title>Mission Control</title>
  <style>
    :root {{ --bg:#0b1020; --panel:#111933; --panel2:#151f3f; --text:#eaf0ff; --muted:#9fb0d8; --line:#2b396a; --good:#1f9d55; --warn:#b08900; --bad:#b42318; }}
    *{{box-sizing:border-box}} body{{margin:0;background:linear-gradient(180deg,#0a0f1f,#0d1330);color:var(--text);font-family:Inter,-apple-system,Segoe UI,Roboto,sans-serif}}
    .wrap{{max-width:1280px;margin:0 auto;padding:22px}}
    .top{{display:flex;justify-content:space-between;gap:12px;align-items:center;flex-wrap:wrap}}
    h1{{margin:0;font-size:28px}}
    .muted{{color:var(--muted);font-size:13px}}
    .kpis{{display:grid;grid-template-columns:repeat(3,minmax(180px,1fr));gap:10px;margin:14px 0 18px}}
    .kpi{{background:var(--panel);border:1px solid var(--line);padding:12px;border-radius:12px}}
    .kpi .n{{font-size:24px;font-weight:700}}
    .filters{{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}}
    button{{background:var(--panel2);border:1px solid var(--line);color:var(--text);padding:7px 11px;border-radius:999px;cursor:pointer}}
    button.active{{background:#22315f}}
    .grid{{display:grid;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));gap:12px}}
    .card{{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:12px 12px 10px}}
    .cardHead{{display:flex;justify-content:space-between;align-items:center;gap:8px}}
    h3{{margin:0;font-size:16px}}
    .file{{font-size:12px;color:var(--muted);margin:4px 0 8px}}
    ul{{margin:0 0 8px 18px;padding:0}} li{{margin:5px 0;line-height:1.3}}
    .pill{{font-size:11px;padding:4px 8px;border-radius:999px;border:1px solid transparent}}
    .pill.good{{color:#b7f5cf;background:#123722;border-color:#1f9d55}}
    .pill.warn{{color:#ffe9a3;background:#3b2f08;border-color:#b08900}}
    .pill.bad{{color:#ffc4c4;background:#3d1217;border-color:#b42318}}
    details summary{{cursor:pointer;color:#c9d6ff;font-size:12px}}
    pre{{white-space:pre-wrap;background:#0e1530;border:1px solid #2a3764;border-radius:8px;padding:10px;font-size:12px;line-height:1.35;max-height:280px;overflow:auto}}
  </style>
</head>
<body>
  <div class='wrap'>
    <div class='top'>
      <div>
        <h1>Mission Control</h1>
        <div class='muted'>Last refreshed: {updated}</div>
      </div>
      <div class='muted'>Clean view for daily decisions</div>
    </div>

    <section class='kpis'>
      <div class='kpi'><div class='muted'>Reports available</div><div class='n'>{present}/{total}</div></div>
      <div class='kpi'><div class='muted'>Coverage</div><div class='n'>{coverage}%</div></div>
      <div class='kpi'><div class='muted'>Focus</div><div class='n'>Execute</div></div>
    </section>

    <div class='filters'>
      <button class='active' onclick="filt('all',this)">All</button>
      <button onclick="filt('execution',this)">Execution</button>
      <button onclick="filt('content',this)">Content</button>
      <button onclick="filt('intel',this)">Intel</button>
      <button onclick="filt('ops',this)">Ops</button>
    </div>

    <section class='grid'>
      {''.join(cards)}
    </section>
  </div>

  <script>
    function filt(cat,btn) {{
      document.querySelectorAll('.filters button').forEach(b=>b.classList.remove('active'));
      btn.classList.add('active');
      document.querySelectorAll('.card').forEach(c=>{{
        c.style.display = (cat==='all' || c.dataset.cat===cat) ? '' : 'none';
      }});
    }}
  </script>
</body>
</html>"""

    OUT.write_text(html_doc, encoding='utf-8')
    print(str(OUT))


if __name__ == '__main__':
    main()
