// Incident.jsx — full-screen incident detail overlay.
// Composes Video feed + Alarm Fusion stack + Timeline + Response actions
// (Drone dispatch · LRAD · Ground unit · Geofence). Triggers drone flights
// on the parent map via onDispatchDrone callback.

const { useState, useEffect, useRef } = React;

// ─── Sensor feed ─────────────────────────────────────────────────────
// No fake footage: each channel is a drop target for a real frame/still from
// that source. HUD chips sit on top and stay readable over any image.
const FEED_CHANNELS = [
  { id: "visual",   label: "Visual",   spec: "4K · 30 fps" },
  { id: "thermal",  label: "Thermal",  spec: "640 × 512 · 9 Hz" },
  { id: "spectrum", label: "Spectrum", spec: "RF waterfall" },
  { id: "acoustic", label: "Acoustic", spec: "48 kHz array" },
];
function VideoFeed({ cam, setCam, t, label }) {
  const ch = FEED_CHANNELS.find(c => c.id === cam) || FEED_CHANNELS[0];
  return (
    <div>
      <div className="video feed">
        <image-slot key={ch.id} id={"lattice-feed-" + ch.id} shape="rect" fit="cover"
          placeholder={"Drop a frame from the " + ch.label.toLowerCase() + " source"}></image-slot>
        <div className="feed__hud feed__hud--tl"><b>{ch.label}</b><span>{ch.spec}</span></div>
        <div className="feed__hud feed__hud--tr">{t}</div>
        <div className="feed__hud feed__hud--bl"><span className="dot" style={{ color: "var(--destructive)" }}/>{label}</div>
        <div className="feed__hud feed__hud--br"><span className="video__rec"/>Live</div>
      </div>
      <div className="video__cams">
        {FEED_CHANNELS.map(c => (
          <button key={c.id} className={"video__cam" + (ch.id === c.id ? " video__cam--on" : "")} onClick={() => setCam && setCam(c.id)}>{c.label}</button>
        ))}
      </div>
    </div>
  );
}

// ─── Alarm fusion stack ─────────────────────────────────────────────
function FusionStack({ tick }) {
  // Confidence values per signal — vary subtly with tick.
  const wobble = (base, amp) => Math.max(0.05, Math.min(0.99, base + (Math.sin(tick * 0.4 + base * 10) * amp)));
  const signals = [
    ["camera",   wobble(0.92, 0.03), "var(--info)"],
    ["radar",    wobble(0.84, 0.04), "var(--info)"],
    ["RF",       wobble(0.66, 0.05), "var(--warning)"],
    ["acoustic", wobble(0.41, 0.06), "var(--muted-foreground)"],
    ["lidar",    wobble(0.78, 0.04), "var(--info)"],
  ];
  // Fused = weighted Dempster-Shafer-ish blend (cosmetic).
  const fused = Math.min(0.97, 0.55 * signals[0][1] + 0.18 * signals[1][1] + 0.10 * signals[2][1] + 0.05 * signals[3][1] + 0.12 * signals[4][1]);

  return (
    <div className="card">
      <div className="card__head">
        <div className="card__title">Alarm fusion · Dempster-Shafer</div>
        <span className="pill pill--crit">CONFIRMED</span>
      </div>
      <div className="fusion__rows">
        {signals.map(([name, conf, color]) => (
          <div className="fusion__row" key={name}>
            <span className="fusion__name">{name}</span>
            <div className="fusion__bar"><span style={{ width: `${conf*100}%`, background: color }}/></div>
            <span className="fusion__val">{conf.toFixed(2)}</span>
          </div>
        ))}
        <div className="fusion__row fusion__row--fused">
          <span className="fusion__name">fused</span>
          <div className="fusion__bar"><span style={{ width: `${fused*100}%` }}/></div>
          <span className="fusion__val">{fused.toFixed(2)}</span>
        </div>
      </div>
      <div className="fusion__class">
        <span className="dot" style={{ color: "var(--destructive)" }}/>
        <span style={{ flex: 1 }}>class · <code>object · unclassified</code></span>
        <span className="muted mono" style={{ fontSize: 10 }}>intent-flow-1.4</span>
      </div>
    </div>
  );
}

// ─── Timeline (correlated events) ───────────────────────────────────
function Timeline({ events, t, setT, duration }) {
  const headPct = (t / duration) * 100;
  return (
    <div className="card">
      <div className="card__head">
        <div className="card__title">Timeline · feed ↔ events</div>
        <span className="muted mono" style={{ fontSize: 10 }}>t = {Math.floor(t)}s / {duration}s</span>
      </div>
      <div className="timeline">
        <div className="timeline__track" onClick={(e) => {
          const r = e.currentTarget.getBoundingClientRect();
          setT(((e.clientX - r.left) / r.width) * duration);
        }}>
          <div className="timeline__bar"/>
          <div className="timeline__fill" style={{ width: headPct + "%" }}/>
          {events.map((ev, i) => (
            <div key={i} className="timeline__mark" data-sev={ev.sev}
                 style={{ left: ((ev.at / duration) * 100) + "%" }}
                 title={ev.title}/>
          ))}
          <div className="timeline__head" style={{ left: headPct + "%" }}/>
          {[0, 0.25, 0.5, 0.75, 1].map(p => (
            <div key={p} className="timeline__tick" style={{ left: (p*100) + "%" }}>{Math.floor(p*duration)}s</div>
          ))}
        </div>
        <div style={{ marginTop: 24, display:"flex", flexDirection:"column", gap: 4 }}>
          {events.slice(0, 5).map((ev, i) => (
            <div key={i} className="row" style={{ fontSize: 11, gap: 8 }}>
              <span className="muted mono" style={{ width: 36 }}>{Math.floor(ev.at)}s</span>
              <span className={"pill " + (ev.sev === "crit" ? "pill--crit" : ev.sev === "warn" ? "pill--warn" : "pill--info")}>{ev.sev}</span>
              <span style={{ flex: 1 }}>{ev.title}</span>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

// ─── Drone dispatch ─────────────────────────────────────────────────
function DroneDispatch({ onDispatch, dispatched, originXY, targetXY, targetCity }) {
  const drones = [
    { id: "FR-01", role: "survey",    battery: 92, eta: "0:48", payload: "visual + thermal" },
    { id: "FR-02", role: "overwatch", battery: 76, eta: "1:12", payload: "visual" },
    { id: "FR-03", role: "relay",     battery: 64, eta: "0:54", payload: "comms relay" },
  ];
  return (
    <div className="card resp-card">
      <div className="resp-card__title"><Icon name="sparkles" size={12}/> Flight response</div>
      <div className="muted" style={{ fontSize: 11, marginBottom: 8 }}>
        Target: <code>{targetCity}</code> · range 2.4 km
      </div>
      {drones.map(d => {
        const out = dispatched.includes(d.id);
        return (
          <div className={"drone-row" + (out ? " drone-row--out" : "")} key={d.id}>
            <Icon name="circle" size={12} style={{ color: out ? "var(--success)" : "var(--muted-foreground)" }}/>
            <div className="col" style={{ gap: 1 }}>
              <span className="drone-row__id">{d.id}</span>
              <span className="drone-row__sub">{d.role} · {d.payload}</span>
            </div>
            <span className="drone-row__battery"><span style={{ width: d.battery + "%", background: d.battery > 50 ? "var(--success)" : "var(--warning)" }}/></span>
            <span className="drone-row__metric">ETA {d.eta}</span>
            <button className="drone-row__btn" disabled={out}
                    onClick={() => onDispatch(d, originXY, targetXY)}>
              {out ? "EN ROUTE" : "Dispatch"}
            </button>
          </div>
        );
      })}
    </div>
  );
}

// ─── LRAD control ──────────────────────────────────────────────────
function LRADControl() {
  const [bearing, setBearing] = useState(72);
  const [range, setRange]     = useState(280);
  const [mode, setMode]       = useState("voice");
  const [armed, setArmed]     = useState(false);
  return (
    <div className="card resp-card">
      <div className="resp-card__title"><Icon name="alert-circle" size={12}/> Deterrent · directional</div>
      <div className="lrad-wrap">
        <div className="lrad-compass">
          <div className="lrad-compass__cone" style={{ transform: `rotate(${bearing - 90}deg)` }}/>
          {[0,45,90,135,180,225,270,315].map(deg => (
            <div key={deg} className="lrad-compass__tick" style={{ transform: `translate(-50%, 0) rotate(${deg}deg)` }}/>
          ))}
          <div className="lrad-compass__hub"/>
          <div className="lrad-compass__labels">
            <span style={{ top: 4, left: "50%", transform: "translateX(-50%)" }}>N</span>
            <span style={{ right: 6, top: "50%", transform: "translateY(-50%)" }}>E</span>
            <span style={{ bottom: 4, left: "50%", transform: "translateX(-50%)" }}>S</span>
            <span style={{ left: 6,  top: "50%", transform: "translateY(-50%)" }}>W</span>
          </div>
        </div>
        <div className="lrad-controls">
          <div className="lrad-controls__row">
            <label><span>Bearing</span><span className="mono">{bearing}°</span></label>
            <input type="range" min="0" max="359" value={bearing} onChange={(e) => setBearing(+e.target.value)}/>
          </div>
          <div className="lrad-controls__row">
            <label><span>Range</span><span className="mono">{range} m</span></label>
            <input type="range" min="50" max="500" step="10" value={range} onChange={(e) => setRange(+e.target.value)}/>
          </div>
          <div className="lrad-modes">
            {["pre-alert","voice","tone"].map(m => (
              <button key={m} className={"lrad-mode" + (mode === m ? " lrad-mode--on" : "")} onClick={() => setMode(m)}>
                {m}
              </button>
            ))}
          </div>
        </div>
      </div>
      <button className={"lrad-arm" + (armed ? " lrad-arm--armed" : "")} onClick={() => setArmed(v => !v)}>
        {armed ? "● ARMED · " + mode + " · " + bearing + "° " + range + "m" : "Arm deterrent"}
      </button>
    </div>
  );
}

// ─── Ground unit & geofence quick actions ───────────────────────────
function QuickActions() {
  return (
    <div className="card resp-card">
      <div className="resp-card__title"><Icon name="users" size={12}/> Ground response</div>
      <div className="col" style={{ gap: 6 }}>
        <div className="drone-row">
          <Icon name="users" size={12} style={{ color: "var(--muted-foreground)" }}/>
          <div className="col" style={{ gap: 1 }}>
            <span className="drone-row__id">Ground team G-2</span>
            <span className="drone-row__sub">2 responders · 4.2 km · ETA 6:30</span>
          </div>
          <span className="drone-row__metric">on-call</span>
          <span></span>
          <button className="drone-row__btn">Notify</button>
        </div>
        <div className="drone-row">
          <Icon name="layers" size={12} style={{ color: "var(--muted-foreground)" }}/>
          <div className="col" style={{ gap: 1 }}>
            <span className="drone-row__id">Geofence GF-417</span>
            <span className="drone-row__sub">polygon · 14 vertices · 1.8 ha</span>
          </div>
          <span className="drone-row__metric muted">active</span>
          <span></span>
          <button className="drone-row__btn" style={{ background: "transparent", color: "var(--destructive)", borderColor: "var(--destructive)" }}>
            Restrict zone
          </button>
        </div>
      </div>
    </div>
  );
}

// ─── Tactical map (Leaflet mini-map showing drone flights in real geo) ──
function TacticalMap({ target, origin, flights }) {
  const ref = useRef(null);
  const mapRef = useRef(null);
  const droneMarkersRef = useRef({});

  // Init
  useEffect(() => {
    if (!ref.current || mapRef.current) return;
    const map = L.map(ref.current, {
      center: [target.lat, target.lng],
      zoom: 8, minZoom: 2, maxZoom: 14,
      zoomControl: false, attributionControl: false,
      preferCanvas: true, fadeAnimation: false,
    });
    const dk = document.documentElement.classList.contains("dark");
    L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_" + (dk ? "Dark" : "Light") + "_Gray_Base/MapServer/tile/{z}/{y}/{x}", {
      maxZoom: 16,
    }).addTo(map);
    mapRef.current = map;
    return () => { map.remove(); mapRef.current = null; droneMarkersRef.current = {}; };
  }, []);

  // Re-render static overlays (target, origin, trails) on flight change
  useEffect(() => {
    if (!mapRef.current) return;
    const map = mapRef.current;
    // Strip non-tile, non-drone layers
    map.eachLayer(l => {
      if (l instanceof L.TileLayer) return;
      const drone = Object.values(droneMarkersRef.current).includes(l);
      if (!drone) map.removeLayer(l);
    });

    // Target marker
    L.marker([target.lat, target.lng], {
      icon: L.divIcon({
        className: "lat-marker-wrap",
        html: `<div class="lat-marker lat-marker--crit">
                 <span class="lat-marker__halo"></span>
                 <span class="lat-marker__core"></span>
                 <span class="lat-marker__pulse"></span>
                 <span class="lat-marker__label">${target.city}</span>
               </div>`,
        iconSize: [14, 14], iconAnchor: [7, 7],
      }),
    }).addTo(map);
    // Origin (drone base)
    L.marker([origin.lat, origin.lng], {
      icon: L.divIcon({
        className: "lat-marker-wrap",
        html: `<div class="lat-marker lat-marker--ok">
                 <span class="lat-marker__core" style="background:#fbbf24;box-shadow:0 0 0 1.5px var(--card),0 0 8px #fbbf24"></span>
                 <span class="lat-marker__label" style="color:#fbbf24">BASE</span>
               </div>`,
        iconSize: [14, 14], iconAnchor: [7, 7],
      }),
    }).addTo(map);
    // Trails
    flights.forEach(f => {
      L.polyline([[f.from[1], f.from[0]], [f.to[1], f.to[0]]], {
        color: "#fbbf24", weight: 1.4, opacity: 0.7, dashArray: "3 4",
      }).addTo(map);
    });

    // Fit bounds
    const pts = [[target.lat, target.lng], [origin.lat, origin.lng]];
    flights.forEach(f => { pts.push([f.from[1], f.from[0]]); pts.push([f.to[1], f.to[0]]); });
    const bounds = L.latLngBounds(pts);
    try { map.invalidateSize(false); const s = map.getSize(); if (s.x && s.y) map.fitBounds(bounds, { padding: [30, 30], maxZoom: 10, animate: false }); } catch {}
  }, [target, origin, flights]);

  // Manage drone markers (add new, remove gone)
  useEffect(() => {
    if (!mapRef.current) return;
    const map = mapRef.current;
    // Add markers for new flights
    flights.forEach(f => {
      if (droneMarkersRef.current[f.id]) return;
      const m = L.marker([f.from[1], f.from[0]], {
        icon: L.divIcon({
          className: "lat-drone-wrap",
          html: `<div class="lat-drone">
                   <span class="lat-drone__icon">▲</span>
                   <span class="lat-drone__label">${f.drone.id.slice(-2)}</span>
                 </div>`,
          iconSize: [14, 14], iconAnchor: [7, 7],
        }),
      }).addTo(map);
      droneMarkersRef.current[f.id] = m;
    });
    // Remove markers for gone flights
    Object.keys(droneMarkersRef.current).forEach(id => {
      if (!flights.find(f => f.id === id)) {
        map.removeLayer(droneMarkersRef.current[id]);
        delete droneMarkersRef.current[id];
      }
    });
  }, [flights]);

  // Animate
  useEffect(() => {
    if (!mapRef.current || flights.length === 0) return;
    let raf;
    const tick = () => {
      flights.forEach(f => {
        const m = droneMarkersRef.current[f.id]; if (!m) return;
        const p = Math.min(1, (Date.now() - f.startedAt) / 8000);
        const lng = f.from[0] + (f.to[0] - f.from[0]) * p;
        const lat = f.from[1] + (f.to[1] - f.from[1]) * p;
        m.setLatLng([lat, lng]);
        const bearing = Math.atan2(f.to[0] - f.from[0], f.to[1] - f.from[1]) * 180 / Math.PI;
        const el = m.getElement()?.querySelector(".lat-drone__icon");
        if (el) el.style.transform = `translate(-50%, -50%) rotate(${bearing}deg)`;
      });
      raf = requestAnimationFrame(tick);
    };
    raf = requestAnimationFrame(tick);
    return () => cancelAnimationFrame(raf);
  }, [flights]);

  return (
    <div className="card tactical-map">
      <div className="card__head">
        <div className="card__title">Tactical view · {target.city}</div>
        <span className="muted mono" style={{ fontSize: 10 }}>
          <span className="dot" style={{ color: flights.length ? "var(--warning)" : "var(--muted-foreground)" }}/> {flights.length} in flight
        </span>
      </div>
      <div ref={ref} className="tactical-map__canvas"/>
    </div>
  );
}

// ─── Main Incident screen ──────────────────────────────────────────
function Incident({ incident, onClose, onDispatchDrone, dispatched, flights = [], tick }) {
  const [t, setT] = useState(38);
  const [cam, setCam] = useState("visual");

  // Auto-advance timeline
  useEffect(() => {
    const i = setInterval(() => setT(v => (v + 0.5) % 120), 500);
    return () => clearInterval(i);
  }, []);

  // Esc to close
  useEffect(() => {
    const fn = (e) => { if (e.key === "Escape") onClose(); };
    window.addEventListener("keydown", fn);
    return () => window.removeEventListener("keydown", fn);
  }, [onClose]);

  const events = [
    { at:   0, sev: "info", title: "perimeter sensor armed" },
    { at:  18, sev: "info", title: "radar ping · 0.42 RCS at 220m" },
    { at:  26, sev: "warn", title: "RF emitter detected · 433 MHz" },
    { at:  34, sev: "warn", title: "visual motion · GF-417 zone B" },
    { at:  38, sev: "crit", title: "geofence breach · unclassified object" },
    { at:  42, sev: "crit", title: "fusion confirmed · confidence 0.81" },
    { at:  46, sev: "info", title: "auto-escalated to operator" },
  ];

  const targetNode = incident.node || { id: "LAT-AF-02", city: "Nairobi", lng: 36.82, lat: -1.29 };
  const originNode = { id: "BASE-AF-CENTRAL", city: "Nakuru base", lng: 36.07, lat: -0.30 };

  const timestamp = () => {
    const now = new Date();
    const hh = String(now.getUTCHours()).padStart(2, "0");
    const mm = String(now.getUTCMinutes()).padStart(2, "0");
    const ss = String(now.getUTCSeconds()).padStart(2, "0");
    return `${hh}:${mm}:${ss}Z`;
  };

  return (
    <div className="incident-scrim" onClick={(e) => { if (e.target === e.currentTarget) onClose(); }}>
      <div className="incident">
        <div className="incident__head">
          <button className="incident__back" onClick={onClose}>
            <Icon name="arrow-right" size={12} style={{ transform: "rotate(180deg)" }}/> Back
          </button>
          <div className="col" style={{ gap: 2 }}>
            <div className="incident__id">INC-AF02-2026.05.15.{Math.floor(11_42 + tick / 6)}</div>
            <div className="incident__title">
              <span className="dot dot--pulse" style={{ color: "var(--destructive)" }}/>
              Geofence breach · {targetNode.city}
              <span className="pill pill--crit">CRIT · 0.81</span>
              <span className="muted mono" style={{ fontSize: 11 }}>4m 17s elapsed</span>
            </div>
          </div>
          <div className="incident__head-right">
            <button className="btn" style={{ background: "var(--card)", border: "1px solid var(--border)", padding: "6px 10px", fontSize: 12 }}>
              <Icon name="arrow-up-right" size={12}/> Escalate
            </button>
            <button className="btn" style={{ background: "var(--destructive)", color: "var(--destructive-foreground)", border: "1px solid var(--destructive)", padding: "6px 10px", fontSize: 12 }}>
              <Icon name="bell" size={12}/> Broadcast
            </button>
          </div>
        </div>

        <div className="incident__body">
          <div className="incident__col incident__col--scroll">
            <VideoFeed cam={cam} setCam={setCam} t={timestamp()} label="Detection · 0.94"/>
            <FusionStack tick={tick}/>
            <Timeline events={events} t={t} setT={setT} duration={60}/>
          </div>

          <div className="incident__col incident__col--scroll">
            <DroneDispatch
              onDispatch={(d) => onDispatchDrone(d, [originNode.lng, originNode.lat], [targetNode.lng, targetNode.lat])}
              dispatched={dispatched}
              targetCity={targetNode.city}
              originXY={[originNode.lng, originNode.lat]}
              targetXY={[targetNode.lng, targetNode.lat]}
            />
            <LRADControl/>
            <MapBoundary className="card"><TacticalMap target={targetNode} origin={originNode} flights={flights}/></MapBoundary>
            <QuickActions/>
          </div>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { Incident, VideoFeed, FusionStack, Timeline, DroneDispatch, LRADControl, QuickActions, TacticalMap });
