/* MycoPolicy — UI components */
const { useState, useEffect, useMemo, useRef, useCallback } = React;

const STATUS = window.MP_STATUS_DEFS;
const ROLES = window.MP_ROLES;

// ─── ICONS ──────────────────────────────────────────────────────────────
const Ico = {
  search: (p) => <svg className={p?.cls || 'ico'} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5"><circle cx="7" cy="7" r="5"/><path d="m14 14-3-3"/></svg>,
  arrow: (p) => <svg className={p?.cls || 'ico'} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5"><path d="M3 8h10m-4-4 4 4-4 4"/></svg>,
  check: (p) => <svg className={p?.cls || 'ico'} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="2"><path d="m3 8 3 3 7-7"/></svg>,
  x: (p) => <svg className={p?.cls || 'ico'} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5"><path d="M4 4l8 8M12 4l-8 8"/></svg>,
  external: (p) => <svg className={p?.cls || 'ico'} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5"><path d="M6 3h7v7M13 3 7 9M11 10v3H3V5h3"/></svg>,
  alert: (p) => <svg className={p?.cls || 'ico'} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5"><path d="M8 1.5 1.5 13h13L8 1.5zM8 6v3M8 11v.5"/></svg>,
  doc: (p) => <svg className={p?.cls || 'ico'} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5"><path d="M3 1h7l3 3v11H3z"/><path d="M10 1v3h3"/></svg>,
  map: (p) => <svg className={p?.cls || 'ico'} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5"><path d="M1 4l5-2 4 2 5-2v10l-5 2-4-2-5 2z"/><path d="M6 2v10M10 4v10"/></svg>,
};

// ─── STATUS BADGE ───────────────────────────────────────────────────────
function StatusBadge({ status, size }) {
  const def = STATUS[status];
  if (!def) return null;
  return (
    <span className={`badge ${def.badge}`} style={size === 'lg' ? { fontSize: 12, padding: '5px 10px' } : {}}>
      <span className="dot" /> {def.label}
    </span>
  );
}

// ─── STATUS BAND ────────────────────────────────────────────────────────
function StatusBand({ states, onPick }) {
  const groups = useMemo(() => {
    const buckets = {
      active_licensing: { def: STATUS.active_licensing, list: [] },
      enacted_not_open: { def: STATUS.enacted_not_open, list: [] },
      limited_pilot_or_research: { def: STATUS.limited_pilot_or_research, list: [] },
      watchlist: { def: STATUS.watchlist, list: [] }
    };
    states.forEach(s => { if (buckets[s.status]) buckets[s.status].list.push(s); });
    return Object.values(buckets);
  }, [states]);

  return (
    <section className="status-band">
      <div className="wrap">
        <div className="cards">
          {groups.map(({ def, list }) => (
            <div key={def.key} className="status-card" onClick={() => onPick(def.key)}>
              <div className={`indicator ${def.stripe}`} />
              <div className="top">
                <span className="head">{def.label}</span>
                <StatusBadge status={def.key} />
              </div>
              <div className="count">{list.length}</div>
              <div className="states">
                {list.length === 0
                  ? <em style={{ color: 'var(--muted-2)' }}>None</em>
                  : list.slice(0, 4).map(s => s.state).join(', ') + (list.length > 4 ? ` +${list.length - 4} more` : '')
                }
              </div>
              <div className="filter-link">Filter to these ›</div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

// ─── STATE CARD ────────────────────────────────────────────────────────
function StateCard({ state, onOpen }) {
  const def = STATUS[state.status];
  const enrich = state.enrich;
  const verified = enrich?.last_verified || '2026-05-23';
  return (
    <div className="state-card" onClick={() => onOpen(state)}>
      <div className="head-row">
        <div>
          <div className="state-name">{state.state}</div>
        </div>
        <span className="state-postal">{state.postal}</span>
      </div>
      <StatusBadge status={state.status} />
      <p className="state-summary">{state.summary}</p>
      <div className="apply-row">
        {state.commercial_license_available
          ? <span className="apply-yes"><Ico.check /> Apply now</span>
          : <span className="apply-no">{def.short}</span>
        }
        <span className="state-arrow">→</span>
      </div>
      <div className="state-meta">
        <span>Verified {verified}</span>
        {state.license_paths.length > 0 && <span>· {state.license_paths.length} paths</span>}
      </div>
    </div>
  );
}

// ─── FILTERS ────────────────────────────────────────────────────────────
function Filters({ q, setQ, statusFilter, setStatusFilter, roleFilter, setRoleFilter, applyOnly, setApplyOnly, count, states, onReset }) {
  const statusKeys = ['all', 'active_licensing', 'enacted_not_open', 'limited_pilot_or_research', 'trigger_law', 'local_deprioritization_only', 'watchlist', 'prohibited_no_pathway'];
  const counts = useMemo(() => {
    const c = { all: states.length };
    states.forEach(s => { c[s.status] = (c[s.status] || 0) + 1; });
    return c;
  }, [states]);

  return (
    <div className="filters">
      <div className="filter-row">
        <div className="mini-search">
          <Ico.search />
          <input
            placeholder="Search any state…"
            value={q}
            onChange={(e) => setQ(e.target.value)}
          />
          {q && <button className="clear" onClick={() => setQ('')}>clear</button>}
        </div>
        <div className="seg">
          <button className={applyOnly ? 'active' : ''} onClick={() => setApplyOnly(!applyOnly)}>
            <Ico.check /> Apply now only
          </button>
        </div>
        <span style={{ flex: 1 }} />
        <span style={{ fontFamily: 'var(--font-mono)', fontSize: 11.5, color: 'var(--muted)' }}>
          <strong style={{ color: 'var(--ink)' }}>{count}</strong> / {states.length} jurisdictions
        </span>
      </div>

      <div className="filter-row">
        <span className="filter-label">Status</span>
        <div className="seg" style={{ flexWrap: 'wrap' }}>
          {statusKeys.map(k => (
            <button key={k}
                    className={statusFilter === k ? 'active' : ''}
                    onClick={() => setStatusFilter(k)}>
              {k === 'all' ? 'All' : STATUS[k].short}
              <span className="seg-count">{counts[k] || 0}</span>
            </button>
          ))}
        </div>
      </div>

      <div className="filter-row">
        <span className="filter-label">Role</span>
        <div className="chips">
          <button className={`chip ${!roleFilter ? 'active' : ''}`} onClick={() => setRoleFilter(null)}>
            Any role
          </button>
          {ROLES.map(r => (
            <button key={r.key}
                    className={`chip ${roleFilter === r.key ? 'active' : ''}`}
                    onClick={() => setRoleFilter(roleFilter === r.key ? null : r.key)}>
              {r.label}
              {roleFilter === r.key && <span className="x">×</span>}
            </button>
          ))}
        </div>
      </div>

      {(q || statusFilter !== 'all' || roleFilter || applyOnly) && (
        <div className="reset-row">
          <div className="left">
            <span>Active filters:</span>
            {statusFilter !== 'all' && <strong>{STATUS[statusFilter].short}</strong>}
            {roleFilter && <strong>{ROLES.find(r => r.key === roleFilter)?.label}</strong>}
            {applyOnly && <strong>Apply now only</strong>}
            {q && <strong>“{q}”</strong>}
          </div>
          <button onClick={onReset} style={{ background: 'none', border: 'none', color: 'var(--green)', fontFamily: 'var(--font-mono)', fontSize: 11, textTransform: 'uppercase', letterSpacing: '0.08em', fontWeight: 600, cursor: 'pointer' }}>
            ↺ Clear all
          </button>
        </div>
      )}
    </div>
  );
}

// ─── DETAIL DRAWER ─────────────────────────────────────────────────────
function DetailDrawer({ state, onClose, onReportCorrection }) {
  useEffect(() => {
    const onKey = (e) => { if (e.key === 'Escape') onClose(); };
    if (state) {
      document.addEventListener('keydown', onKey);
      document.body.style.overflow = 'hidden';
    }
    return () => {
      document.removeEventListener('keydown', onKey);
      document.body.style.overflow = '';
    };
  }, [state, onClose]);

  const isOpen = !!state;
  const enrich = state?.enrich;

  const qaRow = (key, label) => {
    const ans = enrich?.can_apply?.[key] || (state?.commercial_license_available && state.applicable_roles?.includes(key) ? 'yes' : 'no');
    return { label, ans };
  };

  return (
    <React.Fragment>
      <div className={`drawer-scrim ${isOpen ? 'open' : ''}`} onClick={onClose} />
      <aside className={`drawer ${isOpen ? 'open' : ''}`} role="dialog" aria-modal="true">
        {state && (
          <React.Fragment>
            <div className="drawer-head">
              <div className="crumb">State page · {state.postal}</div>
              <button className="drawer-close" onClick={onClose} aria-label="Close">×</button>
            </div>
            <div className="drawer-body">
              <h1 className="detail-h1">
                {state.state}
                <span className="postal">{state.postal}</span>
              </h1>
              <div className="detail-status-row">
                <StatusBadge status={state.status} size="lg" />
                {state.commercial_license_available && (
                  <span className="apply-yes" style={{ fontSize: 12 }}><Ico.check /> Applications open</span>
                )}
                <span style={{ fontFamily: 'var(--font-mono)', fontSize: 11, color: 'var(--muted)', textTransform: 'uppercase', letterSpacing: '0.08em' }}>
                  Verified {enrich?.last_verified || '2026-05-23'}
                </span>
              </div>

              <div className="detail-summary">{state.summary}</div>

              <div className="detail-section">
                <div className="detail-section-title">Can I apply now?</div>
                <div className="qa-grid">
                  {[
                    qaRow('cultivator', 'Cultivator'),
                    qaRow('manufacturer', 'Product manufacturer'),
                    qaRow('service_center', 'Service / Healing center'),
                    qaRow('clinician', 'Clinician / Facilitator'),
                    qaRow('lab', 'Testing laboratory'),
                    qaRow('research', 'Research / hospital pathway')
                  ].map((r, i) => (
                    <div className="qa" key={i}>
                      <span className="q">{r.label}</span>
                      <span className={`a ${r.ans === 'yes' ? 'y' : r.ans === 'watch' ? 'w' : 'n'}`}>
                        {r.ans === 'yes' ? 'YES' : r.ans === 'watch' ? 'WATCH' : 'NO'}
                      </span>
                    </div>
                  ))}
                </div>
              </div>

              {enrich?.regulator && (
                <div className="detail-section">
                  <div className="detail-section-title">Regulator</div>
                  <div style={{ fontFamily: 'var(--font-serif)', fontSize: 16, color: 'var(--ink)', fontWeight: 600 }}>{enrich.regulator}</div>
                </div>
              )}

              <div className="detail-section">
                <div className="detail-section-title">License paths</div>
                {enrich?.paths_detail?.length > 0
                  ? enrich.paths_detail.map((p, i) => (
                      <div key={i} className="license-card">
                        <div style={{ flex: 1 }}>
                          <div className="lc-name">{p.name}</div>
                          <div style={{ fontSize: 13, color: 'var(--ink-2)', marginTop: 4, lineHeight: 1.45 }}>{p.auth}</div>
                          <div className="lc-meta">For: {p.who} · {p.regulator}</div>
                        </div>
                        <a href={p.source} target="_blank" rel="noopener noreferrer" className="lc-cta" style={{ borderBottom: 'none', whiteSpace: 'nowrap' }}>
                          Source ↗
                        </a>
                      </div>
                    ))
                  : <div className="empty-paths">
                      <strong>No open license path found</strong>
                      {state.user_next_step}
                    </div>
                }
              </div>

              {enrich?.watch?.length > 0 && (
                <div className="detail-section">
                  <div className="detail-section-title">What to watch</div>
                  <ul style={{ margin: 0, paddingLeft: 18, fontSize: 13.5, color: 'var(--ink-2)', lineHeight: 1.65 }}>
                    {enrich.watch.map((w, i) => <li key={i} style={{ padding: '2px 0' }}>{w}</li>)}
                  </ul>
                </div>
              )}

              {enrich?.sources?.length > 0 && (
                <div className="detail-section">
                  <details className="source-drawer" open>
                    <summary>
                      <span>Sources used <span style={{ color: 'var(--muted)', fontWeight: 500, marginLeft: 6 }}>({enrich.sources.length})</span></span>
                      <span className="marker">›</span>
                    </summary>
                    <ol>
                      {enrich.sources.map((s, i) => (
                        <li key={i}>
                          <a href={s.url} target="_blank" rel="noopener noreferrer">{s.label}</a>
                          <div style={{ fontFamily: 'var(--font-mono)', fontSize: 10.5, color: 'var(--muted-2)', wordBreak: 'break-all', marginTop: 2 }}>{s.url}</div>
                        </li>
                      ))}
                    </ol>
                  </details>
                </div>
              )}

              <div className="disclaimer">
                <strong>Not legal advice</strong>
                MycoPolicy provides public policy information. Controlled-substance laws can change quickly and may differ across state, local, federal, and tribal jurisdictions. Confirm requirements with the relevant regulator and qualified counsel before acting.
              </div>

              <div className="drawer-correction-link">
                See something outdated or wrong on this page?
                {' '}
                <button onClick={() => { onClose(); onReportCorrection?.(state.state); }}>
                  Submit a correction ↗
                </button>
              </div>
            </div>
          </React.Fragment>
        )}
      </aside>
    </React.Fragment>
  );
}

Object.assign(window, {
  StatusBadge, StatusBand, StateCard, Filters, DetailDrawer, Ico
});
