/* ============================================================
   Shell — Sidebar nav + Topbar + Status bar
   ============================================================ */

const NAV_GROUPS = [
  {
    label: "Operación",
    items: [
      { id: "mapa",    label: "Mapa",               icon: "map" },
      { id: "rebote",  label: "Inferencia de Ruta", icon: "waypoints" },
      { id: "candado", label: "Candado",            icon: "lock" },
    ],
  },
  {
    label: "Marcaciones",
    items: [
      { id: "registrar", label: "Registrar placa", icon: "shield-plus" },
      { id: "alertas",   label: "Alertas",         icon: "bell-ring", unread: true },
    ],
  },
  {
    label: "Administración",
    items: [
      { id: "nodos", label: "Operatividad", icon: "router" },
    ],
  },
];

const NAV_ALL_IDS = NAV_GROUPS.flatMap(g => g.items).map(i => i.id);

const SonarSidebar = ({ current, onNav, plate, theme, onToggleTheme, unreadAlerts = 0, operador = null, onLogout }) => {
  // Paneles habilitados (de /api/config). Los no habilitados se ven bloqueados con candado.
  const enabledScreens = (window.SONAR_FEATURES && window.SONAR_FEATURES.enabledScreens) || NAV_ALL_IDS;
  const [tip, setTip] = React.useState(null);   // tooltip "Próximamente" de los bloqueados
  return (
    <React.Fragment>
    <aside className="sonar-nav">
      {NAV_GROUPS.map((group, gi) => (
        <React.Fragment key={group.label}>
          <div className="sonar-nav__group-label" style={gi > 0 ? { marginTop: 12 } : undefined}>
            {group.label}
          </div>
          {group.items.map(item => {
            const locked = !enabledScreens.includes(item.id);
            const disabled = item.disabled || locked || (item.needsPlate && !plate);
            return (
              <button
                key={item.id}
                className={`sonar-nav__item ${disabled ? "sonar-nav__item--disabled" : ""}`}
                aria-current={current === item.id ? "true" : "false"}
                aria-disabled={disabled}
                onClick={() => !disabled && onNav(item.id)}
                onMouseEnter={e => { if (locked) { const r = e.currentTarget.getBoundingClientRect(); setTip({ x: r.right, y: r.top + r.height / 2 }); } }}
                onMouseLeave={() => setTip(null)}
              >
                <window.Icon name={item.icon}/>
                <span>{item.label}</span>
                {locked ? (
                  <span className="sonar-nav__lock"><window.Icon name="lock-keyhole" size={13}/></span>
                ) : (
                  <React.Fragment>
                    {item.id === "mapa" && plate && plate.marcaciones.length > 0 && (
                      <span className="sonar-nav__counter">!</span>
                    )}
                    {item.unread && unreadAlerts > 0 && (
                      <span className="sonar-nav__counter">{unreadAlerts}</span>
                    )}
                  </React.Fragment>
                )}
              </button>
            );
          })}
        </React.Fragment>
      ))}

      {/* Logo agrupado (Gobierno + Interior), centrado en el hueco entre
          Operatividad y el divisor del operador. */}
      <div className="sonar-nav__spacer"></div>
      <div className="sonar-nav__partner">
        <img src="assets/gobierno-quindio.png" alt="Gobierno del Quindío"/>
        <img className="sonar-nav__partner-interior" src="assets/interior.jpg" alt="Interior"/>
      </div>
      <div className="sonar-nav__spacer"></div>
      <div className="sonar-nav__footer">
        <div className="sonar-nav__profile">
          <div className="sonar-nav__avatar">
            <window.Icon name="user-round" size={14}/>
          </div>
          <div className="sonar-nav__profile-info">
            <span className="sonar-nav__profile-name">{operador || "Operador (Analista)"}</span>
            <button className="sonar-nav__logout" onClick={onLogout}>
              <window.Icon name="log-out" size={12}/>
              <span>Cerrar sesión</span>
            </button>
          </div>
        </div>
        <div className="sonar-nav__session">
          <window.Icon name="clock" size={13}/>
          <span>En sesión</span>
          <SessionTime/>
        </div>
      </div>
      <div className="sonar-nav__version">Guardian Sonar v1.0.0</div>
    </aside>
    {tip && <div className="sonar-nav__tip" style={{ left: tip.x + 10, top: tip.y }}>Próximamente</div>}
    </React.Fragment>
  );
};

// Contador de tiempo en sesión (cuenta hacia arriba en vivo).
// Contador de la sesión actual: arranca en 0 y cuenta hacia arriba. Sin login real
// todavía, así que se reinicia en cada recarga de la página (al remontar el componente).
const SessionTime = () => {
  const [secs, setSecs] = React.useState(0);
  React.useEffect(() => {
    const id = setInterval(() => setSecs(s => s + 1), 1000);
    return () => clearInterval(id);
  }, []);
  const hh = String(Math.floor(secs / 3600)).padStart(2, "0");
  const mm = String(Math.floor((secs % 3600) / 60)).padStart(2, "0");
  const ss = String(secs % 60).padStart(2, "0");
  return <span className="sonar-nav__session-val">{hh}:{mm}:{ss}</span>;
};

const SonarTopbar = ({ screen, plate, onClearPlate, theme, onToggleTheme }) => {
  const allItems = NAV_GROUPS.flatMap(g => g.items);
  const item = allItems.find(n => n.id === screen);
  return (
    <header className="sonar-topbar">
      <div className="sonar-topbar__title">
        <span className="sonar-topbar__heading">{item ? item.label : "Sonar"}</span>
      </div>

      {plate && false && (
        <div className="surface" style={{
          display: "flex", alignItems: "center", gap: 10, padding: "6px 10px 6px 14px"
        }}>
          <span style={{ fontSize: 10, letterSpacing: 1.4, color: "var(--g-text-mute-dark)" }}>RASTREO ACTIVO</span>
          <span className="plate plate--sm">{plate.placa}</span>
          {plate.marcaciones.length > 0 && <span className="badge badge--alert">!</span>}
          <button className="btn btn--ghost" style={{ padding: "4px 8px" }} onClick={onClearPlate}>
            <window.Icon name="x"/>
          </button>
        </div>
      )}

      <div className="sonar-topbar__spacer"></div>

      <div className="sonar-topbar__chip">
        <span className="dot"></span>
        <span>SISTEMA EN LÍNEA</span>
      </div>
      <div className="sonar-topbar__chip">
        <window.Icon name="cpu"/>
        <span>GuardianIA · v3.0.0</span>
      </div>
      <div className="sonar-topbar__chip">
        <window.Icon name="map-pin"/>
        <span>QUINDÍO · {window.SONAR_NODES.length} nodos</span>
      </div>
      <button className="sonar-topbar__chip sonar-topbar__theme" onClick={onToggleTheme}
        title={theme === "claro" ? "Cambiar a oscuro" : "Cambiar a claro"}>
        <window.Icon name={theme === "claro" ? "moon" : "sun"} size={14}
          color={theme === "claro" ? "var(--g-celadon)" : "var(--g-signal-yellow)"}/>
        <span>Apariencia</span>
      </button>
    </header>
  );
};

const SonarStatusBar = ({ screen, plate }) => {
  const total = window.SONAR_NODES.length;
  const active = window.SONAR_NODES.filter(n => n.status === "active").length;
  const alerts = window.SONAR_NODES.filter(n => n.status === "alert").length;
  const offline = window.SONAR_NODES.filter(n => n.status === "inactive").length;
  // Nombre legible de la vista (no el id interno: rebote→Inferencia de Ruta, nodos→Operatividad).
  const vista = (NAV_GROUPS.flatMap(g => g.items).find(n => n.id === screen) || {}).label || screen;
  return (
    <footer className="sonar-status">
      <span><span className="sonar-status__pulse"></span>SONAR · ESCUCHANDO</span>
      <span className="sonar-status__sep">│</span>
      <span>NODOS {active}/{total} ACTIVOS</span>
      <span className="sonar-status__sep">│</span>
      <span style={{ color: "var(--g-signal-red-soft)" }}>{alerts} con alerta</span>
      <span className="sonar-status__sep">│</span>
      <span>Capturas hoy: {(window.SONAR_NODES.reduce((s,n)=>s+n.activity,0) * 14).toLocaleString("es-CO")}</span>
      <span style={{ marginLeft: "auto" }}>
        Vista: <span style={{ color: "var(--g-text-cream)" }}>{vista.toUpperCase()}</span>
        {plate && <> · placa <span style={{ color: "var(--accent, var(--g-celadon))" }}>{plate.placa}</span></>}
      </span>
    </footer>
  );
};

/* ============================================================
   SonarSegmented — switch segmentado ESTÁNDAR (animado).
   Indicador deslizante que se desplaza/redimensiona al botón activo.
   API: value, onChange, options=[{ id, label, icon, badge? }].
   Lo usan Operatividad y Registrar placa (mismo diseño en todo el sistema).
   ============================================================ */
const SonarSegmented = ({ value, onChange, options = [] }) => {
  const wrapRef = React.useRef(null);
  const btnRefs = React.useRef({});
  const [ind, setInd] = React.useState({ left: 0, top: 0, width: 0, height: 0, ready: false });

  // Firma estable: solo recalcula cuando cambia el seleccionado o los badges/opciones.
  const sig = options.map(o => `${o.id}:${o.badge != null ? o.badge : ""}`).join("|");
  const measure = React.useCallback(() => {
    const el = btnRefs.current[value];
    const wrap = wrapRef.current;
    if (!el || !wrap) return;
    const er = el.getBoundingClientRect();
    const wr = wrap.getBoundingClientRect();
    setInd({ left: er.left - wr.left, top: er.top - wr.top, width: er.width, height: er.height, ready: true });
  }, [value]);

  React.useLayoutEffect(() => { measure(); }, [measure, sig]);
  React.useEffect(() => {
    window.addEventListener("resize", measure);
    return () => window.removeEventListener("resize", measure);
  }, [measure]);

  return (
    <div ref={wrapRef} style={{
      position: "relative", display: "inline-flex", padding: 4, gap: 4,
      borderRadius: "var(--g-radius-pill)", border: "1px solid var(--g-border-on-dark)",
      background: "var(--g-surface-on-dark)",
    }}>
      {/* Indicador deslizante animado que cubre EXACTAMENTE el botón activo */}
      <div style={{
        position: "absolute", left: ind.left, top: ind.top, width: ind.width, height: ind.height,
        opacity: ind.ready ? 1 : 0, background: "var(--accent, var(--g-celadon))",
        borderRadius: "var(--g-radius-pill)", pointerEvents: "none",
        transition: "left 320ms var(--ease-slide, cubic-bezier(0.32, 0.72, 0, 1)), top 320ms var(--ease-slide, cubic-bezier(0.32, 0.72, 0, 1)), width 320ms var(--ease-slide, cubic-bezier(0.32, 0.72, 0, 1)), height 320ms var(--ease-slide, cubic-bezier(0.32, 0.72, 0, 1))",
      }}/>
      {options.map(o => {
        const sel = value === o.id;
        return (
          <button type="button" key={o.id} ref={el => { btnRefs.current[o.id] = el; }} onClick={() => onChange(o.id)} style={{
            position: "relative", zIndex: 1, display: "inline-flex", alignItems: "center", gap: 8,
            padding: "10px 20px", border: 0, background: "transparent", cursor: "pointer",
            borderRadius: "var(--g-radius-pill)", fontFamily: "var(--font-sans)", fontSize: 14,
            fontWeight: 700, letterSpacing: 0.2, whiteSpace: "nowrap",
            color: sel ? "#04141b" : "var(--g-text-mute-dark)", transition: "color 220ms var(--ease-slide, ease)",
          }}>
            <window.Icon name={o.icon} size={15}/>{o.label}
            {o.badge != null && <span style={{
              fontSize: 11, fontWeight: 600, fontVariantNumeric: "tabular-nums", padding: "1px 7px", borderRadius: 999,
              background: sel ? "rgba(4,20,27,0.22)" : "rgba(127,134,142,0.18)",
              color: sel ? "#04141b" : "var(--g-text-mute-dark)",
            }}>{o.badge}</span>}
          </button>
        );
      })}
    </div>
  );
};

window.SonarSidebar = SonarSidebar;
window.SonarTopbar = SonarTopbar;
window.SonarStatusBar = SonarStatusBar;
window.SonarSegmented = SonarSegmented;
