// Terminal Atlas page — one page per shipping facility (carrier hub, cold storage,
// dry storage, port, etc.). Doubles as a Trojan horse for driver acquisition:
// drivers searching "UPS Commerce City driver entrance" land here.
//
// Pulls live data from Supabase: entity, attributes, status log, recent tips,
// recent wait-time reports. Submission widgets write back to the DB.

const { useState: useStateT, useEffect: useEffectT, useMemo: useMemoT } = React;

function TerminalPage({ slug, onNav }) {
  const [terminal, setTerminal] = useStateT(null);
  const [parent, setParent] = useStateT(null);
  const [city, setCity] = useStateT(null);
  const [attrs, setAttrs] = useStateT([]);
  const [statusLog, setStatusLog] = useStateT([]);
  const [tips, setTips] = useStateT([]);
  const [waits, setWaits] = useStateT([]);
  const [loading, setLoading] = useStateT(true);
  const [waitInput, setWaitInput] = useStateT("");
  const [waitSubmitted, setWaitSubmitted] = useStateT(false);
  const [tipInput, setTipInput] = useStateT("");
  const [tipRole, setTipRole] = useStateT("driver");
  const [tipSeverity, setTipSeverity] = useStateT("moderate");
  const [tipPublic, setTipPublic] = useStateT(false);
  const [tipEmail, setTipEmail] = useStateT("");
  const [tipSubmitted, setTipSubmitted] = useStateT(false);
  const [tipToken, setTipToken] = useStateT(null);

  useEffectT(() => {
    if (!window.SI_DB) { setLoading(false); return; }

    (async () => {
      const ents = await window.SI_DB.raw.select(
        "entities",
        `select=*&slug=eq.${encodeURIComponent(slug)}`
      );
      if (!ents || !ents.length) { setLoading(false); return; }
      const t = ents[0];
      setTerminal(t);

      const [parentEnts, cityRows, attrRows, logRows, tipRows, waitRows] = await Promise.all([
        t.parent_id
          ? window.SI_DB.raw.select("entities", `select=slug,name&id=eq.${t.parent_id}`)
          : Promise.resolve([]),
        t.primary_city_id
          ? window.SI_DB.raw.select("cities", `select=*&id=eq.${t.primary_city_id}`)
          : Promise.resolve([]),
        window.SI_DB.raw.select(
          "entity_attributes",
          `select=key,value&entity_id=eq.${t.id}&order=key.asc`
        ),
        window.SI_DB.raw.select(
          "facility_status_log",
          `select=*&entity_id=eq.${t.id}&order=start_date.desc&limit=5`
        ),
        window.SI_DB.raw.select(
          "intel_submissions",
          `select=raw_text,submitter_role,parsed_intel_type,created_at&facility_id=eq.${t.id}&status=eq.verified&order=created_at.desc&limit=20`
        ),
        window.SI_DB.raw.select(
          "wait_time_reports",
          `select=minutes,created_at&facility_id=eq.${t.id}&order=created_at.desc&limit=12`
        ),
      ]);

      setParent(parentEnts && parentEnts[0]);
      setCity(cityRows && cityRows[0]);
      setAttrs(attrRows || []);
      setStatusLog(logRows || []);
      setTips(tipRows || []);
      setWaits(waitRows || []);
      setLoading(false);
    })();
  }, [slug]);

  const attrMap = useMemoT(() => {
    const m = {};
    attrs.forEach((a) => { m[a.key] = a.value; });
    return m;
  }, [attrs]);

  // Current status: most recent open log row whose end_date is null or in future
  const currentStatus = useMemoT(() => {
    const now = new Date().toISOString().slice(0, 10);
    return statusLog.find((s) => !s.end_date || s.end_date >= now);
  }, [statusLog]);

  const avgWait = useMemoT(() => {
    if (!waits.length) return null;
    const total = waits.reduce((a, w) => a + w.minutes, 0);
    return Math.round(total / waits.length);
  }, [waits]);

  function timeAgo(iso) {
    const ms = Date.now() - new Date(iso).getTime();
    const m = Math.floor(ms / 60000);
    if (m < 60) return `${m}m ago`;
    const h = Math.floor(m / 60);
    if (h < 24) return `${h}h ago`;
    const d = Math.floor(h / 24);
    return `${d}d ago`;
  }

  async function submitWait(e) {
    e.preventDefault();
    const minutes = parseInt(waitInput, 10);
    if (!minutes || minutes < 0 || minutes > 600) return;
    await window.SI_DB.submitWaitTime(terminal.id, minutes);
    setWaitInput("");
    setWaitSubmitted(true);
    // Refetch
    const newWaits = await window.SI_DB.raw.select(
      "wait_time_reports",
      `select=minutes,created_at&facility_id=eq.${terminal.id}&order=created_at.desc&limit=12`
    );
    setWaits(newWaits || []);
  }

  function generateToken() {
    // 32 chars of alphanumeric — short enough for a URL, long enough to be unguessable
    const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    let t = "";
    const arr = new Uint8Array(32);
    (window.crypto || window.msCrypto).getRandomValues(arr);
    for (let i = 0; i < 32; i++) t += chars[arr[i] % chars.length];
    return t;
  }

  async function submitTip(e) {
    e.preventDefault();
    if (!tipInput.trim()) return;
    const token = generateToken();
    await window.SI_DB.submitIntel({
      facility_id: terminal.id,
      carrier_id: terminal.parent_id,
      city_id: terminal.primary_city_id,
      submitter_role: tipRole,
      raw_text: tipInput.trim(),
      severity: tipSeverity,
      visibility: tipPublic ? "public" : "sealed",
      submitter_token: token,
      submitter_email: tipEmail.trim() || null,
      status: "pending",
    });
    setTipInput("");
    setTipEmail("");
    setTipPublic(false);
    setTipToken(token);
    setTipSubmitted(true);
  }

  if (loading) {
    return (
      <div className="terminal-page" style={{ padding: 80, textAlign: "center", color: "var(--ink-soft)" }}>
        Loading terminal…
      </div>
    );
  }

  if (!terminal) {
    return (
      <div className="terminal-page" style={{ padding: 80, textAlign: "center" }}>
        <h2 style={{ fontFamily: "var(--font-serif)", fontSize: 32, marginBottom: 12 }}>Terminal not found</h2>
        <p style={{ color: "var(--ink-soft)" }}>We don't have this facility in the atlas yet.</p>
        <button className="btn-primary" onClick={() => onNav("home")} style={{ marginTop: 24 }}>← Back home</button>
      </div>
    );
  }

  return (
    <div className="terminal-page">
      <style>{`
        .term-hero { padding: 56px 24px 28px; max-width: 1100px; margin: 0 auto; }
        .term-eyebrow { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.18em;
          text-transform: uppercase; color: var(--ink-soft); margin-bottom: 12px; }
        .term-title { font-family: var(--font-serif); font-size: 48px; line-height: 1.05;
          letter-spacing: -0.02em; margin: 0 0 8px; }
        .term-sub { color: var(--ink-soft); font-size: 17px; }
        .term-status-banner { background: oklch(0.94 0.06 50); border-left: 3px solid oklch(0.65 0.16 50);
          padding: 14px 18px; margin: 20px 0 0; border-radius: 4px; font-size: 14px; }
        .term-status-banner.closed { background: oklch(0.94 0.06 25); border-left-color: oklch(0.55 0.18 25); }
        .term-grid { max-width: 1100px; margin: 32px auto; padding: 0 24px;
          display: grid; grid-template-columns: 2fr 1fr; gap: 32px; }
        @media (max-width: 800px) { .term-grid { grid-template-columns: 1fr; } }
        .term-card { background: var(--paper); border: 1px solid var(--rule); border-radius: 6px; padding: 24px; }
        .term-card h3 { font-family: var(--font-serif); font-size: 22px; margin: 0 0 16px; letter-spacing: -0.01em; }
        .term-fact { display: flex; gap: 14px; padding: 10px 0; border-bottom: 1px solid var(--rule); font-size: 14px; }
        .term-fact:last-child { border-bottom: none; }
        .term-fact .k { width: 130px; flex-shrink: 0; color: var(--ink-soft); font-family: var(--font-mono); font-size: 11px;
          letter-spacing: 0.1em; text-transform: uppercase; padding-top: 2px; }
        .term-fact .v { color: var(--ink); }
        .term-wait-big { font-family: var(--font-serif); font-size: 56px; line-height: 1; margin: 0; letter-spacing: -0.02em; }
        .term-wait-unit { font-size: 18px; color: var(--ink-soft); margin-left: 6px; font-family: var(--font-sans); }
        .term-wait-meta { color: var(--ink-soft); font-size: 13px; margin-top: 4px; }
        .term-tip { padding: 14px 0; border-bottom: 1px solid var(--rule); }
        .term-tip:last-child { border-bottom: none; }
        .term-tip-text { color: var(--ink); font-size: 14px; line-height: 1.5; }
        .term-tip-meta { color: var(--ink-soft); font-size: 12px; font-family: var(--font-mono);
          letter-spacing: 0.05em; margin-top: 4px; text-transform: uppercase; }
        .term-form input, .term-form textarea, .term-form select {
          width: 100%; border: 1px solid var(--rule); border-radius: 4px;
          padding: 10px 12px; font-size: 14px; font-family: inherit; box-sizing: border-box; }
        .term-form textarea { min-height: 70px; resize: vertical; }
        .term-form-row { margin-bottom: 10px; }
        .term-form-submitted { color: oklch(0.55 0.14 145); font-size: 14px; padding: 12px;
          background: oklch(0.96 0.04 145); border-radius: 4px; }
        .term-back { display: inline-flex; align-items: center; gap: 6px; color: var(--ink-soft);
          font-size: 13px; margin-bottom: 20px; cursor: pointer; }
        .term-back:hover { color: var(--ink); }
      `}</style>

      <div className="term-hero">
        <a className="term-back" onClick={() => onNav("home")}>← Atlas home</a>
        <div className="term-eyebrow">
          {parent ? parent.name : "Independent"} · Terminal {city ? `· ${city.name}, ${city.state}` : ""}
        </div>
        <h1 className="term-title">{terminal.name}</h1>
        <p className="term-sub">{terminal.address || "Address not yet on file"}</p>

        {currentStatus && currentStatus.status !== "open" && (
          <div className={`term-status-banner ${currentStatus.status === "closed" ? "closed" : ""}`}>
            🚧 <strong style={{ textTransform: "capitalize" }}>{currentStatus.status.replace("_", " ")}</strong>
            {currentStatus.end_date ? ` through ${new Date(currentStatus.end_date).toLocaleDateString("en-US", { month: "short", year: "numeric" })}` : ""}
            {currentStatus.notes ? ` — ${currentStatus.notes}` : ""}
          </div>
        )}
      </div>

      <div className="term-grid">
        <div>
          <div className="term-card">
            <h3>Facility</h3>
            <div className="term-fact"><span className="k">Address</span><span className="v">{terminal.address || "—"}</span></div>
            {attrMap.driver_entrance && <div className="term-fact"><span className="k">Driver entrance</span><span className="v">{attrMap.driver_entrance}</span></div>}
            {attrMap.hours_driver && <div className="term-fact"><span className="k">Hours</span><span className="v">{attrMap.hours_driver}</span></div>}
            {attrMap.phone && <div className="term-fact"><span className="k">Phone</span><span className="v">{attrMap.phone}</span></div>}
            {attrMap.services && <div className="term-fact"><span className="k">Services</span><span className="v">{attrMap.services}</span></div>}
            {attrMap.aircraft_capacity && <div className="term-fact"><span className="k">Air capacity</span><span className="v">{attrMap.aircraft_capacity}</span></div>}
            {parent && <div className="term-fact"><span className="k">Operated by</span><span className="v">{parent.name}</span></div>}
          </div>

          <div className="term-card" style={{ marginTop: 20 }}>
            <h3>Driver tips ({tips.length})</h3>
            {tips.length === 0 ? (
              <p style={{ color: "var(--ink-soft)", fontSize: 14 }}>No tips yet — be the first.</p>
            ) : (
              tips.map((t, i) => (
                <div key={i} className="term-tip">
                  <div className="term-tip-text">"{t.raw_text}"</div>
                  <div className="term-tip-meta">{t.submitter_role} · {timeAgo(t.created_at)}</div>
                </div>
              ))
            )}

            <div style={{ marginTop: 18, paddingTop: 18, borderTop: "1px solid var(--rule)" }}>
              {tipSubmitted ? (
                <div className="term-form-submitted">
                  <div style={{ fontWeight: 600, marginBottom: 6 }}>✓ Tip submitted.</div>
                  <div style={{ fontSize: 13, color: "var(--ink-soft)", marginBottom: 8 }}>
                    Editor will review before publishing. Save this URL to manage or delete your submission later:
                  </div>
                  {tipToken && (
                    <code style={{ fontSize: 11, wordBreak: "break-all", display: "block", padding: 8, background: "var(--paper-2)", borderRadius: 4 }}>
                      {window.location.origin}/#/manage?token={tipToken}
                    </code>
                  )}
                </div>
              ) : (
                <form onSubmit={submitTip} className="term-form">
                  <div className="term-form-row">
                    <select value={tipRole} onChange={(e) => setTipRole(e.target.value)}>
                      <option value="driver">I'm a driver here</option>
                      <option value="dispatcher">I'm a dispatcher</option>
                      <option value="manager">I work here (other)</option>
                      <option value="shipper">I'm a shipper</option>
                      <option value="anonymous">Anonymous</option>
                    </select>
                  </div>
                  <div className="term-form-row">
                    <textarea
                      value={tipInput}
                      onChange={(e) => setTipInput(e.target.value)}
                      placeholder="Share a tip — dock numbers, contact names, hours, what to avoid…"
                    />
                  </div>
                  <div className="term-form-row">
                    <select value={tipSeverity} onChange={(e) => setTipSeverity(e.target.value)}>
                      <option value="low">Severity: Low — heads-up</option>
                      <option value="moderate">Severity: Moderate — recurring issue</option>
                      <option value="high">Severity: High — affecting many drivers</option>
                      <option value="critical">Severity: Critical — safety / urgent</option>
                    </select>
                  </div>
                  <label className="term-form-row" style={{ display: "flex", alignItems: "flex-start", gap: 8, fontSize: 13, color: "var(--ink)", lineHeight: 1.4, cursor: "pointer" }}>
                    <input type="checkbox" checked={tipPublic} onChange={(e) => setTipPublic(e.target.checked)} style={{ marginTop: 2, width: "auto" }} />
                    <span>
                      <strong>Publish this on the terminal page</strong> (anonymous — your name never shown). We'll also formally contact the carrier and post their response alongside.
                    </span>
                  </label>
                  <div className="term-form-row" style={{ fontSize: 12, color: "var(--ink-soft)", lineHeight: 1.5, padding: "8px 12px", background: "var(--paper-2)", borderRadius: 4 }}>
                    <strong>What happens to your tip:</strong> If unchecked, it's <em>sealed</em> — we use it as anonymous data ("Reports of [type], severity [level]") that the carrier sees as counts only, never your words. If checked, it's published as journalism (with carrier response). Either way, you can delete it any time.
                  </div>
                  <div className="term-form-row">
                    <input
                      type="email"
                      value={tipEmail}
                      onChange={(e) => setTipEmail(e.target.value)}
                      placeholder="Email (optional — only for managing/deleting your tip)"
                      style={{ width: "100%" }}
                    />
                  </div>
                  <button className="btn-primary" type="submit">Submit tip</button>
                </form>
              )}
            </div>
          </div>
        </div>

        <div>
          <div className="term-card">
            <h3>Live wait time</h3>
            {avgWait !== null ? (
              <>
                <p className="term-wait-big">{avgWait}<span className="term-wait-unit">min avg</span></p>
                <p className="term-wait-meta">Last {waits.length} reports · most recent {timeAgo(waits[0].created_at)}</p>
              </>
            ) : (
              <p style={{ color: "var(--ink-soft)" }}>No reports yet.</p>
            )}

            <div style={{ marginTop: 18, paddingTop: 18, borderTop: "1px solid var(--rule)" }}>
              {waitSubmitted ? (
                <div className="term-form-submitted">✓ Logged. Drivers behind you say thanks.</div>
              ) : (
                <form onSubmit={submitWait} className="term-form">
                  <div className="term-form-row" style={{ display: "flex", gap: 8 }}>
                    <input
                      type="number"
                      min="0"
                      max="600"
                      value={waitInput}
                      onChange={(e) => setWaitInput(e.target.value)}
                      placeholder="Currently waiting (min)"
                      style={{ flex: 1 }}
                    />
                    <button className="btn-primary" type="submit">Log</button>
                  </div>
                </form>
              )}
            </div>
          </div>

          {parent && (
            <div className="term-card" style={{ marginTop: 20 }}>
              <h3>This terminal feeds</h3>
              <p style={{ color: "var(--ink-soft)", fontSize: 14, lineHeight: 1.6 }}>
                Wait times, tips, and status changes here contribute to <strong>{parent.name}</strong>'s
                Infrastructure score{city ? ` in ${city.name}` : ""}.
              </p>
              {city && (
                <button
                  className="btn-ghost"
                  onClick={() => onNav("report")}
                  style={{ marginTop: 12 }}
                >View {city.name} report card →</button>
              )}
            </div>
          )}
        </div>
      </div>
    </div>
  );
}

window.TerminalPage = TerminalPage;
