/* global React */
const { useState, useRef, useEffect } = React;

/* ============================================================
   P-01 · Audit  —  five questions, every one pass/fail
   ============================================================ */
function Audit({ items, summary }) {
  const [openIdx, setOpenIdx] = useState(null);
  return (
    <div className="prim">
      <div className="prim-head">
        <span className="prim-label"><span className="n">P-01</span> · Audit</span>
        <span className="prim-caption">5/5 passing · auto-run on every piece</span>
      </div>
      <div className="audit">
        {items.map((it, i) => (
          <div
            key={i}
            className="audit-row"
            data-open={openIdx === i}
            onClick={() => setOpenIdx(openIdx === i ? null : i)}
          >
            <div className="idx">Q{String(i + 1).padStart(2, "0")}</div>
            <div className="q">
              <div className="q-text">{it.q}</div>
              <div className="q-note">↳ {it.note}</div>
            </div>
            <div className="status"><span className="mark"></span>Pass</div>
          </div>
        ))}
      </div>
      <div className="audit-summary">
        <span>Voice Audit Test · v1.2</span>
        <span><strong>5 of 5</strong> · ratified by founder</span>
      </div>
    </div>
  );
}

/* ============================================================
   P-02 · Gate sequence
   ============================================================ */
function Gates({ stages }) {
  return (
    <div className="prim">
      <div className="prim-head">
        <span className="prim-label"><span className="n">P-02</span> · Gate sequence</span>
        <span className="prim-caption">3 layers · all required</span>
      </div>
      <div className="gates">
        {stages.map((s, i) => (
          <div className="gate" key={i}>
            <div className="gate-n">G{i + 1} · {s.kind}</div>
            <h4 className="gate-name">{s.name}</h4>
            <div className="gate-actor">{s.actor}</div>
            <p className="gate-desc">{s.desc}</p>
            {i < stages.length - 1 && (
              <span className="gate-flow" aria-hidden="true">
                <svg width="14" height="14" viewBox="0 0 14 14" fill="none">
                  <path d="M1 7h12M8 2l5 5-5 5" stroke="var(--fg-faint)" strokeWidth="1" strokeLinecap="square"/>
                </svg>
              </span>
            )}
          </div>
        ))}
      </div>
    </div>
  );
}

/* ============================================================
   P-03 · Canon bundle (the four files)
   ============================================================ */
function Bundle({ files }) {
  const [openIdx, setOpenIdx] = useState(null);
  const total = files.reduce((sum, f) => sum + f.bytes, 0);
  const totalKb = (total / 1024).toFixed(1);
  return (
    <div className="prim">
      <div className="prim-head">
        <span className="prim-label"><span className="n">P-03</span> · Canon bundle</span>
        <span className="prim-caption">4 files · {totalKb} kb total · open any</span>
      </div>
      <div className="bundle">
        <div className="bundle-bar">
          <span>content-captain / canon</span>
          <span>ratified 2026.04.02</span>
        </div>
        <div className="bundle-files">
          {files.map((f, i) => (
            <div
              className={`bundle-file ${openIdx === i ? "open" : ""}`}
              key={i}
              onClick={() => setOpenIdx(openIdx === i ? null : i)}
            >
              <div className="bf-head">
                <span className="bf-name">{f.name}</span>
                <span className="bf-size">{(f.bytes / 1024).toFixed(2)} kb</span>
              </div>
              <p className="bf-desc">{f.desc}</p>
              <span className="bf-open">{openIdx === i ? "Close" : "Open file →"}</span>
              <div className="bf-body">{f.body}</div>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

/* ============================================================
   P-04 · Refusal marker
   ============================================================ */
function Refusal({ kind, struck, replacement }) {
  return (
    <div className="refusal">
      <div className="ref-label"><span className="x"></span>Refused · {kind}</div>
      <div className="ref-body">{struck}</div>
      <div className="ref-replacement">
        <strong>What ships instead</strong>
        {replacement}
      </div>
    </div>
  );
}

/* ============================================================
   P-05 · Contrast ladder
   ============================================================ */
function Ladder({ left, right }) {
  return (
    <div className="prim">
      <div className="prim-head">
        <span className="prim-label"><span className="n">P-05</span> · Contrast ladder</span>
        <span className="prim-caption">most companies · LVRD</span>
      </div>
      <div className="ladder">
        <div className="ladder-col">
          <div className="l-label">{left.label}</div>
          <h4>{left.title}</h4>
          <ul>
            {left.items.map((t, i) => (
              <li key={i}><span className="num">{String(i + 1).padStart(2, "0")}</span><span>{t}</span></li>
            ))}
          </ul>
        </div>
        <div className="ladder-col featured">
          <div className="l-label">{right.label}</div>
          <h4>{right.title}</h4>
          <ul>
            {right.items.map((t, i) => (
              <li key={i}><span className="num">{String(i + 1).padStart(2, "0")}</span><span>{t}</span></li>
            ))}
          </ul>
        </div>
      </div>
    </div>
  );
}

/* ============================================================
   P-06 · Pivot quote
   ============================================================ */
function Pivot({ children, attr }) {
  return (
    <div className="pivot">
      <div className="pivot-mark">Load-bearing</div>
      <blockquote>{children}</blockquote>
      {attr && <div className="pivot-attr">{attr}</div>}
    </div>
  );
}

/* ============================================================
   P-07 · Cadence strip
   ============================================================ */
function Cadence({ weeks }) {
  return (
    <div className="prim">
      <div className="prim-head">
        <span className="prim-label"><span className="n">P-07</span> · Cadence</span>
        <span className="prim-caption">52-week roll · one piece per heartbeat</span>
      </div>
      <div className="cadence">
        {weeks.map((w, i) => (
          <div key={i} className={`cad-week ${w.state}`} title={w.label}>
            <span className="cad-label">{w.label}</span>
          </div>
        ))}
      </div>
      <div className="cad-legend">
        <span><i className="swatch s-ship"></i>Shipped</span>
        <span><i className="swatch s-miss"></i>Missed · named</span>
        <span><i className="swatch s-now"></i>This piece</span>
      </div>
    </div>
  );
}

/* ============================================================
   P-08 · Margin standard  —  inline gutter annotation
   Used as <P withMargin tag="W2" note="...">…</P>
   ============================================================ */
function ParaWithMargin({ tag, note, children }) {
  return (
    <p className="with-margin">
      {children}
      <span className="margin-note" contentEditable={false}>
        <span className="mn-tag">{tag}</span><br />{note}
      </span>
    </p>
  );
}

/* ============================================================
   P-09 · File chip
   ============================================================ */
function FChip({ children }) {
  return <span className="fchip">{children}</span>;
}

/* ============================================================
   P-10 · Standards table
   ============================================================ */
function Standards({ rows }) {
  return (
    <div className="prim">
      <div className="prim-head">
        <span className="prim-label"><span className="n">P-10</span> · Standards</span>
        <span className="prim-caption">W1–W5 · applied to this piece</span>
      </div>
      <div className="standards">
        {rows.map((r, i) => (
          <div className="std-row" key={i}>
            <div className="std-key">{r.key}</div>
            <div className="std-text"><strong>{r.name}.</strong> {r.def}</div>
            <div className="std-status"><span className="mark"></span>Holds</div>
          </div>
        ))}
      </div>
    </div>
  );
}

Object.assign(window, {
  Audit, Gates, Bundle, Refusal, Ladder, Pivot, Cadence,
  ParaWithMargin, FChip, Standards
});
