/* CRM Dashboard view — live metrics, pipeline, and recent data from the API */
const { useState: useDs, useEffect: useDse } = React;

function Metric({ lbl, val, sub }) {
  return (
    <div className="metric">
      <div className="lbl">{lbl}</div>
      <div className="val">{val}</div>
      {sub && <div className="delta">{sub}</div>}
      <span className="crop-mark tl" />
      <span className="crop-mark br" />
    </div>
  );
}

/* Tiny sparkline — kept for future historical data */
function Spark({ data, color = "var(--accent)" }) {
  if (!data || data.length < 2) return null;
  const max = Math.max(...data);
  const min = Math.min(...data);
  const w = 200, h = 48;
  const pts = data.map((d, i) => {
    const x = (i / (data.length - 1)) * w;
    const y = h - ((d - min) / (max - min || 1)) * (h - 4) - 2;
    return `${x},${y}`;
  }).join(" ");
  return (
    <svg viewBox={`0 0 ${w} ${h}`} preserveAspectRatio="none" style={{width:"100%", height:48}}>
      <polyline points={pts} fill="none" stroke={color} strokeWidth="1.2" />
      <polyline points={`${pts} ${w},${h} 0,${h}`} fill={color} fillOpacity="0.08" stroke="none" />
    </svg>
  );
}

function Pipeline({ stages, hasData }) {
  if (!hasData) {
    return (
      <div style={{padding:"40px 24px", textAlign:"center", color:"var(--fog)", fontFamily:"var(--font-mono)", fontSize:11, letterSpacing:"0.1em"}}>
        NO PIPELINE DATA YET · ADD LEADS TO BUILD YOUR FUNNEL
      </div>
    );
  }
  return (
    <div className="pipe-stages">
      {stages.map((s, i) => (
        <div className="pipe-col" key={i}>
          <div className="pipe-col-head">
            <span>0{i+1} · {s.name}</span>
            <span className="count">{s.count}</span>
          </div>
          {s.deals.map((d, j) => (
            <div className="pipe-deal" key={j}>
              <div className="name">{d.name}</div>
              <div className="amt">{d.amt}</div>
              <div className="meta">{d.meta}</div>
            </div>
          ))}
          {s.count === 0 && (
            <div style={{padding:"12px 14px", color:"var(--fog)", fontFamily:"var(--font-mono)", fontSize:10, letterSpacing:"0.08em"}}>
              EMPTY
            </div>
          )}
        </div>
      ))}
    </div>
  );
}

function DashCustomerTable({ rows, total }) {
  const th = { textAlign:"left", padding:"10px 16px", fontFamily:"var(--font-mono)", fontSize:10, letterSpacing:"0.14em", fontWeight:500 };
  const td = { padding:"14px 16px", color:"var(--ink)" };
  return (
    <div className="card">
      <div className="card-head">
        <span className="title"><span className="num">§ 03 /</span>RECENT CUSTOMERS</span>
        <span className="meta">SHOWING {rows.length} OF {total}</span>
      </div>
      <div className="card-body" style={{padding:0}}>
        {rows.length === 0 ? (
          <div style={{padding:"40px 24px", textAlign:"center", color:"var(--fog)", fontFamily:"var(--font-mono)", fontSize:11, letterSpacing:"0.1em"}}>
            NO CUSTOMERS YET
          </div>
        ) : (
          <table style={{width:"100%", borderCollapse:"collapse", fontSize:13}}>
            <thead>
              <tr style={{background:"var(--accent)", color:"var(--paper)"}}>
                <th style={th}>NAME</th>
                <th style={th}>COMPANY</th>
                <th style={th}>STATUS</th>
                <th style={{...th, textAlign:"right"}}>NOTES</th>
              </tr>
            </thead>
            <tbody>
              {rows.map((r, i) => (
                <tr key={i} style={{borderBottom:"1px dashed var(--rule)"}}>
                  <td style={td}>{r.name}</td>
                  <td style={{...td, color:"var(--ink-2)"}}>{r.company}</td>
                  <td style={td}><span className={`chip ${r.chip}`}>{r.chipText}</span></td>
                  <td style={{...td, textAlign:"right", fontFamily:"var(--font-mono)", fontSize:10, color:"var(--fog)", maxWidth:160, overflow:"hidden", textOverflow:"ellipsis", whiteSpace:"nowrap"}}>{r.notes}</td>
                </tr>
              ))}
            </tbody>
          </table>
        )}
      </div>
    </div>
  );
}

function MiniAgentStrip({ agents }) {
  return (
    <div className="card">
      <div className="card-head">
        <span className="title"><span className="num">§ 02 /</span>AGENT STATUS</span>
        <span className="meta">{agents.filter(a => a.status !== "idle").length} ACTIVE</span>
      </div>
      <div className="card-body" style={{padding:0}}>
        {agents.map((a, i) => (
          <div key={i} style={{display:"grid", gridTemplateColumns:"36px 1fr 80px", gap:14, padding:"14px 18px", borderBottom: i < agents.length - 1 ? "1px dashed var(--rule)" : "none", alignItems:"center"}}>
            <span style={{width:32,height:32,border:"1px solid var(--ink)", display:"grid", placeItems:"center", background:"var(--paper-2)"}}>
              <AgentMark kind={a.kind} size={20} />
            </span>
            <div>
              <div style={{fontSize:13, color:"var(--ink)", fontWeight:500}}>{a.name}</div>
              <div style={{fontFamily:"var(--font-mono)", fontSize:10, color:"var(--fog)", letterSpacing:"0.06em", marginTop:2}}>{a.task}</div>
            </div>
            <span className={`chip ${a.status === "active" ? "accent" : a.status === "busy" ? "warn" : ""}`}>
              {a.status.toUpperCase()}
            </span>
          </div>
        ))}
      </div>
    </div>
  );
}

function Dashboard() {
  const [leads, setLeads] = useDs([]);
  const [customers, setCustomers] = useDs([]);
  const [tasks, setTasks] = useDs([]);
  const [logs, setLogs] = useDs([]);
  const [loading, setLoading] = useDs(true);

  useDse(() => {
    Promise.all([
      fetch(window.API_BASE + "/api/leads/").then(r => r.json()).catch(() => []),
      fetch(window.API_BASE + "/api/customers/").then(r => r.json()).catch(() => []),
      fetch(window.API_BASE + "/api/tasks/").then(r => r.json()).catch(() => []),
      fetch(window.API_BASE + "/api/agent-logs/").then(r => r.json()).catch(() => []),
    ]).then(([l, c, t, lg]) => {
      setLeads(Array.isArray(l) ? l : []);
      setCustomers(Array.isArray(c) ? c : []);
      setTasks(Array.isArray(t) ? t : []);
      setLogs(Array.isArray(lg) ? lg : []);
      setLoading(false);
    });
  }, []);

  /* ── Computed metrics ─────────────────────────────────────────────────────── */
  const openLeads = leads.filter(l => !["won", "lost"].includes(l.stage));
  const pipeline  = openLeads.reduce((s, l) => s + parseFloat(l.value || 0), 0);
  const wonLeads  = leads.filter(l => l.stage === "won");
  const openTasks = tasks.filter(t => t.status !== "done").length;

  /* ── Pipeline kanban from live leads ──────────────────────────────────────── */
  const STAGE_ORDER  = ["new", "contacted", "qualified", "proposal", "won"];
  const STAGE_LABELS = { new:"New", contacted:"Contacted", qualified:"Qualified", proposal:"Proposal", won:"Won" };
  const stageMap = {};
  STAGE_ORDER.forEach(s => { stageMap[s] = []; });
  leads.forEach(l => { if (stageMap[l.stage]) stageMap[l.stage].push(l); });
  const pipelineStages = STAGE_ORDER.map((key, i) => ({
    name:  STAGE_LABELS[key],
    count: stageMap[key].length,
    deals: stageMap[key].slice(0, 2).map(l => ({
      name: l.company || l.name || "—",
      amt:  parseFloat(l.value) > 0 ? `$${parseInt(l.value).toLocaleString()}` : "—",
      meta: l.stage.toUpperCase(),
    })),
  }));

  /* ── Recent customers for dashboard table ─────────────────────────────────── */
  const dashCustomers = customers.slice(0, 5).map(c => ({
    name:     c.name || "—",
    company:  c.company || "—",
    chip:     c.status === "active" ? "accent" : c.status === "inactive" ? "" : "solid-accent",
    chipText: (c.status || "—").toUpperCase(),
    notes:    c.notes ? c.notes.slice(0, 35) : "—",
  }));

  /* ── Agent strip — most recent unique agents from logs ────────────────────── */
  const AGENT_KINDS = { PROCUREMENT:"procurement", FINANCE:"finance", PRODUCTION:"production", CLIENT:"client", ARIS:"aris" };
  const seenKinds = new Set();
  const agentItems = [];
  for (const log of logs) {
    const kind = AGENT_KINDS[log.agent] || "aris";
    if (kind === "aris") continue;
    if (!seenKinds.has(kind)) {
      seenKinds.add(kind);
      agentItems.push({
        kind,
        name:   log.agent.charAt(0) + log.agent.slice(1).toLowerCase(),
        task:   (log.description || "—").slice(0, 45),
        status: "active",
      });
      if (agentItems.length === 4) break;
    }
  }
  // Fill any missing slots with idle defaults
  const idleDefaults = [
    { kind:"procurement", name:"Procurement" },
    { kind:"finance",     name:"Finance" },
    { kind:"production",  name:"Production" },
    { kind:"client",      name:"Client" },
  ];
  for (const def of idleDefaults) {
    if (!seenKinds.has(def.kind)) {
      agentItems.push({ ...def, task:"Awaiting input", status:"idle" });
    }
    if (agentItems.length === 4) break;
  }

  const fmt = (n) => n > 0 ? `$${(n / 1000).toFixed(1)}k` : "—";

  return (
    <>
      <div className="page-head">
        <div className="meta">
          <span className="coord">§ 02 / DASHBOARD</span>
          <span className="coord" style={{opacity:0.6}}>FIG_002 · OVERVIEW · LIVE</span>
        </div>
        <h1>This week, <em>at a glance.</em></h1>
        <div className="actions">
          <button className="btn-sm">Export</button>
          <button className="btn-sm solid">+ New deal</button>
        </div>
      </div>

      <div className="metrics-grid">
        <Metric lbl="OPEN PIPELINE" val={fmt(pipeline)}   sub={`${openLeads.length} open leads`} />
        <Metric lbl="DEALS WON"     val={wonLeads.length  || "—"} sub="all time" />
        <Metric lbl="OPEN TASKS"    val={openTasks        || "—"} sub={`${tasks.length} total`} />
        <Metric lbl="CUSTOMERS"     val={customers.length || "—"} sub={`${customers.filter(c => c.status === "active").length} active`} />
      </div>

      <div className="card" style={{marginBottom:32}}>
        <div className="card-head">
          <span className="title"><span className="num">§ 01 /</span>PIPELINE · FIG_A</span>
          <span className="meta">{leads.length} LEADS · {pipeline > 0 ? fmt(pipeline) : "EMPTY"}</span>
        </div>
        <div className="card-body" style={{padding:0}}>
          <Pipeline stages={pipelineStages} hasData={leads.length > 0} />
        </div>
      </div>

      <div className="dash-grid" style={{marginBottom:32}}>
        <DashCustomerTable rows={dashCustomers} total={customers.length} />
        <MiniAgentStrip agents={agentItems} />
      </div>

      {/* Summary count cards — replaces sparkline placeholders */}
      <div style={{display:"grid", gridTemplateColumns:"1fr 1fr 1fr", gap:24}}>
        <div className="card">
          <div className="card-head">
            <span className="title"><span className="num">§ 04A /</span>LEADS</span>
            <span className="meta">ALL TIME</span>
          </div>
          <div className="card-body">
            <div style={{fontFamily:"var(--font-serif)", fontSize:32, color:"var(--ink)"}}>{leads.length || "—"}</div>
            <div style={{fontFamily:"var(--font-mono)", fontSize:10, color:"var(--fog)", letterSpacing:"0.1em", textTransform:"uppercase", marginTop:8}}>
              {openLeads.length} OPEN · {wonLeads.length} WON
            </div>
          </div>
        </div>
        <div className="card">
          <div className="card-head">
            <span className="title"><span className="num">§ 04B /</span>CUSTOMERS</span>
            <span className="meta">ALL TIME</span>
          </div>
          <div className="card-body">
            <div style={{fontFamily:"var(--font-serif)", fontSize:32, color:"var(--ink)"}}>{customers.length || "—"}</div>
            <div style={{fontFamily:"var(--font-mono)", fontSize:10, color:"var(--fog)", letterSpacing:"0.1em", textTransform:"uppercase", marginTop:8}}>
              {customers.filter(c => c.status === "active").length} ACTIVE · {customers.filter(c => c.status === "prospect").length} PROSPECT
            </div>
          </div>
        </div>
        <div className="card">
          <div className="card-head">
            <span className="title"><span className="num">§ 04C /</span>AGENT SESSIONS</span>
            <span className="meta">ARIS LOG</span>
          </div>
          <div className="card-body">
            <div style={{fontFamily:"var(--font-serif)", fontSize:32, color:"var(--ink)"}}>{logs.length || "—"}</div>
            <div style={{fontFamily:"var(--font-mono)", fontSize:10, color:"var(--fog)", letterSpacing:"0.1em", textTransform:"uppercase", marginTop:8}}>
              DISPATCH LOG · ALL AGENTS
            </div>
          </div>
        </div>
      </div>

      <div style={{height: 40}} />
    </>
  );
}

Object.assign(window, { Metric, Spark, Pipeline, DashCustomerTable, MiniAgentStrip, Dashboard });
