/* SkyOps — Keyboard system: global shortcuts, G-sequences, Esc layering, ⌘↵ submit, shortcuts overlay.
   Page-scoped keys (Review) stay in their pages but use skyKeyBlocked() to avoid conflicts. */

const KY_MAC = /Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent);
const skyMod = KY_MAC ? "⌘" : "Ctrl";
const skyIsTyping = (e) => { const t = e.target; return !!t && (/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName) || t.isContentEditable); };
const skyLayerOpen = () => !!document.querySelector(".ni-scrim, .wo-scrim, .ky-scrim");
/* True when a single-key page shortcut must NOT fire */
const skyKeyBlocked = (e) => e.metaKey || e.ctrlKey || e.altKey || skyIsTyping(e) || skyLayerOpen() || window.__kySeq;

const KY_NAV = [["p", "portfolio", "Portfolio"], ["s", "sites", "Sites"], ["i", "inspections", "Inspections"], ["w", "workorders", "Work orders"], ["f", "fleet", "Fleet & crew"],
  ["a", "alerts", "Alerts"], ["c", "calendar", "Calendar"], ["r", "zonereport", "Reports"], ["t", "compare", "Temporal intelligence"], ["y", "warranty", "Warranty claims"], ["m", "commercial", "Commercial"], [",", "settings", "Settings"], ["u", "profile", "My profile"]];

const KY_GROUPS = () => [
  ["Global", [[[skyMod, "K"], "Command bar · search, navigate, ask"], [["/"], "Focus command bar"], [[skyMod, "\\"], "Collapse / expand sidebar"], [[skyMod, "J"], "Open / close Argus panel"], [["N"], "New inspection"], [["?"], "Show this list"], [["Esc"], "Close the top dialog, drawer or panel"], [[skyMod, "↵"], "Confirm the open dialog (primary button)"]]],
  ["Go to  ·  press G, then", KY_NAV.map(([k, , l]) => [["G", k === "," ? "," : k.toUpperCase()], l])],
  ["Review · detections", [[["J"], "Next detection"], [["K"], "Previous detection"], [["↓ / ↑"], "Next / previous"], [["A"], "Accept"], [["R"], "Reject"], [["C"], "Reclassify"], [["U"], "Assign to me"], [["["], "Thermal image"], [["]"], "RGB image"], [["\\"], "Side by side"]]],
  ["Forms & lists", [[["↵"], "Send message / add note (Argus, logs, Temporal)"], [["⇧", "↵"], "New line in Argus"], [["Tab"], "Next field"]]],
];

function KyKeys({ keys }) { return <span className="ky-keys">{keys.map((k, i) => <React.Fragment key={i}>{i > 0 && keys[0] === "G" && <em>then</em>}<kbd>{k}</kbd></React.Fragment>)}</span>; }

function KyOverlay() {
  const [open, setOpen] = React.useState(false);
  const [q, setQ] = React.useState("");
  const [seq, setSeq] = React.useState(false);
  React.useEffect(() => {
    const o = () => { setQ(""); setOpen(true); };
    const s = (e) => setSeq(e.detail);
    const c = () => setOpen(false);
    window.addEventListener("skyops:keys", o); window.addEventListener("skyops:keyseq", s); window.addEventListener("skyops:keys-close", c);
    return () => { window.removeEventListener("skyops:keys", o); window.removeEventListener("skyops:keyseq", s); window.removeEventListener("skyops:keys-close", c); };
  }, []);
  const groups = KY_GROUPS().map(([g, items]) => [g, items.filter(([k, l]) => !q || (l + " " + k.join(" ")).toLowerCase().includes(q.toLowerCase()))]).filter(([, it]) => it.length);
  return <>
    {seq && <div className="ky-seq"><kbd>G</kbd><span>then</span>{KY_NAV.slice(0, 8).map(([k, , l]) => <span key={k}><kbd>{k.toUpperCase()}</kbd>{l}</span>)}<span className="sec">… ? for all</span></div>}
    {open && <div className="ky-scrim" onClick={() => setOpen(false)}><div className="ky-modal" role="dialog" aria-label="Keyboard shortcuts" onClick={e => e.stopPropagation()}>
      <div className="ky-hd"><b>Keyboard shortcuts</b><input autoFocus className="inp" value={q} onChange={e => setQ(e.target.value)} placeholder="Filter shortcuts"/><button className="ask-hd-btn" onClick={() => setOpen(false)} aria-label="Close"><Icon name="x" size={13}/></button></div>
      <div className="ky-body">{groups.map(([g, items]) => <section key={g}><div className="caps">{g}</div>{items.map(([k, l]) => <div key={l + k.join()} className="ky-row"><span>{l}</span><KyKeys keys={k}/></div>)}</section>)}
        {!groups.length && <div className="sec" style={{ padding: 20 }}>No shortcut matches “{q}”.</div>}</div>
      <div className="ky-ft sec">Single-key shortcuts are ignored while typing in a field or when a dialog is open. {KY_MAC ? "" : "On Windows/Linux use Ctrl in place of ⌘."}</div>
    </div></div>}
  </>;
}

(function kyInit() {
  if (window.__kyInit) return; window.__kyInit = true;
  let seqT = null;
  const endSeq = () => { window.__kySeq = false; clearTimeout(seqT); window.dispatchEvent(new CustomEvent("skyops:keyseq", { detail: false })); };
  const go = (r) => window.dispatchEvent(new CustomEvent("skyops:go", { detail: r }));
  const closeTop = () => {
    if (document.querySelector(".ky-scrim")) { window.dispatchEvent(new CustomEvent("skyops:keys-close")); return true; }
    const modals = document.querySelectorAll(".ni-scrim"); if (modals.length) { modals[modals.length - 1].click(); return true; }
    const dr = document.querySelector(".wo-drawer .ask-hd-btn"); if (dr) { dr.click(); return true; }
    const sc = document.querySelector(".wo-scrim"); if (sc) { sc.click(); return true; }
    if (window.agStore && window.agStore.v && window.agStore.v.open) { window.agStore.set(x => ({ ...x, open: false })); return true; }
    return false;
  };
  window.addEventListener("keydown", (e) => {
    if (e.defaultPrevented) return;
    const mod = e.metaKey || e.ctrlKey;
    if (e.key === "Escape") {
      if (document.activeElement && document.activeElement.closest && document.activeElement.closest(".in-bar")) return;
      if (document.querySelector(".tb-pop")) return; // topbar menus handle their own Esc
      if (closeTop()) e.preventDefault();
      if (window.__kySeq) endSeq();
      return;
    }
    if (mod && e.key === "Enter") {
      const ms = document.querySelectorAll(".ni-modal"); const m = ms[ms.length - 1];
      const b = m && m.querySelector(".ni-ft .btn-primary:not(:disabled)");
      if (b) { e.preventDefault(); b.click(); }
      return;
    }
    if (mod || e.altKey || skyIsTyping(e)) return;
    if (window.__kySeq) {
      const hit = KY_NAV.find(([k]) => k === e.key.toLowerCase());
      endSeq();
      if (hit) { e.preventDefault(); e.stopImmediatePropagation(); go(hit[1]); }
      return;
    }
    if (skyLayerOpen()) return;
    if (e.key === "?") { e.preventDefault(); window.dispatchEvent(new CustomEvent("skyops:keys")); return; }
    if (e.key === "/") { e.preventDefault(); window.dispatchEvent(new KeyboardEvent("keydown", { key: "k", metaKey: true, ctrlKey: true })); return; }
    if (e.key === "g" || e.key === "G") { e.preventDefault(); e.stopImmediatePropagation(); window.__kySeq = true; window.dispatchEvent(new CustomEvent("skyops:keyseq", { detail: true })); seqT = setTimeout(endSeq, 1500); return; }
    if (e.key === "n" || e.key === "N") { e.preventDefault(); window.dispatchEvent(new CustomEvent("skyops:new-insp", { detail: {} })); return; }
  }, true);
  const host = document.createElement("div"); host.id = "ky-root"; document.body.appendChild(host);
  ReactDOM.createRoot(host).render(<KyOverlay/>);
})();

Object.assign(window, { skyMod, skyIsTyping, skyKeyBlocked, skyLayerOpen, KY_GROUPS });
