// =========================================================
// COMMERCIAL WORKSPACE V2 — Phase 16
// -----------------------------------------------------------------
// Depth cap: Project → Commercial → Contract Detail.
// Three peer views: Overview / Contracts / Milestones.
//
// Reads exclusively from `data.contracts[]` (canonical) filtered
// for this project. Stage↔Commercial derives from
// `contract.stageLinks[]` which remains the source of truth.
// No duplication of contracts, documents, or milestones.
// =========================================================

const CW_STATE = {
  'complete':    { tone: 'green',  label: 'Complete'      },
  'shipped':     { tone: 'green',  label: 'Complete'      },
  'attention':   { tone: 'yellow', label: 'Attention'     },
  'blocked':     { tone: 'red',    label: 'Blocked'       },
  'upcoming':    { tone: 'gray',   label: 'Upcoming'      },
  'pending':     { tone: 'blue',   label: 'Pending'       },
  'waiting':     { tone: 'blue',   label: 'Waiting'       },
  'not-started': { tone: 'gray',   label: 'Not started'   },
  'active':      { tone: 'blue',   label: 'Active'        },
  'granted':     { tone: 'green',  label: 'Granted'       },
  'planned':     { tone: 'gray',   label: 'Planned'       },
  'overdue':     { tone: 'red',    label: 'Overdue'       },
};

const CW_MILESTONE_ICON = {
  'signed':    'signed',
  'sign-off':  'check',
  'payment':   'wallet',
  'delivery':  'stack',
  'renewal':   'refresh',
  'approval':  'check',
};

function cwStateChip(state, size = 'sm') {
  const s = CW_STATE[state];
  if (!s) return null;
  return <Label tone={s.tone} dot size={size}>{s.label}</Label>;
}

function cwPortrait(name, pdata) {
  const k = (name || '').toLowerCase();
  return (pdata.people || {})[k]?.portrait || null;
}

// -----------------------------------------------------------------
// Realistic document cover previews — small paper-like SVGs.
// Not generic gray rectangles.
// -----------------------------------------------------------------

function CWDocCover({ kind = 'contract', size = 'md' }) {
  const W = 200, H = 260;
  const common = { viewBox: `0 0 ${W} ${H}`, width: '100%', height: '100%', preserveAspectRatio: 'xMidYMid meet' };

  if (kind === 'contract') {
    return (
      <svg {...common}>
        <rect x="4" y="4" width={W-8} height={H-8} rx="10" fill="#FDFDFD" stroke="rgba(16,16,16,0.10)" />
        <rect x="4" y="4" width="8" height={H-8} rx="4" fill="#EF9D0E" opacity="0.85" />
        <text x="26" y="36" fontFamily="Inter" fontSize="9" fontWeight="700" letterSpacing="2" fill="var(--text-tertiary)">MASTER AGREEMENT</text>
        <text x="26" y="66" fontFamily="Inter" fontSize="14" fontWeight="700" letterSpacing="-0.02em" fill="var(--text-primary)">Founding Partner × My Geni</text>
        <text x="26" y="82" fontFamily="Inter" fontSize="11" fontWeight="500" letterSpacing="-0.015em" fill="var(--text-secondary)">Design-partner engagement</text>
        <line x1="26" y1="96" x2={W-26} y2="96" stroke="rgba(16,16,16,0.10)" />
        {[112,124,136,148,160,172].map((y,i) => (
          <rect key={i} x="26" y={y} width={i%2 ? 130 : 148} height="3" rx="1.5" fill="rgba(16,16,16,0.12)" />
        ))}
        <rect x="26" y="190" width="80" height="4" rx="1.5" fill="rgba(16,16,16,0.28)" />
        <rect x="26" y="200" width="60" height="3" rx="1.5" fill="rgba(16,16,16,0.14)" />
        <text x="26" y="228" fontFamily="Inter" fontSize="10" fontWeight="700" letterSpacing="1.4" fill="var(--text-tertiary)">SIGNATURES</text>
        <line x1="26" y1="242" x2="98"  y2="242" stroke="rgba(16,16,16,0.30)" strokeWidth="1" />
        <line x1={W-98} y1="242" x2={W-26} y2="242" stroke="rgba(16,16,16,0.30)" strokeWidth="1" />
        <text x="62" y="254" textAnchor="middle" fontFamily="Georgia" fontStyle="italic" fontSize="9" fill="var(--text-tertiary)">E. Marchetti</text>
        <text x={W-62} y="254" textAnchor="middle" fontFamily="Georgia" fontStyle="italic" fontSize="9" fill="var(--text-tertiary)">P. Ramanathan</text>
      </svg>
    );
  }
  if (kind === 'sow' || kind === 'brief') {
    return (
      <svg {...common}>
        <rect x="4" y="4" width={W-8} height={H-8} rx="10" fill="#FDFDFD" stroke="rgba(16,16,16,0.10)" />
        <rect x="4" y="4" width="8" height={H-8} rx="4" fill="#2A85FF" opacity="0.85" />
        <text x="26" y="36" fontFamily="Inter" fontSize="9" fontWeight="700" letterSpacing="2" fill="var(--text-tertiary)">STATEMENT OF WORK</text>
        <text x="26" y="66" fontFamily="Inter" fontSize="15" fontWeight="700" letterSpacing="-0.02em" fill="var(--text-primary)">My Geni — v2 delivery</text>
        <text x="26" y="82" fontFamily="Inter" fontSize="11" fontWeight="500" letterSpacing="-0.015em" fill="var(--text-secondary)">Aug 2026 – Dec 2026</text>
        <line x1="26" y1="96" x2={W-26} y2="96" stroke="rgba(16,16,16,0.10)" />
        {[112,124,136,148,160,172,184,196,208].map((y,i) => (
          <rect key={i} x="26" y={y} width={[148,132,120,144,110,140,130,148,120][i]} height="3" rx="1.5" fill="rgba(16,16,16,0.12)" />
        ))}
        <rect x="26" y="228" width="140" height="16" rx="4" fill="rgba(42,133,255,0.08)" stroke="rgba(42,133,255,0.20)" />
        <text x="34" y="240" fontFamily="Inter" fontSize="9" fontWeight="600" fill="#2A85FF">Milestone: Wave 2 Beta · $54K</text>
      </svg>
    );
  }
  if (kind === 'invoice') {
    return (
      <svg {...common}>
        <rect x="4" y="4" width={W-8} height={H-8} rx="10" fill="#FDFDFD" stroke="rgba(16,16,16,0.10)" />
        <text x="18" y="34" fontFamily="Inter" fontSize="9" fontWeight="700" letterSpacing="2" fill="var(--text-tertiary)">INVOICE</text>
        <text x="18" y="60" fontFamily="Inter" fontSize="18" fontWeight="700" letterSpacing="-0.02em" fill="var(--text-primary)">INV-041-002</text>
        <text x={W-18} y="34" textAnchor="end" fontFamily="Inter" fontSize="10" fontWeight="500" fill="var(--text-secondary)">Oct 02, 2026</text>
        <line x1="18" y1="74" x2={W-18} y2="74" stroke="rgba(16,16,16,0.10)" />
        {[86,102,118,134].map((y,i) => (
          <g key={i}>
            <rect x="18" y={y} width="100" height="4" rx="1.5" fill="rgba(16,16,16,0.14)" />
            <rect x={W-58} y={y} width="40" height="4" rx="1.5" fill="rgba(16,16,16,0.24)" />
          </g>
        ))}
        <line x1="18" y1="164" x2={W-18} y2="164" stroke="rgba(16,16,16,0.14)" />
        <text x="18" y="186" fontFamily="Inter" fontSize="10" fontWeight="600" fill="var(--text-tertiary)">TOTAL</text>
        <text x={W-18} y="186" textAnchor="end" fontFamily="JetBrains Mono" fontSize="16" fontWeight="700" fill="var(--text-primary)">$54,000.00</text>
        <rect x="18" y="220" width="66" height="20" rx="10" fill="rgba(239,157,14,0.10)" stroke="rgba(239,157,14,0.30)" />
        <text x="51" y="234" textAnchor="middle" fontFamily="Inter" fontSize="10" fontWeight="600" fill="#EF9D0E">Pending</text>
      </svg>
    );
  }
  if (kind === 'nda') {
    return (
      <svg {...common}>
        <rect x="4" y="4" width={W-8} height={H-8} rx="10" fill="#FDFDFD" stroke="rgba(16,16,16,0.10)" />
        <rect x="4" y="4" width="8" height={H-8} rx="4" fill="#00A656" opacity="0.85" />
        <text x="26" y="36" fontFamily="Inter" fontSize="9" fontWeight="700" letterSpacing="2" fill="var(--text-tertiary)">CONFIDENTIAL</text>
        <text x="26" y="66" fontFamily="Inter" fontSize="14" fontWeight="700" letterSpacing="-0.02em" fill="var(--text-primary)">Design-partner NDA</text>
        <text x="26" y="82" fontFamily="Inter" fontSize="11" fontWeight="500" fill="var(--text-secondary)">Founding partner — mutual</text>
        <line x1="26" y1="96" x2={W-26} y2="96" stroke="rgba(16,16,16,0.10)" />
        {[112,124,136,148,160,172,184].map((y,i) => (
          <rect key={i} x="26" y={y} width={i%2 ? 130 : 148} height="3" rx="1.5" fill="rgba(16,16,16,0.12)" />
        ))}
      </svg>
    );
  }
  return null;
}

// -----------------------------------------------------------------
// Commercial Journey — horizontal timeline of milestones.
// Uses only semantic color; connectors are neutral.
// -----------------------------------------------------------------

function CWJourney({ contract, pdata, dense = false }) {
  const ms = contract.stageLinks || [];
  if (!ms.length) return null;

  return (
    <div className={`cw-journey${dense ? ' cw-journey-dense' : ''}`}>
      {ms.map((m, i) => {
        const s = CW_STATE[m.state];
        const stage = pdata.stages.find(x => x.n === m.stage);
        return (
          <React.Fragment key={m.id || i}>
            <a
              href={`#/projects/${pdata.id}/plan`}
              className={`cw-jn cw-jn-${m.state}`}
              onClick={(e) => e.stopPropagation()}
            >
              <div className="cw-jn-dot">
                {m.state === 'complete' && <Icon name="check" size={10} strokeWidth={3} />}
              </div>
              <div className="cw-jn-body">
                <div className="cw-jn-stage mono">S{String(m.stage).padStart(2,'0')} · {stage?.name || ''}</div>
                <div className="cw-jn-name">{m.label}</div>
                <div className="cw-jn-meta">
                  <span className="cw-jn-date">{m.date}</span>
                  {m.amount && <>
                    <span className="dot-sep">·</span>
                    <span className="cw-jn-amount mono">{m.amount}</span>
                  </>}
                </div>
                {!dense && s && <Label tone={s.tone} dot size="sm">{s.label}</Label>}
              </div>
            </a>
            {i < ms.length - 1 && <div className="cw-jn-connect" aria-hidden />}
          </React.Fragment>
        );
      })}
    </div>
  );
}

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

function CWOverview({ pdata, data, onOpenContract }) {
  const contracts = (data.contracts || []).filter(c => c.project === pdata.id);
  const active = contracts.find(c => c.status === 'Active' && c.value !== '—') || contracts[0];

  if (!active) {
    return (
      <div className="cw-overview">
        <div className="dv-empty dv-empty-large">
          No commercial agreement is linked to this project yet.
        </div>
      </div>
    );
  }

  const client = data.clients[active.client];
  const primaryDoc = active.primaryDoc ? (pdata.documents || []).find(d => d.id === active.primaryDoc) : null;
  const attention  = (active.stageLinks || []).filter(m => m.state === 'attention' || m.state === 'blocked' || m.state === 'overdue');
  const upcoming   = (active.stageLinks || []).filter(m => m.state === 'upcoming' || m.state === 'pending');

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

      <MGWorkspaceBanner
        kind="commercial"
        eyebrow="Commercial · MY GENI"
        title="The engagement, without the noise"
        sub="Contracts, milestones, approvals, costs — connected to the stages of work that earn them."
      />

      {/* --- Active agreement flagship --------------------------- */}
      <div className="cw-agreement">
        <div className="cw-agreement-left">
          <div className="cw-eyebrow">
            <Icon name="contracts" size={12} strokeWidth={1.75} />
            <span>Active agreement</span>
            <span className="dot-sep">·</span>
            <span className="mono">{active.id}</span>
          </div>
          <h1 className="cw-agreement-title">{active.title}</h1>
          <div className="cw-agreement-meta">
            {cwStateChip(active.status.toLowerCase() === 'active' ? 'active' : active.status.toLowerCase())}
            {client && (
              <span className="cw-agreement-meta-item">
                <span className="cw-client-mark" style={{ background: client.color }}>{client.short}</span>
                <span>{client.name}</span>
              </span>
            )}
            <span className="cw-agreement-meta-item">
              <Icon name="calendar" size={12} strokeWidth={1.75} />
              <span>{active.start} → {active.end}</span>
            </span>
            <span className="cw-agreement-meta-item">
              <Icon name="clock" size={12} strokeWidth={1.75} />
              <span>{active.expiresIn}</span>
            </span>
          </div>
          <p className="cw-agreement-summary">{active.summary?.currentState || ''}</p>

          <div className="cw-agreement-people">
            {active.owner && (
              <div className="cw-person">
                <div className="cw-eyebrow-inline">Commercial owner</div>
                <div className="cw-person-row">
                  <Avatar name={active.owner} size="sm" portrait={cwPortrait(active.owner, pdata)} />
                  <div>
                    <div className="cw-person-name">{active.owner}</div>
                    <div className="cw-person-role">My Geni</div>
                  </div>
                </div>
              </div>
            )}
            {active.clientContact && (
              <div className="cw-person">
                <div className="cw-eyebrow-inline">Client contact</div>
                <div className="cw-person-row">
                  <Avatar name={active.clientContact} size="sm" portrait={cwPortrait(active.clientContact, pdata)} />
                  <div>
                    <div className="cw-person-name">{active.clientContact}</div>
                    <div className="cw-person-role">{client?.name} · {active.clientContactRole}</div>
                  </div>
                </div>
              </div>
            )}
          </div>
        </div>

        <div className="cw-agreement-right">
          <div className="cw-value-block">
            <div className="cw-eyebrow">Total value</div>
            <div className="cw-value mono">{active.value}</div>
            <div className="cw-value-sub">across {active.stageLinks?.length || 0} milestones</div>
          </div>

          {primaryDoc && (
            <a href={`#/projects/${pdata.id}/documents`} className="cw-primary-doc">
              <div className="cw-primary-doc-cover">
                <CWDocCover kind="contract" />
              </div>
              <div className="cw-primary-doc-meta">
                <div className="cw-eyebrow-inline">Primary document</div>
                <div className="cw-primary-doc-title truncate">{primaryDoc.title}</div>
                <div className="cw-primary-doc-sub">{primaryDoc.size} · Updated {primaryDoc.updated}</div>
              </div>
            </a>
          )}

          <a
            href={`#/projects/${pdata.id}/commercial/contract/${active.id}`}
            className="btn btn-dark btn-sm cw-open-cta"
            onClick={(e) => { e.preventDefault(); onOpenContract(active.id); }}
          >
            <Icon name="externalLink" size={14} strokeWidth={1.75} />
            <span>Open contract</span>
          </a>
        </div>
      </div>

      {/* --- Commercial journey ---------------------------------- */}
      <div>
        <div className="ov-section-head" style={{ paddingBottom: 10 }}>
          <h3>Commercial journey</h3>
          <span className="cw-count-line">Milestones across the project lifecycle</span>
        </div>
        <div className="cw-journey-card">
          <CWJourney contract={active} pdata={pdata} />
        </div>
      </div>

      {/* --- Needs attention ------------------------------------- */}
      <div>
        <div className="ov-section-head" style={{ paddingBottom: 10 }}>
          <h3>Needs attention</h3>
        </div>
        {attention.length ? (
          <div className="cw-attn-list">
            {attention.map(m => {
              const stage = pdata.stages.find(x => x.n === m.stage);
              return (
                <a key={m.id} href={`#/projects/${pdata.id}/plan`} className="cw-attn-row">
                  <div className="cw-attn-glyph">
                    <Icon name="alert" size={14} strokeWidth={1.75} />
                  </div>
                  <div className="cw-attn-body">
                    <div className="cw-attn-title">{m.label}</div>
                    <div className="cw-attn-sub">
                      <span className="mono">S{String(m.stage).padStart(2,'0')}</span>
                      <span>·</span>
                      <span>{stage?.name}</span>
                      <span>·</span>
                      <span>Due {m.date}</span>
                    </div>
                  </div>
                  {m.amount && <span className="cw-attn-amount mono">{m.amount}</span>}
                  {cwStateChip(m.state)}
                </a>
              );
            })}
          </div>
        ) : (
          <div className="cw-quiet">
            <Icon name="check" size={14} strokeWidth={1.75} />
            <span>No commercial blockers. Wave 2 Beta unlocks on schedule.</span>
          </div>
        )}
      </div>

      {/* --- Upcoming milestones (small strip) ------------------ */}
      {upcoming.length > 0 && (
        <div>
          <div className="ov-section-head" style={{ paddingBottom: 10 }}>
            <h3>Upcoming</h3>
            <a className="link" href={`#/projects/${pdata.id}/commercial/milestones`}>All milestones →</a>
          </div>
          <div className="cw-upcoming">
            {upcoming.map(m => {
              const stage = pdata.stages.find(x => x.n === m.stage);
              return (
                <div key={m.id} className="cw-upcoming-row">
                  <div className="cw-upcoming-date">
                    <div className="cw-upcoming-d">{m.date.split(' ')[1]}</div>
                    <div className="cw-upcoming-m">{m.date.split(' ')[0]}</div>
                  </div>
                  <div className="cw-upcoming-body">
                    <div className="cw-upcoming-title">{m.label}</div>
                    <div className="cw-upcoming-sub">
                      <span className="mono">S{String(m.stage).padStart(2,'0')}</span>
                      <span className="dot-sep">·</span>
                      <span>{stage?.name}</span>
                    </div>
                  </div>
                  {m.amount && <span className="cw-upcoming-amt mono">{m.amount}</span>}
                  {cwStateChip(m.state)}
                </div>
              );
            })}
          </div>
        </div>
      )}

      {/* --- Costs strip ---------------------------------------- */}
      {(active.costs || []).length > 0 && (
        <div>
          <div className="ov-section-head" style={{ paddingBottom: 10 }}>
            <h3>Execution-related costs</h3>
            <span className="cw-count-line">Only where a cost affects delivery</span>
          </div>
          <div className="cw-cost-grid">
            {active.costs.map(c => {
              const stage = pdata.stages.find(x => x.n === c.stage);
              const missionMeta = window.MYGENI_MISSIONS[c.mission];
              return (
                <div key={c.id} className="cw-cost-row">
                  <div className="cw-cost-main">
                    <div className="cw-cost-label">{c.label}</div>
                    <div className="cw-cost-sub">
                      {stage && <span className="mono">S{String(c.stage).padStart(2,'0')}</span>}
                      {missionMeta && <>
                        <span className="dot-sep">·</span>
                        <span>{missionMeta.label}</span>
                      </>}
                      {c.note && <>
                        <span className="dot-sep">·</span>
                        <span className="truncate">{c.note}</span>
                      </>}
                    </div>
                  </div>
                  <div className="cw-cost-amt mono">
                    {c.amount}<span className="cw-cost-cadence">{c.cadence}</span>
                  </div>
                  {cwStateChip(c.state)}
                </div>
              );
            })}
          </div>
        </div>
      )}
    </div>
  );
}

// =========================================================
// CONTRACTS — structured rows
// =========================================================

function CWContracts({ pdata, data, onOpenContract }) {
  const contracts = (data.contracts || []).filter(c => c.project === pdata.id);

  return (
    <div className="cw-contracts">
      {contracts.length ? (
        <div className="cw-contract-list">
          {contracts.map(c => {
            const client = data.clients[c.client];
            const nextMs = (c.stageLinks || []).find(m => m.state === 'upcoming' || m.state === 'attention' || m.state === 'pending');
            return (
              <a key={c.id}
                 href={`#/projects/${pdata.id}/commercial/contract/${c.id}`}
                 className="cw-contract-row"
                 onClick={(e) => { e.preventDefault(); onOpenContract(c.id); }}>
                <div className="cw-contract-cover">
                  <CWDocCover kind={c.value === '—' ? 'nda' : 'contract'} />
                </div>
                <div className="cw-contract-main">
                  <div className="cw-contract-head">
                    <div className="cw-contract-title">{c.title}</div>
                    <span className="cw-contract-code mono">{c.id}</span>
                    <Label tone={c.tone} dot size="sm">{c.status}</Label>
                  </div>
                  {client && (
                    <div className="cw-contract-client">
                      <span className="cw-client-mark" style={{ background: client.color }}>{client.short}</span>
                      <span>{client.name}</span>
                      <span className="dot-sep">·</span>
                      <span>{client.industry}</span>
                    </div>
                  )}
                  <div className="cw-contract-meta">
                    <span className="cw-contract-meta-item">
                      <Icon name="calendar" size={11} strokeWidth={1.75} />
                      <span>{c.start} → {c.end}</span>
                    </span>
                    <span className="cw-contract-meta-item">
                      <Icon name="paperclip" size={11} strokeWidth={1.75} />
                      <span>{c.files} file{c.files === 1 ? '' : 's'}</span>
                    </span>
                    <span className="cw-contract-meta-item">
                      <Icon name="clock" size={11} strokeWidth={1.75} />
                      <span>{c.expiresIn}</span>
                    </span>
                    {nextMs && (
                      <span className="cw-contract-next">
                        <span className="cw-contract-next-lbl">Next</span>
                        <span className="mono">S{String(nextMs.stage).padStart(2,'0')}</span>
                        <span className="truncate">{nextMs.label}</span>
                        <span className="dot-sep">·</span>
                        <span className="cw-contract-next-date">{nextMs.date}</span>
                      </span>
                    )}
                  </div>
                </div>
                <div className="cw-contract-value">
                  <div className="cw-eyebrow-inline">Value</div>
                  <div className="cw-contract-value-num mono">{c.value}</div>
                </div>
                <Icon name="chevronRight" size={14} strokeWidth={2} style={{ color: 'var(--text-tertiary)', flex: 'none' }} />
              </a>
            );
          })}
        </div>
      ) : (
        <div className="dv-empty dv-empty-large">No commercial agreement is linked to this project yet.</div>
      )}

      {/* Calm capacity state — better than fake filler rows. */}
      {contracts.length < 3 && (
        <div className="cw-capacity">
          <div className="cw-capacity-line">
            <span className="dv-eyebrow">Historical & future</span>
            <span className="cw-capacity-body">No prior or upcoming agreements for this project. New engagements will appear here.</span>
          </div>
        </div>
      )}
    </div>
  );
}

// =========================================================
// CONTRACT DETAIL
// =========================================================

function CWContractDetail({ pdata, data, contractId }) {
  const contract = (data.contracts || []).find(c => c.id === contractId);
  if (!contract) {
    return (
      <div className="cw-detail">
        <a href={`#/projects/${pdata.id}/commercial/contracts`} className="dv-back">
          <Icon name="chevronL" size={12} strokeWidth={2} /> <span>Back to Contracts</span>
        </a>
        <div className="dv-empty dv-empty-large" style={{ marginTop: 20 }}>Contract not found.</div>
      </div>
    );
  }

  const client = data.clients[contract.client];
  const primaryDoc = contract.primaryDoc ? (pdata.documents || []).find(d => d.id === contract.primaryDoc) : null;
  const linkedDocs = (contract.documents || []).map(id => (pdata.documents || []).find(d => d.id === id)).filter(Boolean);

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

      {/* --- Compact header --------------------------------------- */}
      <div className="cw-detail-head">
        <div className="cw-detail-head-l">
          <div className="cw-eyebrow">
            <Icon name="contracts" size={12} strokeWidth={1.75} />
            <span>Contract</span>
            <span className="dot-sep">·</span>
            <span className="mono">{contract.id}</span>
          </div>
          <h1 className="cw-detail-title">{contract.title}</h1>
          <div className="cw-detail-meta">
            <Label tone={contract.tone} dot size="sm">{contract.status}</Label>
            {client && (
              <span className="cw-detail-meta-item">
                <span className="cw-client-mark" style={{ background: client.color }}>{client.short}</span>
                <span>{client.name}</span>
              </span>
            )}
            <span className="cw-detail-meta-item">
              <Icon name="calendar" size={12} strokeWidth={1.75} />
              <span>{contract.start} → {contract.end}</span>
            </span>
            <span className="cw-detail-meta-item">
              <Icon name="clock" size={12} strokeWidth={1.75} />
              <span>{contract.expiresIn}</span>
            </span>
          </div>
        </div>
        <div className="cw-detail-head-r">
          <div className="cw-value-block">
            <div className="cw-eyebrow">Total value</div>
            <div className="cw-value mono">{contract.value}</div>
          </div>
          <div className="cw-detail-actions">
            {primaryDoc && (
              <a href={`#/projects/${pdata.id}/documents`} className="btn btn-white btn-sm">
                <Icon name="externalLink" size={13} strokeWidth={1.75} />
                <span>Open document</span>
              </a>
            )}
          </div>
        </div>
      </div>

      {/* --- Body split ------------------------------------------- */}
      <div className="cw-detail-grid">

        {/* Left */}
        <div className="cw-detail-main">
          {/* Summary */}
          {contract.summary && (
            <div className="cw-card">
              <div className="cw-card-head"><h3>Summary</h3></div>
              <div className="cw-summary-grid">
                <div>
                  <div className="dv-eyebrow">Scope</div>
                  <p className="cw-summary-body">{contract.summary.scope}</p>
                </div>
                <div className="cw-summary-inline">
                  <div className="cw-summary-mini">
                    <div className="dv-eyebrow">Value</div>
                    <div className="cw-summary-mini-val mono">{contract.value}</div>
                  </div>
                  <div className="cw-summary-mini">
                    <div className="dv-eyebrow">Billing</div>
                    <div className="cw-summary-mini-val cw-summary-mini-sm">{contract.summary.billing}</div>
                  </div>
                </div>
                <div>
                  <div className="dv-eyebrow">Current state</div>
                  <p className="cw-summary-body cw-summary-body-quote">{contract.summary.currentState}</p>
                </div>
              </div>
            </div>
          )}

          {/* Journey */}
          <div className="cw-card">
            <div className="cw-card-head">
              <h3>Commercial journey</h3>
              <span className="cw-count-line">{(contract.stageLinks || []).length} milestones</span>
            </div>
            <CWJourney contract={contract} pdata={pdata} />
          </div>

          {/* Approvals */}
          {(contract.approvals || []).length > 0 && (
            <div className="cw-card">
              <div className="cw-card-head"><h3>Approvals</h3></div>
              <div className="cw-approvals">
                {contract.approvals.map(a => {
                  const stage = pdata.stages.find(x => x.n === a.stage);
                  return (
                    <div key={a.id} className={`cw-approval cw-approval-${a.status}`}>
                      <div className="cw-approval-check">
                        {a.status === 'granted' && <Icon name="check" size={11} strokeWidth={2.5} />}
                      </div>
                      <div className="cw-approval-body">
                        <div className="cw-approval-title">{a.title}</div>
                        <div className="cw-approval-sub">
                          <Avatar name={a.approver} size="xs" portrait={cwPortrait(a.approver, pdata)} />
                          <span>{a.approver}</span>
                          <span className="dot-sep">·</span>
                          <span className="mono">S{String(a.stage).padStart(2,'0')}</span>
                          <span>·</span>
                          <span>{stage?.name}</span>
                          <span className="dot-sep">·</span>
                          <span>{a.date}</span>
                        </div>
                        {a.evidence && <div className="cw-approval-evidence">{a.evidence}</div>}
                      </div>
                      {cwStateChip(a.status)}
                    </div>
                  );
                })}
              </div>
            </div>
          )}

          {/* Documents */}
          {linkedDocs.length > 0 && (
            <div className="cw-card">
              <div className="cw-card-head">
                <h3>Documents</h3>
                <a className="link" href={`#/projects/${pdata.id}/documents`}>All documents →</a>
              </div>
              <div className="cw-docs-grid">
                {linkedDocs.map(d => (
                  <a key={d.id} href={`#/projects/${pdata.id}/documents`} className="cw-doc-tile">
                    <div className="cw-doc-tile-cover">
                      <CWDocCover kind={d.kind === 'Brief' ? 'sow' : (d.kind === 'Spec' ? 'sow' : 'contract')} />
                    </div>
                    <div className="cw-doc-tile-meta">
                      <div className="cw-doc-tile-title">{d.title}</div>
                      <div className="cw-doc-tile-sub">{d.kind} · {d.size} · Updated {d.updated}</div>
                    </div>
                  </a>
                ))}
                {/* Invoice preview — canonical when Wave 2 Beta unlocks */}
                <div className="cw-doc-tile cw-doc-tile-placeholder">
                  <div className="cw-doc-tile-cover"><CWDocCover kind="invoice" /></div>
                  <div className="cw-doc-tile-meta">
                    <div className="cw-doc-tile-title">Invoice · Wave 2 Beta</div>
                    <div className="cw-doc-tile-sub">Draft · will issue Oct 02</div>
                  </div>
                </div>
              </div>
            </div>
          )}

          {/* Costs */}
          {(contract.costs || []).length > 0 && (
            <div className="cw-card">
              <div className="cw-card-head">
                <h3>Execution-related costs</h3>
                <span className="cw-count-line">Only where a cost affects delivery</span>
              </div>
              <div className="cw-cost-grid">
                {contract.costs.map(c => {
                  const stage = pdata.stages.find(x => x.n === c.stage);
                  const missionMeta = window.MYGENI_MISSIONS[c.mission];
                  return (
                    <div key={c.id} className="cw-cost-row">
                      <div className="cw-cost-main">
                        <div className="cw-cost-label">{c.label}</div>
                        <div className="cw-cost-sub">
                          {stage && <span className="mono">S{String(c.stage).padStart(2,'0')}</span>}
                          {missionMeta && <>
                            <span className="dot-sep">·</span>
                            <span>{missionMeta.label}</span>
                          </>}
                          {c.note && <>
                            <span className="dot-sep">·</span>
                            <span>{c.note}</span>
                          </>}
                        </div>
                      </div>
                      <div className="cw-cost-amt mono">
                        {c.amount}<span className="cw-cost-cadence">{c.cadence}</span>
                      </div>
                      {cwStateChip(c.state)}
                    </div>
                  );
                })}
              </div>
            </div>
          )}
        </div>

        {/* Right rail */}
        <div className="cw-detail-rail">
          {/* At a glance */}
          <div className="cw-rail-card">
            <div className="cw-card-head"><h4>At a glance</h4></div>
            <div className="cw-glance-list">
              <div className="cw-glance"><span>Start</span><b>{contract.start}</b></div>
              <div className="cw-glance"><span>End</span><b>{contract.end}</b></div>
              <div className="cw-glance"><span>Renewal</span><b>{contract.expiresIn}</b></div>
              <div className="cw-glance"><span>Total value</span><b className="mono">{contract.value}</b></div>
              <div className="cw-glance"><span>Files</span><b>{contract.files}</b></div>
            </div>
          </div>

          {/* Client context — pointer to canonical Client area */}
          {client && (
            <div className="cw-rail-card">
              <div className="cw-card-head"><h4>Client</h4></div>
              <a href="#/clients" className="cw-client-block">
                <span className="cw-client-mark cw-client-mark-lg" style={{ background: client.color }}>{client.short}</span>
                <div>
                  <div className="cw-client-name">{client.name}</div>
                  <div className="cw-client-industry">{client.industry}</div>
                </div>
              </a>
              {contract.clientContact && (
                <div className="cw-client-contact">
                  <Avatar name={contract.clientContact} size="xs" portrait={cwPortrait(contract.clientContact, pdata)} />
                  <div>
                    <div className="cw-client-contact-name">{contract.clientContact}</div>
                    <div className="cw-client-contact-role">{contract.clientContactRole}</div>
                  </div>
                </div>
              )}
              {contract.owner && (
                <div className="cw-client-contact">
                  <Avatar name={contract.owner} size="xs" portrait={cwPortrait(contract.owner, pdata)} />
                  <div>
                    <div className="cw-client-contact-name">{contract.owner}</div>
                    <div className="cw-client-contact-role">Genspark · Commercial owner</div>
                  </div>
                </div>
              )}
              <a href="#/clients" className="cw-client-open">Open client workspace →</a>
            </div>
          )}

          {/* Cross-navigation */}
          <div className="cw-rail-card">
            <div className="cw-card-head"><h4>Related</h4></div>
            <div className="cw-related-list">
              <a href={`#/projects/${pdata.id}/plan`} className="cw-related-row">
                <Icon name="stages" size={13} strokeWidth={1.75} />
                <span>All project stages</span>
                <span className="cw-related-tag mono">PLAN</span>
              </a>
              {(contract.stageLinks || []).slice(0, 3).map(m => {
                const stage = pdata.stages.find(x => x.n === m.stage);
                return (
                  <a key={m.id} href={`#/projects/${pdata.id}/plan`} className="cw-related-row">
                    <Icon name="wallet" size={13} strokeWidth={1.75} />
                    <span className="truncate">{stage?.name} · {m.label}</span>
                    <span className="cw-related-tag mono">S{String(m.stage).padStart(2,'0')}</span>
                  </a>
                );
              })}
              <a href={`#/projects/${pdata.id}/documents`} className="cw-related-row">
                <Icon name="files" size={13} strokeWidth={1.75} />
                <span>Documents in this project</span>
                <span className="cw-related-tag mono">DOCS</span>
              </a>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

// =========================================================
// MILESTONES — chronological timeline
// =========================================================

function CWMilestones({ pdata, data, onOpenContract }) {
  const contracts = (data.contracts || []).filter(c => c.project === pdata.id);
  // Flatten all milestones, tag with contract, sort by index (roughly chronological within a contract).
  const all = contracts.flatMap(c => (c.stageLinks || []).map(m => ({ ...m, contract: c })));

  const [filter, setFilter]   = React.useState('all');   // all | upcoming | completed | attention
  const [stageF, setStageF]   = React.useState('all');
  const [contF,  setContF]    = React.useState('all');

  const stagesInUse = Array.from(new Set(all.map(m => m.stage))).sort((a,b) => a - b);

  const chipMatch = (m) => {
    if (filter === 'all') return true;
    if (filter === 'upcoming')  return ['upcoming','pending','not-started','waiting'].includes(m.state);
    if (filter === 'completed') return ['complete','shipped','granted'].includes(m.state);
    if (filter === 'attention') return ['attention','blocked','overdue'].includes(m.state);
    return true;
  };

  const filtered = all.filter(m => {
    if (!chipMatch(m)) return false;
    if (stageF !== 'all' && String(m.stage) !== stageF) return false;
    if (contF  !== 'all' && m.contract.id !== contF)    return false;
    return true;
  });

  const chips = [
    { k: 'all',       label: 'All',              n: all.length },
    { k: 'upcoming',  label: 'Upcoming',         n: all.filter(m => ['upcoming','pending','not-started','waiting'].includes(m.state)).length },
    { k: 'completed', label: 'Completed',        n: all.filter(m => ['complete','shipped','granted'].includes(m.state)).length },
    { k: 'attention', label: 'Needs attention',  n: all.filter(m => ['attention','blocked','overdue'].includes(m.state)).length },
  ];

  return (
    <div className="cw-milestones">
      <div className="dv-filters">
        <div className="dv-filter-chips">
          {chips.map(c => (
            <button key={c.k}
                    className={`dv-chip${filter === c.k ? ' active' : ''}`}
                    onClick={() => setFilter(c.k)}>
              {c.label} <span className="dv-chip-n">{c.n}</span>
            </button>
          ))}
        </div>
        <div className="dv-filter-selects">
          <select value={stageF} onChange={(e) => setStageF(e.target.value)} className="dv-select">
            <option value="all">All stages</option>
            {stagesInUse.map(s => (
              <option key={s} value={String(s)}>Stage {String(s).padStart(2,'0')}</option>
            ))}
          </select>
          <select value={contF} onChange={(e) => setContF(e.target.value)} className="dv-select">
            <option value="all">All contracts</option>
            {contracts.map(c => <option key={c.id} value={c.id}>{c.id}</option>)}
          </select>
        </div>
      </div>

      {filtered.length ? (
        <div className="cw-ms-timeline">
          {filtered.map(m => {
            const stage = pdata.stages.find(x => x.n === m.stage);
            return (
              <div key={`${m.contract.id}-${m.id}`} className="cw-ms-row">
                <div className="cw-ms-date">
                  <div className="cw-ms-date-d">{m.date.split(' ')[1]}</div>
                  <div className="cw-ms-date-m">{m.date.split(' ')[0]}</div>
                </div>
                <div className="cw-ms-track">
                  <div className={`cw-ms-node cw-ms-node-${m.state}`}>
                    {m.state === 'complete' && <Icon name="check" size={10} strokeWidth={3} />}
                    {(m.state === 'attention' || m.state === 'blocked') && <Icon name="alert" size={10} strokeWidth={2.5} />}
                  </div>
                  <div className="cw-ms-line" />
                </div>
                <div className="cw-ms-body">
                  <div className="cw-ms-title">{m.label}</div>
                  <div className="cw-ms-sub">
                    <span className="mono">S{String(m.stage).padStart(2,'0')}</span>
                    <span>·</span>
                    <span>{stage?.name}</span>
                    <span className="dot-sep">·</span>
                    <a href={`#/projects/${pdata.id}/commercial/contract/${m.contract.id}`}
                       onClick={(e) => { e.preventDefault(); onOpenContract(m.contract.id); }}
                       className="cw-ms-contract-link mono">
                      {m.contract.id}
                    </a>
                    {m.approver && <>
                      <span className="dot-sep">·</span>
                      <span className="cw-ms-approver">
                        <Avatar name={m.approver} size="xs" portrait={cwPortrait(m.approver, pdata)} />
                        <span>{m.approver}</span>
                      </span>
                    </>}
                  </div>
                  {m.evidence && <div className="cw-ms-evidence">{m.evidence}</div>}
                </div>
                {m.amount && <span className="cw-ms-amt mono">{m.amount}</span>}
                {cwStateChip(m.state)}
              </div>
            );
          })}
        </div>
      ) : (
        <div className="dv-empty dv-empty-large">No milestones match those filters.</div>
      )}
    </div>
  );
}

// =========================================================
// ROUTER SHELL
// -----------------------------------------------------------------
// Sub-route shape:
//   /commercial                   → Overview
//   /commercial/contracts         → Contracts
//   /commercial/milestones        → Milestones
//   /commercial/contract/:id      → Contract Detail
// =========================================================

function CommercialWorkspaceV2({ pdata, data, subId, sub2 }) {
  const isDetail = subId === 'contract';
  const view = isDetail
    ? 'contract'
    : (subId === 'contracts' ? 'contracts' : (subId === 'milestones' ? 'milestones' : 'overview'));

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

  return (
    <div className="cw-root" data-screen-label={`Commercial · ${view}`}>
      {!isDetail && (
        <div className="dv-nav-row">
          <div className="dv-seg" role="tablist" aria-label="Commercial views">
            {[
              { k: 'overview',   label: 'Overview'   },
              { k: 'contracts',  label: 'Contracts'  },
              { k: 'milestones', label: 'Milestones' },
            ].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">Execution-focused commercial context. Not accounting.</span>
          </div>
        </div>
      )}

      {view === 'overview'   && <CWOverview       pdata={pdata} data={data} onOpenContract={openContract} />}
      {view === 'contracts'  && <CWContracts      pdata={pdata} data={data} onOpenContract={openContract} />}
      {view === 'milestones' && <CWMilestones     pdata={pdata} data={data} onOpenContract={openContract} />}
      {view === 'contract'   && <CWContractDetail pdata={pdata} data={data} contractId={sub2} />}
    </div>
  );
}

Object.assign(window, {
  CommercialWorkspaceV2,
  CWJourney, CWDocCover,
});
