/* ============================================================
   SYMPHO · ZAMNÁ — Admin views + shared field helpers
   Dashboard · Proyectos · Clientes & Sitios · Agenda · Expediente Vivo
   ============================================================ */

const ZAccent = "var(--zamna)";

// ---- shared: photo evidence tile ----
function PhotoTile({ photo, tag }) {
  return (
    <div className="evi">
      <div className="evi-ph">
        {tag && <span className="evi-tag"><Icon name="map" size={11} /> {tag}</span>}
        <Icon name="camera" size={26} className="evi-ic" />
      </div>
      <div className="evi-meta">
        <div style={{ fontSize: 12, color: "var(--text)", fontWeight: 500 }}>{photo.label}</div>
        <div className="ai-chip" style={{ marginTop: 7, fontSize: 10.5, padding: "3px 8px" }}><Icon name="sparkle" size={11} /> {photo.ai}</div>
      </div>
    </div>
  );
}

// ---- shared: small key/row helpers ----
function MiniStat({ label, value, color }) {
  return (
    <div className="card card-2" style={{ padding: 16 }}>
      <div className="disp" style={{ fontSize: 24, fontWeight: 600, color: color || "var(--text)" }}>{value}</div>
      <div className="muted" style={{ fontSize: 12, marginTop: 4 }}>{label}</div>
    </div>
  );
}

// helper: avatar initials from a name
function inits(name) { return name.split(" ").map(w => w[0]).slice(0, 2).join(""); }

// ============================================================
//  ADMIN · Dashboard
// ============================================================
function ZamDash() {
  const d = window.ZAMNA;
  return (
    <div className="canvas-in rise">
      <AppHead app="zamna" title="Dashboard" sub="Operación de campo en tiempo real · 22 jun 2026" action={{ label: "Nueva visita", icon: "plus", primary: true }} />
      <div className="grid-4" style={{ marginBottom: 14 }}>
        <Stat icon="calendar" label="Visitas programadas" value={d.stats.programadas} hue={ZAccent} trend={8} />
        <Stat icon="camera" label="En proceso" value={d.stats.proceso} hue={ZAccent} sub="capturando en sitio" />
        <Stat icon="check" label="Finalizadas (mes)" value={d.stats.finalizadas} hue={ZAccent} trend={15} />
        <Stat icon="doc" label="Firmas pendientes" value={d.stats.firmasPend} hue={ZAccent} sub="esperan conformidad" />
      </div>

      <div className="grid-2" style={{ alignItems: "start", marginBottom: 14 }}>
        <div className="card" style={{ padding: 20 }}>
          <Section title="Visitas por tipo" sub="Distribución del trimestre" style={{ marginBottom: 18 }} />
          <div style={{ display: "flex", gap: 24, alignItems: "center" }}>
            <Donut segments={d.byType} size={142} thickness={16}
              center={<><div className="disp" style={{ fontSize: 24, fontWeight: 600 }}>{d.byType.reduce((s, x) => s + x.n, 0)}</div><div className="mono" style={{ fontSize: 10, color: "var(--text-4)" }}>visitas</div></>} />
            <div style={{ flex: 1, display: "flex", flexDirection: "column", gap: 9 }}>
              {d.byType.map(f => (
                <div key={f.cat} style={{ display: "flex", alignItems: "center", gap: 9, fontSize: 12.5 }}>
                  <span className="dot" style={{ background: f.hue }} />
                  <span style={{ flex: 1, color: "var(--text-2)" }}>{f.cat}</span>
                  <span className="mono" style={{ color: "var(--text)" }}>{f.n}</span>
                </div>
              ))}
            </div>
          </div>
        </div>
        <div className="card ai-card">
          <Section title="Documentación automática" right={<span className="ai-chip"><Icon name="sparkle" size={12} /> IA</span>} style={{ marginBottom: 16 }} />
          <div style={{ display: "flex", gap: 28 }}>
            <div><div className="disp" style={{ fontSize: 30, fontWeight: 600 }}>{d.stats.horasProm}</div><div className="muted" style={{ fontSize: 12, marginTop: 4 }}>tiempo medio de reporte</div></div>
            <div><div className="disp" style={{ fontSize: 30, fontWeight: 600 }}>−71%</div><div className="muted" style={{ fontSize: 12, marginTop: 4 }}>trabajo administrativo</div></div>
          </div>
          <div style={{ marginTop: 18 }}><Spark data={d.docTrend} hue={ZAccent} w={460} h={64} /></div>
          <div className="mono" style={{ fontSize: 10.5, color: "var(--text-4)", marginTop: 6 }}>documentos generados por IA · últimos 12 cierres</div>
        </div>
      </div>

      <div className="card" style={{ padding: 0, overflow: "hidden" }}>
        <div className="card-head"><b style={{ fontSize: 14 }}>Visitas recientes</b><button className="btn btn-ghost btn-sm">Ver todas <Icon name="arrowr" size={13} /></button></div>
        <VisitTable rows={d.visits} />
      </div>
    </div>
  );
}

function VisitTable({ rows }) {
  return (
    <table className="tbl">
      <thead><tr><th>Visita</th><th>Sitio</th><th>Tipo</th><th>Ingeniero</th><th>Fecha</th><th>Estado</th><th style={{ width: 130 }}>Avance</th></tr></thead>
      <tbody>
        {rows.map((x, i) => (
          <tr key={i}>
            <td className="mono" style={{ color: "var(--text)", fontSize: 12.5 }}>{x.id}</td>
            <td style={{ color: "var(--text)", fontWeight: 500 }}>{x.site}</td>
            <td><span className="chip" style={{ height: 22, fontSize: 11 }}>{x.type}</span></td>
            <td><div style={{ display: "flex", alignItems: "center", gap: 8 }}><Avatar name={x.eng} initials={inits(x.eng)} hue={ZAccent} size={24} /><span style={{ fontSize: 12.5 }}>{x.eng.split(" ")[0]}</span></div></td>
            <td className="mono" style={{ fontSize: 12 }}>{x.date.replace(" 2026", "")} · {x.hour}</td>
            <td><Pill status={x.status} /></td>
            <td><div className="zbar"><i style={{ width: x.progress + "%" }} /></div></td>
          </tr>
        ))}
      </tbody>
    </table>
  );
}

// ============================================================
//  ADMIN · Proyectos
// ============================================================
function ZamProjects() {
  const d = window.ZAMNA;
  return (
    <div className="canvas-in wide rise">
      <AppHead app="zamna" title="Proyectos" sub="Cada proyecto agrupa las visitas de un sitio" action={{ label: "Nuevo proyecto", icon: "plus", primary: true }} />
      <div className="card" style={{ padding: 14, marginBottom: 14, display: "flex", gap: 10, alignItems: "center" }}>
        <select className="field" style={{ width: 180 }}><option>Todos los clientes</option><option>Flow Suites</option><option>KIO Networks</option></select>
        <select className="field" style={{ width: 160 }}><option>Todos los estados</option><option>En proceso</option><option>Finalizado</option></select>
        <div style={{ flex: 1 }} />
        <span className="mono" style={{ fontSize: 12, color: "var(--text-4)" }}>{d.projects.length} proyectos</span>
      </div>
      <div className="card" style={{ padding: 0, overflow: "hidden" }}>
        <table className="tbl">
          <thead><tr><th>Código</th><th>Proyecto</th><th>Cliente · Sitio</th><th>Ingeniero</th><th>Visitas</th><th>Entrega</th><th>Estado</th></tr></thead>
          <tbody>
            {d.projects.map((x, i) => (
              <tr key={i}>
                <td className="mono" style={{ color: "var(--text)", fontSize: 12 }}>{x.code}</td>
                <td style={{ color: "var(--text)", fontWeight: 500 }}>{x.name}</td>
                <td><span style={{ color: "var(--text-2)" }}>{x.client}</span> <span className="muted">· {x.site}</span></td>
                <td><div style={{ display: "flex", alignItems: "center", gap: 8 }}><Avatar name={x.eng} initials={inits(x.eng)} hue={ZAccent} size={24} /><span style={{ fontSize: 12.5 }}>{x.eng.split(" ")[0]}</span></div></td>
                <td className="mono">{x.visitas}</td>
                <td className="mono" style={{ fontSize: 12 }}>{x.due}</td>
                <td><Pill status={x.status} /></td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </div>
  );
}

// ============================================================
//  ADMIN · Clientes & Sitios
// ============================================================
function ZamClients() {
  const d = window.ZAMNA;
  const [open, setOpen] = useState(d.clients[0].name);
  const sites = d.sites.filter(s => s.client === open);
  return (
    <div className="canvas-in rise">
      <AppHead app="zamna" title="Clientes & Sitios" sub="Cada cliente agrupa sus sitios, su inventario y su historial de visitas" action={{ label: "Nuevo cliente", icon: "plus", primary: true }} />
      <div className="grid-4" style={{ marginBottom: 18 }}>
        {d.clients.map(c => (
          <button key={c.name} onClick={() => setOpen(c.name)} className="card" data-on={c.name === open}
            style={{ padding: 18, textAlign: "left", cursor: "pointer", border: c.name === open ? "1px solid color-mix(in oklch, var(--zamna) 50%, transparent)" : undefined, background: c.name === open ? "var(--zamna-dim)" : undefined }}>
            <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
              <span className="glyph" style={{ width: 40, height: 40, fontSize: 13, borderRadius: 11, background: "var(--zamna-dim)", color: "var(--zamna)", fontFamily: "var(--mono)", fontWeight: 600 }}>{c.logo}</span>
              {c.critical && <span className="badge" style={{ fontSize: 10 }}>infra crítica</span>}
            </div>
            <b className="disp" style={{ fontSize: 15, display: "block", marginTop: 13 }}>{c.name}</b>
            <div className="muted" style={{ fontSize: 11.5, marginTop: 3 }}>{c.sector}</div>
            <div style={{ display: "flex", justifyContent: "space-between", marginTop: 13, paddingTop: 12, borderTop: "1px solid var(--line)" }}>
              <span className="mono" style={{ fontSize: 11, color: "var(--text-3)" }}>{c.sites} sitios</span>
              <span className="mono" style={{ fontSize: 11, color: "var(--text-4)" }}>{c.rfc}</span>
            </div>
          </button>
        ))}
      </div>

      <Section eyebrow={open} title="Sitios" sub="Selecciona un sitio para abrir su Expediente Técnico Vivo" style={{ marginBottom: 14 }} />
      {sites.length === 0 ? (
        <div className="card" style={{ padding: 28, textAlign: "center" }}><span className="muted">Sin sitios capturados para este cliente.</span></div>
      ) : (
        <div className="grid-2">
          {sites.map(s => (
            <div key={s.code} className="card" style={{ padding: 18, display: "flex", gap: 14 }}>
              <span className="feed-ic" style={{ "--c": ZAccent, width: 40, height: 40 }}><Icon name="map" size={17} /></span>
              <div style={{ flex: 1, minWidth: 0 }}>
                <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
                  <b style={{ fontSize: 14.5 }}>{s.name}</b><Pill status={s.status} />
                </div>
                <div className="muted" style={{ fontSize: 12.5, marginTop: 3 }}>{s.address}</div>
                <div style={{ display: "flex", gap: 16, marginTop: 12 }}>
                  <span className="mono" style={{ fontSize: 11, color: "var(--text-3)" }}>{s.visitas} visitas</span>
                  <span className="mono" style={{ fontSize: 11, color: "var(--text-3)" }}>{s.inv} activos</span>
                  <span className="mono" style={{ fontSize: 11, color: "var(--text-4)" }}>{s.gps}</span>
                </div>
              </div>
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

// ============================================================
//  ADMIN · Agenda
// ============================================================
function ZamAgenda() {
  const d = window.ZAMNA;
  const engineers = [...new Set(d.visits.map(v => v.eng))];
  const sorted = [...d.visits].sort((a, b) => (a.date + a.hour).localeCompare(b.date + b.hour));
  return (
    <div className="canvas-in rise">
      <AppHead app="zamna" title="Agenda" sub="Programación de visitas y asignación de ingenieros" action={{ label: "Programar visita", icon: "plus", primary: true }} />
      <div className="grid-2" style={{ alignItems: "start", gridTemplateColumns: "minmax(0,1.7fr) minmax(0,1fr)" }}>
        <div className="card" style={{ padding: 0, overflow: "hidden" }}>
          <div className="card-head"><b style={{ fontSize: 14 }}>Próximas visitas</b><span className="mono" style={{ fontSize: 11, color: "var(--text-4)" }}>{sorted.length} en calendario</span></div>
          <div>
            {sorted.map((v, i) => (
              <div key={i} className="feed-row">
                <div style={{ width: 54, textAlign: "center" }}>
                  <div className="disp" style={{ fontSize: 15, fontWeight: 600 }}>{v.date.split(" ")[0]}</div>
                  <div className="mono" style={{ fontSize: 10, color: "var(--text-4)" }}>{v.date.split(" ")[1]}</div>
                </div>
                <div style={{ width: 1, alignSelf: "stretch", background: "var(--line)" }} />
                <div style={{ flex: 1 }}>
                  <div style={{ fontSize: 13, color: "var(--text)", fontWeight: 500 }}>{v.site}</div>
                  <div className="mono" style={{ fontSize: 10.5, color: "var(--text-4)", marginTop: 3 }}>{v.hour} · {v.type} · {v.eng.split(" ")[0]}</div>
                </div>
                <Pill status={v.status} />
              </div>
            ))}
          </div>
        </div>
        <div className="card" style={{ padding: 20 }}>
          <Section title="Ingenieros" sub="Carga del día" style={{ marginBottom: 14 }} />
          {engineers.map(e => {
            const load = d.visits.filter(v => v.eng === e).length;
            return (
              <div key={e} style={{ display: "flex", alignItems: "center", gap: 11, padding: "10px 0", borderBottom: "1px solid var(--line)" }}>
                <Avatar name={e} initials={inits(e)} hue={ZAccent} size={32} />
                <div style={{ flex: 1 }}>
                  <div style={{ fontSize: 13, fontWeight: 500 }}>{e}</div>
                  <div className="mono" style={{ fontSize: 10.5, color: "var(--text-4)", marginTop: 2 }}>{load} visita{load !== 1 ? "s" : ""} asignada{load !== 1 ? "s" : ""}</div>
                </div>
                <span className="badge ok dot">disponible</span>
              </div>
            );
          })}
        </div>
      </div>
    </div>
  );
}

// ============================================================
//  ADMIN · Expediente Técnico Vivo (el diferenciador)
// ============================================================
function ZamExpediente() {
  const e = window.ZAMNA.expediente;
  const v = window.ZAMNA.visit;
  const [tab, setTab] = useState("timeline");
  return (
    <div className="canvas-in wide rise">
      <AppHead app="zamna" title="Expediente Técnico Vivo" sub="Cada visita actualiza un único expediente del sitio — el conocimiento deja de depender del ingeniero" />

      {/* hero band */}
      <div className="card" style={{ padding: 22, marginBottom: 16, display: "flex", gap: 22, alignItems: "center", flexWrap: "wrap" }}>
        <span className="feed-ic" style={{ "--c": ZAccent, width: 52, height: 52 }}><Icon name="layers" size={22} /></span>
        <div style={{ flex: 1, minWidth: 200 }}>
          <div style={{ display: "flex", alignItems: "center", gap: 9 }}>
            <h2 className="disp" style={{ fontSize: 20, fontWeight: 600 }}>{e.site}</h2>
            <span className="badge ok dot">vivo</span>
          </div>
          <div className="mono" style={{ fontSize: 11.5, color: "var(--text-4)", marginTop: 4 }}>{e.code} · última intervención {e.ultima}</div>
        </div>
        <div style={{ display: "flex", gap: 26 }}>
          {[["Intervenciones", e.intervenciones], ["Inv. vigente", e.invNow], ["Inv. histórico", e.invHist]].map(([k, val]) => (
            <div key={k} style={{ textAlign: "right" }}><div className="disp" style={{ fontSize: 24, fontWeight: 600 }}>{val}</div><div className="muted" style={{ fontSize: 11, marginTop: 3 }}>{k}</div></div>
          ))}
        </div>
      </div>

      <div className="grid-2" style={{ alignItems: "start", gridTemplateColumns: "minmax(0,1.7fr) minmax(0,1fr)" }}>
        <div className="card" style={{ padding: 22 }}>
          <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: 18 }}>
            <div className="ztabs">
              {[["timeline", "Línea de tiempo"], ["inv", "Inventario"], ["diag", "Diagramas"]].map(([id, lbl]) => (
                <button key={id} className="ztab" data-on={tab === id} onClick={() => setTab(id)}>{lbl}</button>
              ))}
            </div>
            <button className="btn btn-sm"><Icon name="download" size={13} /> Exportar expediente</button>
          </div>

          {tab === "timeline" && (
            <div className="ztl">
              {e.timeline.map((t, i) => (
                <div key={i} className="ztl-row">
                  <div><div className="ztl-node" /><div className="ztl-line" /></div>
                  <div className="ztl-body">
                    <div style={{ display: "flex", alignItems: "center", gap: 9, flexWrap: "wrap" }}>
                      <span className="mono" style={{ fontSize: 12, color: "var(--text)" }}>{t.date}</span>
                      <span className="chip" style={{ height: 21, fontSize: 10.5 }}>{t.type}</span>
                      <span className="mono" style={{ fontSize: 10.5, color: "var(--text-4)" }}>· {t.eng}</span>
                    </div>
                    <p style={{ fontSize: 13, color: "var(--text-2)", marginTop: 7, lineHeight: 1.5 }}>{t.summary}</p>
                    <div style={{ display: "flex", gap: 6, flexWrap: "wrap", marginTop: 9 }}>
                      {t.deltas.map((dl, j) => <span key={j} className="delta">{dl}</span>)}
                    </div>
                  </div>
                </div>
              ))}
            </div>
          )}

          {tab === "inv" && (
            <table className="tbl">
              <thead><tr><th>Equipo</th><th>Serie</th><th>Ubicación</th><th>Estado</th></tr></thead>
              <tbody>
                {v.inventory.map((it, i) => (
                  <tr key={i}>
                    <td style={{ color: "var(--text)", fontWeight: 500 }}>{it.brand} <span className="muted">{it.model}</span></td>
                    <td className="mono" style={{ fontSize: 12 }}>{it.serie}</td>
                    <td className="mono" style={{ fontSize: 12 }}>{it.rack} · {it.ru}</td>
                    <td><Pill status={it.state} /></td>
                  </tr>
                ))}
              </tbody>
            </table>
          )}

          {tab === "diag" && (
            <div className="grid-2" style={{ alignItems: "start" }}>
              <div>
                <div className="eyebrow" style={{ marginBottom: 8 }}>Topología vigente</div>
                <TopoCanvas topo={v.topology} />
              </div>
              <div>
                <div className="eyebrow" style={{ marginBottom: 8 }}>Plano del MDF</div>
                <div className="plano" style={{ aspectRatio: "16 / 10" }}><div style={{ textAlign: "center" }}><Icon name="map" size={26} style={{ opacity: 0.5 }} /><div className="mono" style={{ fontSize: 10.5, marginTop: 6 }}>plano MDF v2 · actualizado 22 jun</div></div></div>
              </div>
            </div>
          )}
        </div>

        <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
          <div className="card ai-card">
            <Section title="Recomendaciones IA" right={<span className="ai-chip"><Icon name="sparkle" size={12} /> IA</span>} style={{ marginBottom: 12 }} />
            {e.recommendations.map((r, i) => (
              <div key={i} style={{ display: "flex", gap: 10, alignItems: "flex-start", padding: "9px 0", borderBottom: i < e.recommendations.length - 1 ? "1px solid var(--line)" : "none" }}>
                <span className={"sev " + r.level} style={{ marginTop: 5 }} />
                <span style={{ fontSize: 12.5, color: "var(--text-2)", lineHeight: 1.5 }}>{r.text}</span>
              </div>
            ))}
          </div>
          <div className="card" style={{ padding: 18 }}>
            <Section title="Evidencia más reciente" style={{ marginBottom: 12 }} />
            <div className="evi-grid" style={{ gridTemplateColumns: "1fr 1fr" }}>
              <PhotoTile photo={v.photos.antes[0]} tag="antes" />
              <PhotoTile photo={v.photos.despues[0]} tag="después" />
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

// ---- shared topology renderer (used by expediente + wizard) ----
function TopoCanvas({ topo }) {
  return (
    <div className="topo">
      <svg style={{ position: "absolute", inset: 0, width: "100%", height: "100%" }} viewBox="0 0 100 100" preserveAspectRatio="none">
        {topo.links.map(([a, b], i) => {
          const na = topo.nodes.find(n => n.id === a), nb = topo.nodes.find(n => n.id === b);
          return <line key={i} x1={na.x} y1={na.y} x2={nb.x} y2={nb.y} stroke="color-mix(in oklch, var(--zamna) 55%, transparent)" strokeWidth="0.5" vectorEffect="non-scaling-stroke" />;
        })}
      </svg>
      {topo.nodes.map(n => (
        <div key={n.id} className="topo-node" style={{ left: n.x + "%", top: n.y + "%" }}>
          <span className="tn-ic"><Icon name={n.icon} size={19} /></span>
          <small>{n.label}</small>
        </div>
      ))}
    </div>
  );
}

Object.assign(window, { ZamDash, ZamProjects, ZamClients, ZamAgenda, ZamExpediente, PhotoTile, TopoCanvas, MiniStat, zInits: inits });
