// =========================================================
// DOCUMENTS WORKSPACE V2 — Phase 17
// -----------------------------------------------------------------
// Depth cap: Project → Documents → Document Detail.
// Three peer views: Overview / Library / Collections.
//
// Reads exclusively from pdata.documents[] (canonical) + a lightweight
// pdata.collections[] (which stores IDs, never copies). Every canonical
// item continues to carry Phase-12 `links: {stage, mission, feature, ...}`.
// Documents remain the source of truth: Research / Design / Development
// / Commercial reference the SAME document IDs.
// =========================================================

const DX_STATE = {
  'draft':       { tone: 'gray',   label: 'Draft'       },
  'in-review':   { tone: 'blue',   label: 'In review'   },
  'approved':    { tone: 'green',  label: 'Approved'    },
  'final':       { tone: 'green',  label: 'Final'       },
  'superseded':  { tone: 'gray',   label: 'Superseded'  },
};

// Type badges — deliberately monochrome. Type is visual variety in the
// preview, not a color. Every badge is neutral gray with a short mono
// code, in the tradition of the Development workspace's category badges.
const DX_KIND = {
  spec:       { short: 'SPEC', label: 'Specification' },
  brief:      { short: 'BRF',  label: 'Brief'         },
  doc:        { short: 'DOC',  label: 'Document'      },
  design:     { short: 'DES',  label: 'Design export' },
  data:       { short: 'DATA', label: 'Data'          },
  notes:      { short: 'NOTE', label: 'Notes'         },
  contract:   { short: 'CTR',  label: 'Contract'      },
  invoice:    { short: 'INV',  label: 'Invoice'       },
  transcript: { short: 'TRSC', label: 'Transcript'    },
  image:      { short: 'IMG',  label: 'Image'         },
  link:       { short: 'LINK', label: 'Web link'      },
  slide:      { short: 'DECK', label: 'Deck'          },
};

function dxKindMeta(kindKey)   { return DX_KIND[kindKey]   || { short: 'DOC', label: 'Document' }; }
function dxStateChip(state, size = 'sm') {
  const s = DX_STATE[state];
  if (!s) return null;
  return <Label tone={s.tone} dot size={size}>{s.label}</Label>;
}
function dxPortrait(name, pdata) {
  return (pdata.people || {})[(name || '').toLowerCase()]?.portrait || null;
}
function dxDocById(pdata, id) {
  return (pdata.documents || []).find(d => d.id === id);
}

// -----------------------------------------------------------------
// REALISTIC DOCUMENT PREVIEWS
// Each preview is a small production-oriented SVG. Deliberate variety
// per file type — never gray rectangles.
// -----------------------------------------------------------------

function DXPreview({ doc, size = 'md' }) {
  const kindKey = doc?.kindKey || 'doc';
  const W = 320, H = 200;
  const common = { viewBox: `0 0 ${W} ${H}`, width: '100%', height: '100%', preserveAspectRatio: 'xMidYMid slice' };

  // --- SPEC — paper cover with structured sections + margin note ---
  if (kindKey === 'spec') {
    return (
      <svg {...common}>
        <rect x="0" y="0" width={W} height={H} fill="#FDFDFD" />
        <rect x="0" y="0" width="4" height={H} fill="#2A85FF" opacity="0.55" />
        <text x="14" y="26" fontFamily="Inter" fontSize="9" fontWeight="700" letterSpacing="2" fill="var(--text-tertiary)">PRODUCT SPECIFICATION</text>
        <text x="14" y="50" fontFamily="Inter" fontSize="14" fontWeight="700" letterSpacing="-0.02em" fill="var(--text-primary)">Smart Project Brief</text>
        <text x="14" y="64" fontFamily="Inter" fontSize="10" fontWeight="500" letterSpacing="-0.015em" fill="var(--text-secondary)">v3 · Alireza Izadi · Sep 15</text>
        <line x1="14" y1="74" x2={W-14} y2="74" stroke="rgba(16,16,16,0.10)" />
        {[
          { y: 84,  bar: 68 }, { y: 96,  bar: 40 },
          { y: 112, bar: 72 }, { y: 124, bar: 44 },
          { y: 140, bar: 60 }, { y: 152, bar: 44 },
          { y: 168, bar: 76 }, { y: 180, bar: 40 },
        ].map((s, i) => (
          <g key={i}>
            <rect x="14" y={s.y - 6} width="4" height="4" rx="1" fill="rgba(42,133,255,0.55)" />
            <rect x="24" y={s.y - 6} width={s.bar} height="4" rx="1.5" fill="rgba(16,16,16,0.28)" />
            <rect x="24" y={s.y + 2} width={s.bar + 90} height="3" rx="1.5" fill="rgba(16,16,16,0.12)" />
            <rect x="24" y={s.y + 8} width={s.bar + 70} height="3" rx="1.5" fill="rgba(16,16,16,0.12)" />
          </g>
        ))}
        {/* Margin annotation */}
        <rect x={W-90} y="86" width="76" height="42" rx="6" fill="#FBFAF6" stroke="rgba(239,157,14,0.35)" />
        <rect x={W-84} y="94" width="30" height="3" rx="1" fill="#EF9D0E" />
        <rect x={W-84} y="102" width="62" height="3" rx="1" fill="rgba(16,16,16,0.24)" />
        <rect x={W-84} y="110" width="52" height="3" rx="1" fill="rgba(16,16,16,0.14)" />
        <rect x={W-84} y="118" width="46" height="3" rx="1" fill="rgba(16,16,16,0.14)" />
      </svg>
    );
  }

  // --- CONTRACT — paper cover with signature lines ---
  if (kindKey === 'contract') {
    return (
      <svg {...common}>
        <rect x="0" y="0" width={W} height={H} fill="#FDFDFD" />
        <rect x="0" y="0" width="4" height={H} fill="#EF9D0E" opacity="0.85" />
        <text x="14" y="26" fontFamily="Inter" fontSize="9" fontWeight="700" letterSpacing="2" fill="var(--text-tertiary)">MASTER AGREEMENT</text>
        <text x="14" y="52" fontFamily="Inter" fontSize="15" fontWeight="700" letterSpacing="-0.02em" fill="var(--text-primary)">Founding Partner × My Geni</text>
        <text x="14" y="68" fontFamily="Inter" fontSize="10" fontWeight="500" fill="var(--text-secondary)">Design-partner engagement</text>
        <line x1="14" y1="78" x2={W-14} y2="78" stroke="rgba(16,16,16,0.10)" />
        {[92, 104, 116, 128, 140].map((y, i) => (
          <rect key={i} x="14" y={y} width={i % 2 ? 220 : 240} height="3" rx="1.5" fill="rgba(16,16,16,0.12)" />
        ))}
        <text x="14" y="168" fontFamily="Inter" fontSize="9" fontWeight="700" letterSpacing="1.4" fill="var(--text-tertiary)">SIGNATURES</text>
        <line x1="14"  y1="184" x2="140" y2="184" stroke="rgba(16,16,16,0.30)" />
        <line x1={W-140} y1="184" x2={W-14} y2="184" stroke="rgba(16,16,16,0.30)" />
        <text x="77"     y="196" textAnchor="middle" fontFamily="Georgia" fontStyle="italic" fontSize="9" fill="var(--text-tertiary)">E. Marchetti</text>
        <text x={W-77}   y="196" textAnchor="middle" fontFamily="Georgia" fontStyle="italic" fontSize="9" fill="var(--text-tertiary)">P. Ramanathan</text>
      </svg>
    );
  }

  // --- INVOICE — line items + total ---
  if (kindKey === 'invoice') {
    return (
      <svg {...common}>
        <rect x="0" y="0" width={W} height={H} fill="#FDFDFD" />
        <text x="14" y="26" fontFamily="Inter" fontSize="9" fontWeight="700" letterSpacing="2" fill="var(--text-tertiary)">INVOICE</text>
        <text x="14" y="50" fontFamily="Inter" fontSize="16" fontWeight="700" letterSpacing="-0.02em" fill="var(--text-primary)">INV-041-002</text>
        <text x={W-14} y="26" textAnchor="end" fontFamily="Inter" fontSize="10" fontWeight="500" fill="var(--text-secondary)">Oct 02, 2026</text>
        <line x1="14" y1="60" x2={W-14} y2="60" stroke="rgba(16,16,16,0.10)" />
        {[72, 88, 104, 120].map((y, i) => (
          <g key={i}>
            <rect x="14"  y={y} width="130" height="4" rx="1.5" fill="rgba(16,16,16,0.14)" />
            <rect x={W-74} y={y} width="60"  height="4" rx="1.5" fill="rgba(16,16,16,0.24)" />
          </g>
        ))}
        <line x1="14" y1="140" x2={W-14} y2="140" stroke="rgba(16,16,16,0.14)" />
        <text x="14"   y="162" fontFamily="Inter" fontSize="10" fontWeight="700" letterSpacing="1.4" fill="var(--text-tertiary)">TOTAL</text>
        <text x={W-14} y="162" textAnchor="end" fontFamily="JetBrains Mono" fontSize="18" fontWeight="700" fill="var(--text-primary)">$54,000.00</text>
        <rect x="14" y="180" width="72" height="16" rx="8" fill="rgba(239,157,14,0.10)" stroke="rgba(239,157,14,0.30)" />
        <text x="50" y="191" textAnchor="middle" fontFamily="Inter" fontSize="10" fontWeight="600" fill="#EF9D0E">Draft</text>
      </svg>
    );
  }

  // --- DATA — spreadsheet + micro chart ---
  if (kindKey === 'data') {
    return (
      <svg {...common}>
        <rect x="0" y="0" width={W} height={H} fill="#FDFDFD" />
        {/* Grid: 4 cols × 6 rows */}
        {[0,1,2,3,4,5].map(r => (
          <rect key={r} x="14" y={20 + r*24} width={W-28} height="22" fill={r === 0 ? '#F4F3EF' : 'transparent'} stroke="rgba(16,16,16,0.08)" />
        ))}
        {[0,1,2,3].map(c => (
          <line key={c} x1={14 + (c+1) * (W-28)/4} y1="20" x2={14 + (c+1) * (W-28)/4} y2="164" stroke="rgba(16,16,16,0.06)" />
        ))}
        {[0,1,2,3].map(c => (
          <rect key={c} x={22 + c * (W-28)/4} y="28" width="46" height="4" rx="1.5" fill="rgba(16,16,16,0.28)" />
        ))}
        {[0,1,2,3,4].map(r => (
          [0,1,2,3].map(c => (
            <rect key={r+'-'+c} x={22 + c * (W-28)/4} y={52 + r*24} width={c === 3 ? 40 : (30 + (r+c)%3 * 12)} height="3" rx="1.5" fill={c === 3 ? 'rgba(42,133,255,0.55)' : 'rgba(16,16,16,0.16)'} />
          ))
        ))}
        {/* Micro chart tucked in bottom-right */}
        <g transform={`translate(${W-90}, 168)`}>
          <line x1="0" y1="14" x2="80" y2="14" stroke="rgba(16,16,16,0.10)" />
          <path d="M0 12 L14 8 L28 10 L42 5 L56 7 L70 3 L80 4" fill="none" stroke="#2A85FF" strokeWidth="1.4" />
        </g>
      </svg>
    );
  }

  // --- DIAGRAM — layered nodes ---
  if (kindKey === 'diagram') {
    return (
      <svg {...common}>
        <rect x="0" y="0" width={W} height={H} fill="#FDFDFD" />
        <rect x="120" y="18" width="80" height="30" rx="8" fill="#FDFDFD" stroke="rgba(16,16,16,0.14)" />
        <rect x="20"  y="80" width="80" height="30" rx="8" fill="#FDFDFD" stroke="rgba(16,16,16,0.14)" />
        <rect x="120" y="80" width="80" height="30" rx="8" fill="#FDFDFD" stroke="rgba(42,133,255,0.55)" strokeWidth="1.5" />
        <rect x="220" y="80" width="80" height="30" rx="8" fill="#FDFDFD" stroke="rgba(16,16,16,0.14)" />
        <rect x="70"  y="150" width="80" height="30" rx="8" fill="#FDFDFD" stroke="rgba(16,16,16,0.14)" />
        <rect x="170" y="150" width="80" height="30" rx="8" fill="#FDFDFD" stroke="rgba(16,16,16,0.14)" />
        <path d="M160 48 V80" stroke="#2A85FF" strokeWidth="1.4" fill="none" opacity="0.6" />
        <path d="M100 95 H120" stroke="rgba(16,16,16,0.24)" strokeWidth="1" fill="none" />
        <path d="M200 95 H220" stroke="rgba(16,16,16,0.24)" strokeWidth="1" fill="none" />
        <path d="M140 110 V150 M170 110 L210 150" stroke="rgba(16,16,16,0.24)" strokeWidth="1" fill="none" />
        <rect x="132" y="90" width="28" height="10" rx="2" fill="rgba(42,133,255,0.14)" />
      </svg>
    );
  }

  // --- DESIGN — 3 mini frames ---
  if (kindKey === 'design') {
    return (
      <svg {...common}>
        <rect x="0" y="0" width={W} height={H} fill="#EEEDE9" />
        {[0,1,2].map(i => (
          <g key={i} transform={`translate(${16 + i*100}, 16)`}>
            <rect x="0" y="0" width="88" height="168" rx="10" fill="#FDFDFD" stroke="rgba(16,16,16,0.10)" />
            <rect x="8" y="10" width="40" height="4" rx="1.5" fill="rgba(16,16,16,0.28)" />
            <rect x="8" y="20" width="60" height="3" rx="1.5" fill="rgba(16,16,16,0.12)" />
            <rect x="8" y="32" width="72" height="46" rx="4" fill={i === 1 ? 'rgba(42,133,255,0.10)' : 'rgba(16,16,16,0.03)'} />
            {[86, 100, 114, 128, 142].map(y => (
              <rect key={y} x="8" y={y} width={y % 20 === 0 ? 60 : 72} height="3" rx="1.5" fill="rgba(16,16,16,0.10)" />
            ))}
          </g>
        ))}
      </svg>
    );
  }

  // --- TRANSCRIPT — participant column + text ---
  if (kindKey === 'transcript') {
    return (
      <svg {...common}>
        <rect x="0" y="0" width={W} height={H} fill="#FDFDFD" />
        {/* Participant column */}
        {[24, 60, 96, 132, 168].map((y, i) => (
          <g key={i}>
            <circle cx="26" cy={y} r="10" fill={i === 1 ? 'rgba(42,133,255,0.20)' : 'rgba(16,16,16,0.06)'} />
            <rect x="42" y={y - 6} width="40" height="4" rx="1.5" fill="rgba(16,16,16,0.28)" />
            <rect x="42" y={y + 2} width="30" height="3" rx="1.5" fill="rgba(16,16,16,0.14)" />
          </g>
        ))}
        {/* Text column */}
        {[24, 60, 96, 132, 168].map((y, i) => (
          <g key={'t'+i}>
            <rect x="100" y={y - 6} width={i === 1 ? 200 : 180} height="3" rx="1.5" fill="rgba(16,16,16,0.16)" />
            <rect x="100" y={y}     width={i === 1 ? 180 : 160} height="3" rx="1.5" fill="rgba(16,16,16,0.14)" />
            <rect x="100" y={y + 6} width={i === 1 ? 140 : 120} height="3" rx="1.5" fill="rgba(16,16,16,0.14)" />
          </g>
        ))}
      </svg>
    );
  }

  // --- IMAGE — soft landscape composition ---
  if (kindKey === 'image') {
    return (
      <svg {...common}>
        <defs>
          <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
            <stop offset="0" stopColor="#B1E5FC" stopOpacity="0.55" />
            <stop offset="1" stopColor="#B5E4CA" stopOpacity="0.45" />
          </linearGradient>
        </defs>
        <rect x="0" y="0" width={W} height={H} fill="url(#sky)" />
        <path d={`M0 ${H*0.55} L60 ${H*0.42} L110 ${H*0.5} L180 ${H*0.3} L${W} ${H*0.48} L${W} ${H} L0 ${H} Z`} fill="rgba(16,16,16,0.20)" />
        <path d={`M0 ${H*0.72} L80 ${H*0.6} L160 ${H*0.68} L${W} ${H*0.58} L${W} ${H} L0 ${H} Z`} fill="rgba(16,16,16,0.35)" />
        <circle cx={W*0.78} cy={H*0.22} r="14" fill="#FFD88D" opacity="0.85" />
      </svg>
    );
  }

  // --- LINK — link-preview card ---
  if (kindKey === 'link') {
    return (
      <svg {...common}>
        <rect x="0" y="0" width={W} height={H} fill="#F4F3EF" />
        <rect x="20" y="24" width={W-40} height="152" rx="12" fill="#FDFDFD" stroke="rgba(16,16,16,0.08)" />
        <rect x="30" y="34" width={W-60} height="60" rx="8" fill="linear-gradient(180deg,#B1E5FC,#CABDFF)" />
        <rect x="30" y="34" width={W-60} height="60" rx="8" fill="rgba(42,133,255,0.15)" />
        <text x="40" y="110" fontFamily="Inter" fontSize="10" fontWeight="700" letterSpacing="1.4" fill="var(--text-tertiary)">EXTERNAL</text>
        <text x="40" y="128" fontFamily="Inter" fontSize="13" fontWeight="700" letterSpacing="-0.02em" fill="var(--text-primary)">productroad.example.com</text>
        <rect x="40" y="140" width={W-80} height="4" rx="1.5" fill="rgba(16,16,16,0.16)" />
        <rect x="40" y="150" width={W-100} height="4" rx="1.5" fill="rgba(16,16,16,0.12)" />
        <rect x="40" y="162" width="80" height="8" rx="4" fill="rgba(42,133,255,0.14)" />
      </svg>
    );
  }

  // --- NOTES — hand-written-looking bullets ---
  if (kindKey === 'notes') {
    return (
      <svg {...common}>
        <rect x="0" y="0" width={W} height={H} fill="#FBFAF6" />
        <text x="14" y="26" fontFamily="Inter" fontSize="9" fontWeight="700" letterSpacing="2" fill="var(--text-tertiary)">SESSION NOTES</text>
        <text x="14" y="50" fontFamily="Inter" fontSize="13" fontWeight="700" letterSpacing="-0.02em" fill="var(--text-primary)">Product review · 09 / 09</text>
        <line x1="14" y1="60" x2={W-14} y2="60" stroke="rgba(16,16,16,0.10)" />
        {[76, 96, 116, 136, 156, 176].map((y, i) => (
          <g key={i}>
            <circle cx="20" cy={y} r="2.5" fill="rgba(16,16,16,0.24)" />
            <rect x="30" y={y - 3} width={i % 2 ? 220 : 240} height="4" rx="1.5" fill="rgba(16,16,16,0.20)" />
            <rect x="30" y={y + 5} width={i % 2 ? 180 : 200} height="3" rx="1.5" fill="rgba(16,16,16,0.10)" />
          </g>
        ))}
      </svg>
    );
  }

  // --- DEFAULT DOC (fallback) ---
  return (
    <svg {...common}>
      <rect x="0" y="0" width={W} height={H} fill="#FDFDFD" />
      <text x="14" y="26" fontFamily="Inter" fontSize="9" fontWeight="700" letterSpacing="2" fill="var(--text-tertiary)">{dxKindMeta(kindKey).short}</text>
      <text x="14" y="48" fontFamily="Inter" fontSize="12" fontWeight="700" letterSpacing="-0.02em" fill="var(--text-primary)">{doc?.title?.slice(0, 32) || 'Document'}</text>
      <line x1="14" y1="60" x2={W-14} y2="60" stroke="rgba(16,16,16,0.08)" />
      {[76, 90, 104, 118, 132, 146, 160, 174].map((y, i) => (
        <rect key={i} x="14" y={y} width={i % 3 === 0 ? W-28 : (W-28 - 40 - (i%4)*15)} height="3" rx="1.5" fill="rgba(16,16,16,0.10)" />
      ))}
    </svg>
  );
}

// -----------------------------------------------------------------
// Detailed spec preview — used ONLY on Document Detail for `doc-1`.
// Larger, cleaner, with real section headings + margin annotations.
// -----------------------------------------------------------------

function DXSpecPreview({ doc, details }) {
  const sections = details?.sections || [];
  const annotations = details?.annotations || [];
  return (
    <div className="dx-spec">
      <div className="dx-spec-page">
        <div className="dx-spec-page-head">
          <div className="dv-eyebrow">Product specification · v3</div>
          <h2 className="dx-spec-title">{doc.title.replace(' — Product specification', '')}</h2>
          <div className="dx-spec-meta">
            <span>{doc.owner}</span>
            <span className="dot-sep">·</span>
            <span>Sep 15, 2026</span>
            <span className="dot-sep">·</span>
            <span>Feature · Smart Project Brief</span>
          </div>
        </div>

        <div className="dx-spec-body">
          {sections.map(s => {
            const notes = annotations.filter(a => a.on === s.title);
            return (
              <div className="dx-spec-section" key={s.n}>
                <div className="dx-spec-section-num mono">{String(s.n).padStart(2, '0')}</div>
                <div className="dx-spec-section-body">
                  <h3 className="dx-spec-h">{s.title}</h3>
                  <p className="dx-spec-p">{s.body}</p>
                </div>
                {notes.length > 0 && (
                  <div className="dx-spec-annot">
                    {notes.map((a, i) => (
                      <div className="dx-spec-annot-note" key={i}>
                        <div className="dx-spec-annot-by">{a.by}</div>
                        <div className="dx-spec-annot-text">{a.note}</div>
                      </div>
                    ))}
                  </div>
                )}
              </div>
            );
          })}
        </div>
      </div>
    </div>
  );
}

// -----------------------------------------------------------------
// Card + Row (used across Overview / Library / Collection Detail)
// -----------------------------------------------------------------

function DXCard({ doc, pdata, size = 'md' }) {
  const kMeta = dxKindMeta(doc.kindKey);
  return (
    <a href={`#/projects/${pdata.id}/documents/doc/${doc.id}`} className={`dx-card${doc.sourceOfTruth ? ' dx-sot' : ''}`}>
      <div className="dx-card-preview">
        <DXPreview doc={doc} />
        <span className="dx-kind-badge mono">{kMeta.short}</span>
      </div>
      <div className="dx-card-meta">
        <div className="dx-card-title-row">
          {doc.sourceOfTruth && <span className="dx-sot-mark" title="Source of truth"><Icon name="pin" size={10} strokeWidth={2} /></span>}
          <span className="dx-card-title truncate">{doc.title}</span>
        </div>
        <div className="dx-card-row">
          <span className="dx-owner">
            <Avatar name={doc.owner} size="xs" portrait={dxPortrait(doc.owner, pdata)} />
            <span className="truncate">{doc.owner}</span>
          </span>
          <span className="dx-updated">{doc.updated}</span>
        </div>
        <div className="dx-card-row">
          {dxStateChip(doc.state)}
          {doc.version && <span className="dx-ver mono">{doc.version}</span>}
          <span className="dx-size">{doc.size}</span>
        </div>
        {doc.links && <RelatedTo links={doc.links} pdata={pdata} compact asSpan />}
      </div>
    </a>
  );
}

function DXRow({ doc, pdata }) {
  const kMeta = dxKindMeta(doc.kindKey);
  return (
    <a href={`#/projects/${pdata.id}/documents/doc/${doc.id}`} className={`dx-row${doc.sourceOfTruth ? ' dx-sot' : ''}`}>
      <div className="dx-row-thumb"><DXPreview doc={doc} /></div>
      <div className="dx-row-main">
        <div className="dx-row-title-line">
          {doc.sourceOfTruth && <span className="dx-sot-mark" title="Source of truth"><Icon name="pin" size={10} strokeWidth={2} /></span>}
          <span className="dx-row-title">{doc.title}</span>
          <span className="dx-kind-badge mono">{kMeta.short}</span>
        </div>
        <div className="dx-row-sub">
          <Avatar name={doc.owner} size="xs" portrait={dxPortrait(doc.owner, pdata)} />
          <span>{doc.owner}</span>
          <span className="dot-sep">·</span>
          <span>{doc.updated}</span>
          <span className="dot-sep">·</span>
          <span className="mono dx-row-size">{doc.size}</span>
          {doc.version && <>
            <span className="dot-sep">·</span>
            <span className="mono">{doc.version}</span>
          </>}
        </div>
        {doc.links && <RelatedTo links={doc.links} pdata={pdata} compact asSpan />}
      </div>
      {dxStateChip(doc.state)}
      <Icon name="chevronRight" size={14} strokeWidth={2} style={{ color: 'var(--text-tertiary)', flex: 'none' }} />
    </a>
  );
}

// =========================================================
// OVERVIEW
// =========================================================

function DXOverview({ pdata, onNavigate }) {
  const docs = pdata.documents || [];
  const currentStage = pdata.stages.find(s => s.n === pdata.currentStage);

  const stageDocs   = docs.filter(d => d.links?.stage === pdata.currentStage);
  const needsReview = docs.filter(d => d.state === 'in-review').slice(0, 4);
  const recentOrder = ['2h ago','4h ago','1d ago','2d ago','3d ago','4d ago','5d ago','6d ago','1w ago','2w ago','5w ago'];
  const recent = [...docs].sort((a, b) => recentOrder.indexOf(a.updated) - recentOrder.indexOf(b.updated)).slice(0, 5);
  const sot    = docs.filter(d => d.sourceOfTruth);
  const collections = pdata.collections || [];

  return (
    <div className="dx-overview">

      <MGWorkspaceBanner
        kind="documents"
        eyebrow="Documents · MY GENI"
        title="The library that stays alive"
        sub="Specs, contracts, checklists, notes — versioned, connected, and never stale."
      />

      {/* --- Current-stage documents ------------------------------ */}
      <div className="dx-context">
        <div className="dx-context-left">
          <div className="dv-eyebrow">Current stage</div>
          <div className="dx-context-stage">
            <span className="dx-stage-code mono">S{String(pdata.currentStage).padStart(2, '0')}</span>
            <span className="dx-stage-name">{currentStage?.name}</span>
          </div>
          <div className="dx-context-line">
            <b>{stageDocs.length}</b>
            <span>document{stageDocs.length === 1 ? '' : 's'} connected to this stage</span>
          </div>
        </div>
        <a href={`#/projects/${pdata.id}/plan`} className="btn btn-dark btn-sm">
          <Icon name="stages" size={14} strokeWidth={1.75} />
          <span>View Stage</span>
        </a>
      </div>

      {stageDocs.length > 0 && (
        <div className="dx-tiles">
          {stageDocs.slice(0, 3).map(d => <DXCard key={d.id} doc={d} pdata={pdata} />)}
        </div>
      )}

      {/* --- Two-column: Needs review + Recently updated ---------- */}
      <div className="dv-two-col">
        <div>
          <div className="ov-section-head" style={{ paddingBottom: 10 }}>
            <h3>Needs review</h3>
            <a className="link" onClick={() => onNavigate('library')}>All documents →</a>
          </div>
          {needsReview.length ? (
            <div className="dx-strip">
              {needsReview.map(d => <DXRow key={d.id} doc={d} pdata={pdata} />)}
            </div>
          ) : (
            <div className="dv-empty">Nothing waiting on review.</div>
          )}
        </div>

        <div>
          <div className="ov-section-head" style={{ paddingBottom: 10 }}>
            <h3>Recently updated</h3>
          </div>
          <div className="dx-recent">
            {recent.map(d => (
              <a key={d.id} href={`#/projects/${pdata.id}/documents/doc/${d.id}`} className="dx-recent-row">
                <div className="dx-recent-glyph">
                  <span className="dx-kind-badge mono">{dxKindMeta(d.kindKey).short}</span>
                </div>
                <div className="dx-recent-body">
                  <div className="dx-recent-title truncate">
                    {d.sourceOfTruth && <span className="dx-sot-inline"><Icon name="pin" size={9} strokeWidth={2} /></span>}
                    {d.title}
                  </div>
                  <div className="dx-recent-sub">
                    <Avatar name={d.owner} size="xs" portrait={dxPortrait(d.owner, pdata)} />
                    <span>{d.owner}</span>
                    <span className="dot-sep">·</span>
                    <span>{d.updated}</span>
                  </div>
                </div>
                {dxStateChip(d.state)}
              </a>
            ))}
          </div>
        </div>
      </div>

      {/* --- Source of truth ------------------------------------- */}
      {sot.length > 0 && (
        <div>
          <div className="ov-section-head" style={{ paddingBottom: 10 }}>
            <h3>Source of truth</h3>
            <span className="dx-count-line">Canonical documents this project relies on</span>
          </div>
          <div className="dx-sot-list">
            {sot.map(d => (
              <a key={d.id} href={`#/projects/${pdata.id}/documents/doc/${d.id}`} className="dx-sot-row">
                <div className="dx-sot-icon"><Icon name="pin" size={12} strokeWidth={2} /></div>
                <div className="dx-sot-body">
                  <div className="dx-sot-title">{d.title}</div>
                  <div className="dx-sot-sub">
                    <span className="mono">{dxKindMeta(d.kindKey).short}</span>
                    <span className="dot-sep">·</span>
                    <span>{d.owner}</span>
                    <span className="dot-sep">·</span>
                    <span>Updated {d.updated}</span>
                  </div>
                </div>
                {dxStateChip(d.state)}
              </a>
            ))}
          </div>
        </div>
      )}

      {/* --- Featured collections -------------------------------- */}
      {collections.length > 0 && (
        <div>
          <div className="ov-section-head" style={{ paddingBottom: 10 }}>
            <h3>Featured collections</h3>
            <a className="link" onClick={() => onNavigate('collections')}>All collections →</a>
          </div>
          <div className="dx-col-grid">
            {collections.slice(0, 4).map(c => <DXCollectionCard key={c.id} col={c} pdata={pdata} />)}
          </div>
        </div>
      )}
    </div>
  );
}

// =========================================================
// LIBRARY
// =========================================================

function DXLibrary({ pdata }) {
  const docs = pdata.documents || [];
  const [q,       setQ]       = React.useState('');
  const [kind,    setKind]    = React.useState('all');
  const [stage,   setStage]   = React.useState('all');
  const [feat,    setFeat]    = React.useState('all');
  const [owner,   setOwner]   = React.useState('all');
  const [state,   setState]   = React.useState('all');
  const [view,    setView]    = React.useState('grid');

  const kinds  = Array.from(new Set(docs.map(d => d.kindKey).filter(Boolean)));
  const stages = Array.from(new Set(docs.map(d => d.links?.stage).filter(Boolean))).sort();
  const feats  = Array.from(new Set(docs.map(d => d.links?.feature).filter(Boolean)));
  const owners = Array.from(new Set(docs.map(d => d.owner).filter(Boolean)));
  const states = Array.from(new Set(docs.map(d => d.state).filter(Boolean)));

  const qq = q.trim().toLowerCase();
  const filtered = docs.filter(d => {
    if (kind  !== 'all' && d.kindKey !== kind)                   return false;
    if (stage !== 'all' && String(d.links?.stage) !== stage)     return false;
    if (feat  !== 'all' && d.links?.feature !== feat)            return false;
    if (owner !== 'all' && d.owner !== owner)                    return false;
    if (state !== 'all' && d.state !== state)                    return false;
    if (qq) {
      const hay = [d.title, d.owner, d.kind, d.kindKey, dxKindMeta(d.kindKey).label].join(' ').toLowerCase();
      if (!hay.includes(qq)) return false;
    }
    return true;
  });

  const clearAll = () => { setKind('all'); setStage('all'); setFeat('all'); setOwner('all'); setState('all'); setQ(''); };
  const any = q || kind !== 'all' || stage !== 'all' || feat !== 'all' || owner !== 'all' || state !== 'all';

  return (
    <div className="dx-library">
      {/* Filter bar */}
      <div className="dx-filter-bar">
        <div className="dx-search">
          <Icon name="search" size={14} strokeWidth={1.75} />
          <input
            className="dx-search-input"
            placeholder="Search title, owner, type…"
            value={q}
            onChange={(e) => setQ(e.target.value)}
          />
        </div>
        <div className="dv-filter-selects">
          <select value={kind} onChange={(e) => setKind(e.target.value)} className="dv-select">
            <option value="all">All types</option>
            {kinds.map(k => <option key={k} value={k}>{dxKindMeta(k).label}</option>)}
          </select>
          <select value={stage} onChange={(e) => setStage(e.target.value)} className="dv-select">
            <option value="all">All stages</option>
            {stages.map(s => <option key={s} value={String(s)}>Stage {String(s).padStart(2,'0')}</option>)}
          </select>
          <select value={feat} onChange={(e) => setFeat(e.target.value)} className="dv-select">
            <option value="all">All features</option>
            {feats.map(fid => {
              const f = pdata.features.find(x => x.id === fid);
              return <option key={fid} value={fid}>{f?.title || fid}</option>;
            })}
          </select>
          <select value={owner} onChange={(e) => setOwner(e.target.value)} className="dv-select">
            <option value="all">All owners</option>
            {owners.map(o => <option key={o} value={o}>{o}</option>)}
          </select>
          <select value={state} onChange={(e) => setState(e.target.value)} className="dv-select">
            <option value="all">Any state</option>
            {states.map(s => <option key={s} value={s}>{DX_STATE[s]?.label || s}</option>)}
          </select>
          {any && <button className="dv-clear" onClick={clearAll}>Clear</button>}
        </div>
        <div className="dx-view-toggle">
          <button className={`dx-view-btn${view === 'grid' ? ' active' : ''}`} onClick={() => setView('grid')}>
            <Icon name="grid" size={14} strokeWidth={1.75} />
          </button>
          <button className={`dx-view-btn${view === 'list' ? ' active' : ''}`} onClick={() => setView('list')}>
            <Icon name="stack" size={14} strokeWidth={1.75} />
          </button>
        </div>
      </div>

      {/* Result count */}
      <div className="dx-result-count">
        <span className="mono">{filtered.length}</span> of <span className="mono">{docs.length}</span> documents
      </div>

      {filtered.length ? (
        view === 'grid'
          ? <div className="dx-grid">{filtered.map(d => <DXCard key={d.id} doc={d} pdata={pdata} />)}</div>
          : <div className="dx-list">{filtered.map(d => <DXRow  key={d.id} doc={d} pdata={pdata} />)}</div>
      ) : (
        <div className="dv-empty dv-empty-large">
          No documents match those filters. <button className="link" onClick={clearAll}>Clear all</button>.
        </div>
      )}
    </div>
  );
}

// =========================================================
// COLLECTIONS
// =========================================================

function DXCollectionCard({ col, pdata, onOpen }) {
  const docs = (col.docs || []).map(id => dxDocById(pdata, id)).filter(Boolean);
  const mosaic = docs.slice(0, 4);
  const href = `#/projects/${pdata.id}/documents/collection/${col.id}`;
  return (
    <a href={href} className="dx-col-card" onClick={onOpen ? (e) => { e.preventDefault(); onOpen(col.id); } : undefined}>
      <div className="dx-col-mosaic">
        {mosaic.map((d, i) => (
          <div className="dx-col-mosaic-cell" key={d.id}>
            <DXPreview doc={d} />
          </div>
        ))}
        {mosaic.length < 4 && Array.from({ length: 4 - mosaic.length }).map((_, i) => (
          <div className="dx-col-mosaic-cell dx-col-mosaic-empty" key={'e'+i} />
        ))}
      </div>
      <div className="dx-col-meta">
        <div className="dx-col-title">{col.title}</div>
        <p className="dx-col-purpose">{col.purpose}</p>
        <div className="dx-col-foot">
          <span className="dx-col-count mono">{docs.length} documents</span>
          <span className="dx-col-owner">
            <Avatar name={col.owner} size="xs" portrait={dxPortrait(col.owner, pdata)} />
            <span>{col.owner}</span>
          </span>
          <span className="dx-col-updated">Updated {col.updated}</span>
        </div>
      </div>
    </a>
  );
}

function DXCollections({ pdata }) {
  const cols = pdata.collections || [];
  return (
    <div className="dx-collections">
      {cols.length ? (
        <div className="dx-col-grid dx-col-grid-full">
          {cols.map(c => <DXCollectionCard key={c.id} col={c} pdata={pdata} />)}
        </div>
      ) : (
        <div className="dv-empty dv-empty-large">No collections yet.</div>
      )}
    </div>
  );
}

// =========================================================
// COLLECTION DETAIL
// =========================================================

function DXCollectionDetail({ pdata, collectionId }) {
  const col = (pdata.collections || []).find(c => c.id === collectionId);
  if (!col) {
    return (
      <div className="dx-detail">
        <a href={`#/projects/${pdata.id}/documents/collections`} className="dv-back">
          <Icon name="chevronL" size={12} strokeWidth={2} /> <span>Back to Collections</span>
        </a>
        <div className="dv-empty dv-empty-large" style={{ marginTop: 20 }}>Collection not found.</div>
      </div>
    );
  }
  const docs = (col.docs || []).map(id => dxDocById(pdata, id)).filter(Boolean);
  // Which stage(s) does this collection touch?
  const stages = Array.from(new Set(docs.map(d => d.links?.stage).filter(Boolean))).sort();
  const features = Array.from(new Set(docs.map(d => d.links?.feature).filter(Boolean)));

  return (
    <div className="dx-detail">
      <a href={`#/projects/${pdata.id}/documents/collections`} className="dv-back">
        <Icon name="chevronL" size={12} strokeWidth={2} /> <span>Back to Collections</span>
      </a>

      <div className="dx-col-head">
        <div>
          <div className="dv-eyebrow">Collection</div>
          <h1 className="dx-col-h1">{col.title}</h1>
          <p className="dx-col-purpose dx-col-purpose-lg">{col.purpose}</p>
          <div className="dx-col-head-meta">
            <span className="dx-col-count mono">{docs.length} documents</span>
            <span className="dx-col-owner">
              <Avatar name={col.owner} size="xs" portrait={dxPortrait(col.owner, pdata)} />
              <span>{col.owner}</span>
            </span>
            <span className="dx-col-updated">Updated {col.updated}</span>
            {stages.map(s => {
              const st = pdata.stages.find(x => x.n === s);
              return (
                <a key={s} href={`#/projects/${pdata.id}/plan`} className="dx-col-stage-chip">
                  <Icon name="stages" size={10} strokeWidth={1.75} />
                  <span className="mono">S{String(s).padStart(2,'0')}</span>
                  <span>{st?.name}</span>
                </a>
              );
            })}
            {features.slice(0, 2).map(fid => {
              const f = pdata.features.find(x => x.id === fid);
              if (!f) return null;
              return (
                <a key={fid} href={`#/projects/${pdata.id}/features/${fid}`} className="dx-col-stage-chip">
                  <Icon name="features" size={10} strokeWidth={1.75} />
                  <span>{f.title}</span>
                </a>
              );
            })}
          </div>
        </div>
      </div>

      <div className="dx-grid">
        {docs.map(d => <DXCard key={d.id} doc={d} pdata={pdata} />)}
      </div>
    </div>
  );
}

// =========================================================
// DOCUMENT DETAIL
// =========================================================

function DXDocumentDetail({ pdata, docId }) {
  const doc = dxDocById(pdata, docId);
  if (!doc) {
    return (
      <div className="dx-detail">
        <a href={`#/projects/${pdata.id}/documents/library`} className="dv-back">
          <Icon name="chevronL" size={12} strokeWidth={2} /> <span>Back to Library</span>
        </a>
        <div className="dv-empty dv-empty-large" style={{ marginTop: 20 }}>Document not found.</div>
      </div>
    );
  }

  const details = pdata.documentDetails?.[doc.id] || {};
  const history = details.history || [{ v: doc.version || 'v1', date: doc.updatedAt || doc.updated, by: doc.owner, note: '' }];
  const reviewers = details.reviewers || [];
  const activity = details.activity || [
    { by: doc.owner, verb: `updated to ${doc.version || 'v1'}`, when: doc.updated },
  ];

  const stage   = doc.links?.stage   ? pdata.stages.find(s => s.n === doc.links.stage) : null;
  const feature = doc.links?.feature ? pdata.features.find(f => f.id === doc.links.feature) : null;
  const missionMeta = doc.links?.mission ? window.MYGENI_MISSIONS[doc.links.mission] : null;

  const kMeta = dxKindMeta(doc.kindKey);
  const isSpec = doc.kindKey === 'spec';

  return (
    <div className="dx-detail">
      <a href={`#/projects/${pdata.id}/documents/library`} className="dv-back">
        <Icon name="chevronL" size={12} strokeWidth={2} /> <span>Back to Library</span>
      </a>

      {/* --- Compact header --------------------------------------- */}
      <div className="dx-doc-head">
        <div className="dx-doc-head-l">
          <div className="dv-eyebrow">
            <Icon name="files" size={12} strokeWidth={1.75} />
            <span>Document · {kMeta.label}</span>
            <span className="dot-sep">·</span>
            <span className="mono">{doc.id.toUpperCase()}</span>
            {doc.sourceOfTruth && (
              <>
                <span className="dot-sep">·</span>
                <span className="dx-sot-eyebrow">
                  <Icon name="pin" size={10} strokeWidth={2} />
                  SOURCE OF TRUTH
                </span>
              </>
            )}
          </div>
          <h1 className="dx-doc-title">{doc.title}</h1>
          {details.summary && <p className="dx-doc-summary">{details.summary}</p>}
          <div className="dx-doc-meta">
            {dxStateChip(doc.state)}
            <span className="dx-doc-meta-item"><span className="dx-ver dx-ver-big mono">{doc.version || 'v1'}</span></span>
            <span className="dx-doc-meta-item">
              <Icon name="clock" size={12} strokeWidth={1.75} />
              <span>Updated {doc.updated}</span>
            </span>
            <span className="dx-doc-meta-item">
              <span className="mono">{doc.size}</span>
            </span>
            {stage && (
              <a href={`#/projects/${pdata.id}/plan`} className="dx-doc-meta-item link">
                <Icon name="stages" size={12} strokeWidth={1.75} />
                <span>Stage {String(stage.n).padStart(2,'0')} · {stage.name}</span>
              </a>
            )}
            {missionMeta && (
              <a href={`#/projects/${pdata.id}/plan`} className="dx-doc-meta-item link">
                <Icon name={missionMeta.icon} size={12} strokeWidth={1.75} />
                <span>{missionMeta.label}</span>
              </a>
            )}
            {feature && (
              <a href={`#/projects/${pdata.id}/features/${feature.id}`} className="dx-doc-meta-item link">
                <Icon name="features" size={12} strokeWidth={1.75} />
                <span>{feature.title}</span>
              </a>
            )}
          </div>
        </div>

        <div className="dx-doc-head-r">
          <div className="dx-doc-owner-block">
            <div className="dv-eyebrow">Owner</div>
            <div className="dx-doc-owner-row">
              <Avatar name={doc.owner} size="sm" portrait={dxPortrait(doc.owner, pdata)} />
              <span>{doc.owner}</span>
            </div>
          </div>
          <div className="dx-doc-actions">
            <button className="btn btn-white btn-sm">
              <Icon name="share" size={14} strokeWidth={1.75} />
              <span>Share</span>
            </button>
            <button className="btn btn-primary btn-sm">
              <Icon name="externalLink" size={14} strokeWidth={1.75} />
              <span>Open</span>
            </button>
          </div>
        </div>
      </div>

      {/* --- Preview + Rail --------------------------------------- */}
      <div className="dx-doc-grid">
        <div className="dx-doc-preview-card">
          <div className="dx-preview-bar">
            <div className="dx-preview-caption">
              <span className="mono">{kMeta.short}</span>
              <span className="dot-sep">·</span>
              <span>{doc.size}</span>
              <span className="dot-sep">·</span>
              <span>{doc.version}</span>
            </div>
            <div className="dx-preview-bar-r">
              <button className="icon-btn icon-btn-sm" title="Fit"><Icon name="grid" size={14} strokeWidth={1.75} /></button>
              <button className="icon-btn icon-btn-sm" title="Open in new tab"><Icon name="externalLink" size={14} strokeWidth={1.75} /></button>
            </div>
          </div>
          <div className="dx-preview-frame">
            {isSpec
              ? <DXSpecPreview doc={doc} details={details} />
              : <div className="dx-preview-generic"><DXPreview doc={doc} /></div>}
          </div>
        </div>

        {/* Rail */}
        <div className="dx-doc-rail">
          {/* Reviewers */}
          {reviewers.length > 0 && (
            <div className="dx-rail-card">
              <div className="dx-card-head">
                <h4>Review</h4>
                {dxStateChip(doc.state)}
              </div>
              <div className="dx-reviewers">
                {reviewers.map((r, i) => (
                  <div key={i} className={`dx-reviewer dx-reviewer-${r.status}`}>
                    <Avatar name={r.name} size="xs" portrait={dxPortrait(r.name, pdata)} />
                    <div className="dx-reviewer-body">
                      <div className="dx-reviewer-name">{r.name}</div>
                      <div className="dx-reviewer-role">{r.role} · {r.when}</div>
                    </div>
                    <Label tone={r.status === 'approved' ? 'green' : (r.status === 'waiting' ? 'yellow' : 'gray')} dot size="sm">
                      {r.status === 'approved' ? 'Approved' : (r.status === 'waiting' ? 'Waiting' : 'Not started')}
                    </Label>
                  </div>
                ))}
              </div>
            </div>
          )}

          {/* Version history */}
          {history.length > 0 && (
            <div className="dx-rail-card">
              <div className="dx-card-head"><h4>Version history</h4></div>
              <div className="dx-versions">
                {history.map((h, i) => (
                  <div key={i} className={`dx-version${i === 0 ? ' current' : ''}`}>
                    <div className="dx-version-marker">
                      <span className="dx-version-dot" />
                      {i < history.length - 1 && <span className="dx-version-line" />}
                    </div>
                    <div className="dx-version-body">
                      <div className="dx-version-head">
                        <span className="mono dx-version-v">{h.v}</span>
                        {i === 0 && <span className="dx-version-cur">Current</span>}
                        <span className="dot-sep">·</span>
                        <span className="dx-version-date">{h.date}</span>
                      </div>
                      {h.note && <div className="dx-version-note">{h.note}</div>}
                      <div className="dx-version-by">
                        <Avatar name={h.by} size="xs" portrait={dxPortrait(h.by, pdata)} />
                        <span>{h.by}</span>
                      </div>
                    </div>
                  </div>
                ))}
              </div>
            </div>
          )}

          {/* Related canonical */}
          <div className="dx-rail-card">
            <div className="dx-card-head"><h4>Related</h4></div>
            <div className="dx-related-list">
              {stage && (
                <a href={`#/projects/${pdata.id}/plan`} className="dx-related-row">
                  <Icon name="stages" size={13} strokeWidth={1.75} />
                  <span className="truncate">Stage {String(stage.n).padStart(2,'0')} · {stage.name}</span>
                  <span className="dx-related-tag mono">S{String(stage.n).padStart(2,'0')}</span>
                </a>
              )}
              {missionMeta && (
                <a href={`#/projects/${pdata.id}/plan`} className="dx-related-row">
                  <Icon name={missionMeta.icon} size={13} strokeWidth={1.75} />
                  <span>{missionMeta.label} mission</span>
                  <span className="dx-related-tag mono">MSN</span>
                </a>
              )}
              {feature && (
                <a href={`#/projects/${pdata.id}/features/${feature.id}`} className="dx-related-row">
                  <Icon name="features" size={13} strokeWidth={1.75} />
                  <span className="truncate">{feature.title}</span>
                  <span className="dx-related-tag mono">FEAT</span>
                </a>
              )}
              {doc.links?.research && (
                <a href={`#/projects/${pdata.id}/research/study/${doc.links.research}`} className="dx-related-row">
                  <Icon name="flask" size={13} strokeWidth={1.75} />
                  <span>Research study</span>
                  <span className="dx-related-tag mono">STDY</span>
                </a>
              )}
              {doc.links?.design && (
                <a href={`#/projects/${pdata.id}/design/item/${doc.links.design}`} className="dx-related-row">
                  <Icon name="palette" size={13} strokeWidth={1.75} />
                  <span>Design item</span>
                  <span className="dx-related-tag mono">DES</span>
                </a>
              )}
              {doc.contract && (
                <a href={`#/projects/${pdata.id}/commercial/contract/${doc.contract}`} className="dx-related-row">
                  <Icon name="contracts" size={13} strokeWidth={1.75} />
                  <span className="truncate">Contract {doc.contract}</span>
                  <span className="dx-related-tag mono">CTR</span>
                </a>
              )}
            </div>
          </div>

          {/* Activity */}
          {activity.length > 0 && (
            <div className="dx-rail-card">
              <div className="dx-card-head"><h4>Activity</h4></div>
              <div className="dx-activity">
                {activity.map((a, i) => (
                  <div key={i} className="dx-activity-row">
                    <Avatar name={a.by} size="xs" portrait={dxPortrait(a.by, pdata)} />
                    <div className="dx-activity-body">
                      <div className="dx-activity-line">
                        <b>{a.by}</b> <span>{a.verb}</span>
                      </div>
                      <div className="dx-activity-when">{a.when}</div>
                    </div>
                  </div>
                ))}
              </div>
            </div>
          )}
        </div>
      </div>
    </div>
  );
}

// =========================================================
// ROUTER SHELL
// -----------------------------------------------------------------
// Sub-route shape:
//   /documents                     → Overview
//   /documents/library             → Library
//   /documents/collections         → Collections list
//   /documents/collection/:id      → Collection Detail
//   /documents/doc/:id             → Document Detail
// =========================================================

function DocumentsWorkspaceV2({ pdata, subId, sub2 }) {
  const isDocDetail = subId === 'doc';
  const isColDetail = subId === 'collection';
  const isDetail = isDocDetail || isColDetail;
  const view = isDetail
    ? (isDocDetail ? 'doc' : 'collection')
    : (subId === 'library' ? 'library' : (subId === 'collections' ? 'collections' : 'overview'));

  const setView = (v) => {
    location.hash = v === 'overview'
      ? `#/projects/${pdata.id}/documents`
      : `#/projects/${pdata.id}/documents/${v}`;
  };

  return (
    <div className="dx-root" data-screen-label={`Documents · ${view}`}>
      {!isDetail && (
        <div className="dv-nav-row">
          <div className="dv-seg" role="tablist" aria-label="Documents views">
            {[
              { k: 'overview',    label: 'Overview'    },
              { k: 'library',     label: 'Library'     },
              { k: 'collections', label: 'Collections' },
            ].map(t => (
              <button key={t.k} role="tab" aria-selected={view === t.k}
                      className={`dv-seg-btn${view === t.k ? ' active' : ''}`}
                      onClick={() => setView(t.k)}>
                {t.label}
              </button>
            ))}
          </div>
          <div className="dv-nav-actions">
            <span className="dv-direction">One place. Everything canonical. No folders.</span>
          </div>
        </div>
      )}

      {view === 'overview'    && <DXOverview       pdata={pdata} onNavigate={setView} />}
      {view === 'library'     && <DXLibrary        pdata={pdata} />}
      {view === 'collections' && <DXCollections    pdata={pdata} />}
      {view === 'collection'  && <DXCollectionDetail pdata={pdata} collectionId={sub2} />}
      {view === 'doc'         && <DXDocumentDetail pdata={pdata} docId={sub2} />}
    </div>
  );
}

Object.assign(window, {
  DocumentsWorkspaceV2,
  DXPreview, DXCard, DXRow,
});
