// agreement-detail.jsx — Full-page agreement detail
// Replaces the old AgreementDrawer. Schema-aligned with astro.agreements +
// agreement_parties + agreement_territories + work_agreements + agreement_versions
// + agreement_signatures + agreement_assets + advance schedule + audit log.
//
// Tabs:
//   01 OVERVIEW              — hero, terms grid, advance schedule, retention
//   02 PARTIES & TERRITORIES — agreement_parties + agreement_territories
//   03 WORKS COVERED         — work_agreements (collection vs ownership shares)
//   04 VERSIONS & SIGNATURES — agreement_versions + agreement_signatures
//   05 ASSETS & AUDIT        — agreement_assets + signature_audit_log

const { useState: useAgS, useMemo: useAgM } = React;

// ─────────── helpers
function fmtMoney(n) {
  if (n == null) return '—';
  return '$' + Number(n).toLocaleString('en-US');
}
function fmtDate(d) {
  if (!d || d === '—') return '—';
  if (d.length === 10) return d;
  try { return new Date(d).toISOString().slice(0, 10); } catch { return d; }
}
function fmtDateTime(d) {
  if (!d) return '—';
  try {
    const dt = new Date(d);
    return dt.toISOString().slice(0, 16).replace('T', ' ') + ' UTC';
  } catch { return d; }
}
function statusTone(s) {
  if (s === 'active')   return 'ok';
  if (s === 'expiring') return 'accent';
  if (s === 'pending')  return 'soft';
  return 'soft';
}

// ─────────── tiny shared ui
function AgKpi({ l, v, sub, accent }) {
  return (
    <div style={{ padding:'18px 22px', background: accent ? 'var(--accent)' : 'transparent', color: accent ? 'var(--accent-ink)' : 'var(--ink)' }}>
      <div className="ff-mono upper" style={{ fontSize:9, letterSpacing:'.12em', color: accent ? 'var(--accent-ink)' : 'var(--ink-3)', marginBottom:6, opacity: accent ? .8 : 1 }}>{l}</div>
      <div className="ff-display" style={{ fontSize:24, fontWeight:600, letterSpacing:'-0.02em', lineHeight:1.05 }}>{v}</div>
      {sub && <div className="ff-mono" style={{ fontSize:10, color: accent ? 'var(--accent-ink)' : 'var(--ink-3)', marginTop:4, opacity: accent ? .7 : 1 }}>{sub}</div>}
    </div>
  );
}

function AgSection({ num, children, right }) {
  return (
    <div style={{ display:'flex', justifyContent:'space-between', alignItems:'baseline', borderBottom:'1px solid var(--rule)', padding:'12px 0 10px', marginTop:24 }}>
      <div style={{ display:'flex', gap:10, alignItems:'baseline' }}>
        {num && <span className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)', letterSpacing:'.08em' }}>{num}</span>}
        <h3 className="ff-display" style={{ fontSize:18, fontWeight:600, letterSpacing:'-0.02em', margin:0 }}>{children}</h3>
      </div>
      {right}
    </div>
  );
}

function PartyKindIcon({ kind }) {
  // tiny visual disambiguator — square glyph
  const map = {
    writer:    { bg:'#3056C8', ch:'W' },
    publisher: { bg:'#FFE65A', ch:'P', ink:'#0e0e0c' },
    label:     { bg:'#D9602B', ch:'L' },
    society:   { bg:'#3F8F6E', ch:'S' },
    producer:  { bg:'#5c2a8a', ch:'•' },
    company:   { bg:'#6e6a60', ch:'C' },
  };
  const m = map[kind] || map.company;
  return (
    <span style={{ width:22, height:22, background:m.bg, color: m.ink || '#fff', display:'inline-flex', alignItems:'center', justifyContent:'center', fontSize:10, fontWeight:700, flexShrink:0 }}>{m.ch}</span>
  );
}

// ───────────────────────────────────────────────────────────── MAIN
function ScreenAgreement({ go, payload }) {
  const list = (typeof window.AGREEMENTS !== 'undefined') ? window.AGREEMENTS : [];
  // payload may be the full row OR just an id
  const ag = useAgM(() => {
    if (!payload) return list[0];
    if (typeof payload === 'string') return list.find(x => x.id === payload) || list[0];
    if (payload.id) return list.find(x => x.id === payload.id) || payload;
    return list[0];
  }, [payload, list]);

  const [tab, setTab] = useAgS('overview');

  if (!ag) {
    return (
      <div style={{ padding:'60px 0', textAlign:'center' }}>
        <div className="ff-mono upper" style={{ fontSize:11, color:'var(--ink-3)', letterSpacing:'.12em' }}>AGREEMENT NOT FOUND</div>
        <button onClick={() => go && go('catalog')} style={{ marginTop:16, padding:'8px 14px', border:'1px solid var(--rule)', background:'transparent', cursor:'pointer', fontSize:12 }}>Back to Catalog</button>
      </div>
    );
  }

  const advanceTotal = (ag.advanceSchedule || []).reduce((s, x) => s + (x.amount || 0), 0);
  const advancePaid  = (ag.advanceSchedule || []).filter(x => x.paid).reduce((s, x) => s + (x.amount || 0), 0);
  const worksCount   = (ag.works || []).length;
  const territoryCount = (ag.territories || []).length;
  const partiesCount = (ag.parties || []).length;
  const allSigned = (ag.signatures || []).every(s => s.verified);

  // Tabs
  const TABS = [
    { k:'overview',    l:'Overview' },
    { k:'parties',     l:'Parties & Territories', n: partiesCount + territoryCount },
    { k:'works',       l:'Works Covered',         n: worksCount },
    { k:'waterfall',   l:'Waterfall',             badge:'NEW' },
    { k:'recoupment',  l:'Recoupment',            badge:'NEW' },
    { k:'reversion',   l:'Reversion',             badge:'NEW' },
    { k:'renewals',    l:'Renewals',              badge:'NEW' },
    { k:'papergen',    l:'Generate Paper',        badge:'NEW' },
    { k:'docuseal',    l:'Docuseal',              badge:'NEW' },
    { k:'versions',    l:'Versions & Signatures', n: (ag.versions||[]).length },
    { k:'diff',        l:'Compare Versions',      badge:'NEW', n: (ag.versions||[]).length > 1 ? (ag.versions||[]).length : undefined },
    { k:'assets',      l:'Assets & Audit',        n: (ag.assets||[]).length },
  ];

  return (
    <div>
      {/* Breadcrumb */}
      <div className="ff-mono upper" style={{ fontSize:10, color:'var(--ink-3)', letterSpacing:'.12em', marginBottom:8, display:'flex', gap:10 }}>
        <button onClick={() => go && go('catalog', { tab:'agreements' })} style={{ background:'transparent', border:0, padding:0, color:'inherit', cursor:'pointer', font:'inherit', letterSpacing:'inherit', textTransform:'inherit' }}>CATALOG</button>
        <span style={{ color:'var(--ink-4)' }}>/</span>
        <span>AGREEMENTS</span>
        <span style={{ color:'var(--ink-4)' }}>/</span>
        <span style={{ color:'var(--ink)' }}>{ag.id}</span>
      </div>

      {/* Hero */}
      <div style={{ display:'grid', gridTemplateColumns:'1fr auto', gap:24, alignItems:'flex-end', marginBottom:18 }}>
        <div>
          <div style={{ display:'flex', gap:10, alignItems:'center', marginBottom:8 }}>
            <span className="ff-mono" style={{ fontSize:11, fontWeight:600, padding:'3px 8px', border:'1px solid var(--rule)', letterSpacing:'.04em' }}>{ag.id}</span>
            <span className="ff-mono upper" style={{ fontSize:10, color:'var(--ink-3)', letterSpacing:'.1em' }}>{ag.kind}</span>
            {ag.refNumber && <span className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)' }}>· REF {ag.refNumber}</span>}
            {ag.typeCwr && <span className="ff-mono" style={{ fontSize:10, padding:'2px 6px', background:'var(--bg-2)', border:'1px solid var(--rule-soft)' }}>CWR · {ag.typeCwr}</span>}
          </div>
          <h1 className="heading-swap ff-display" style={{ fontSize:'clamp(36px,4.5vw,64px)', fontWeight:700, letterSpacing:'-0.04em', lineHeight:.95, margin:0 }}>
            {ag.a} <span style={{ color:'var(--ink-3)', fontWeight:500 }}>×</span> {ag.b}
          </h1>
          {window.AgCounterpartyChip && (
            <div style={{ display:'flex', gap:8, alignItems:'center', marginTop:10, flexWrap:'wrap' }}>
              <span className="ff-mono upper" style={{ fontSize:9, color:'var(--ink-3)', letterSpacing:'.12em' }}>DEAL HISTORY</span>
              <window.AgCounterpartyChip name={ag.a} go={go} kind="publisher" />
              <window.AgCounterpartyChip name={ag.b} go={go} />
            </div>
          )}
          <div style={{ display:'flex', gap:14, alignItems:'center', marginTop:14, flexWrap:'wrap' }}>
            <Pill tone={statusTone(ag.status)} dot>{ag.status}</Pill>
            {ag.autoRenew && <span className="ff-mono upper" style={{ fontSize:9, padding:'3px 6px', background:'var(--bg-2)', border:'1px solid var(--rule-soft)', letterSpacing:'.1em' }}>AUTO-RENEW · {ag.renewNoticeMonths}M NOTICE</span>}
            {allSigned ? (
              <span className="ff-mono upper" style={{ fontSize:9, padding:'3px 6px', background:'var(--bg-2)', border:'1px solid var(--rule-soft)', letterSpacing:'.1em', display:'inline-flex', gap:6, alignItems:'center' }}>
                <span style={{ width:6, height:6, background:'#33d97a' }} />FULLY EXECUTED
              </span>
            ) : (
              <span className="ff-mono upper" style={{ fontSize:9, padding:'3px 6px', background:'var(--accent)', color:'var(--accent-ink)', letterSpacing:'.1em' }}>SIGNATURES PENDING</span>
            )}
            <span className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)' }}>· {ag.jurisdiction}</span>
            {ag.subpub && (
              <button onClick={() => go && go('subpubs', {partnerId: ag.subpub.partnerId})}
                className="ff-mono upper"
                style={{ fontSize:9, letterSpacing:'.1em', padding:'3px 8px', background:'var(--ink)', color:'var(--bg)', border:0, cursor:'pointer', display:'inline-flex', alignItems:'center', gap:6 }}>
                ⌖ OPEN IN SUB-PUBLISHERS
              </button>
            )}
          </div>
        </div>
        <div style={{ display:'flex', gap:8, flexWrap:'wrap' }}>
          <button onClick={() => window.toast && window.toast(`Contract PDF downloaded · ${ag.id}`)} className="ff-mono upper"
            style={{ padding:'10px 16px', fontSize:11, letterSpacing:'.08em', background:'var(--ink)', color:'var(--bg)', border:0, cursor:'pointer', fontWeight:600 }}>
            DOWNLOAD PDF
          </button>
          <button onClick={() => go && go('caf', { tab:'gen', agreementIds:[ag.id] })} className="ff-mono upper"
            title="Generate CISAC Common Agreement Format file for this agreement"
            style={{ padding:'10px 16px', fontSize:11, letterSpacing:'.08em', background:'var(--paper)', color:'var(--ink)', border:'1px solid var(--rule)', cursor:'pointer', fontWeight:600 }}>
            SEND VIA CAF →
          </button>
          {ag.status === 'expiring' && (
            <button onClick={() => window.toast && window.toast(`Renewal task created · ${ag.id}`, 'ok')} className="ff-mono upper"
              style={{ padding:'10px 16px', fontSize:11, letterSpacing:'.08em', background:'var(--accent)', color:'var(--accent-ink)', border:0, cursor:'pointer', fontWeight:600 }}>
              START RENEWAL
            </button>
          )}
          {ag.status === 'pending' && (
            <button onClick={() => window.toast && window.toast(`Reminder sent to ${ag.b}`)} className="ff-mono upper"
              style={{ padding:'10px 16px', fontSize:11, letterSpacing:'.08em', background:'var(--accent)', color:'var(--accent-ink)', border:0, cursor:'pointer', fontWeight:600 }}>
              NUDGE COUNTER-PARTY
            </button>
          )}
          <button className="ff-mono upper"
            style={{ padding:'10px 16px', fontSize:11, letterSpacing:'.08em', background:'transparent', border:'1px solid var(--rule)', cursor:'pointer' }}>
            EDIT
          </button>
          {window.DetailDelete && (
            <window.DetailDelete kind="agreement" record={ag} title={`${ag.a} × ${ag.b}`} subtitle={`${ag.id} · ${ag.kind}`} onDeleted={() => go && go('catalog', { tab: 'agreements' })} />
          )}
        </div>
      </div>

      {/* Unified redline strip — territory conflicts + any other engine-detected issues */}
      {window.Redlines && <window.Redlines entity={ag} kind="agreement" go={go} />}

      {/* KPI strip */}
      <div style={{ display:'grid', gridTemplateColumns:'repeat(5, 1fr)', borderTop:'1px solid var(--rule)', borderBottom:'1px solid var(--rule)' }}>
        <AgKpi l="TERM"      v={ag.term} sub={`${fmtDate(ag.start)} → ${fmtDate(ag.end)}`} />
        <AgKpi l="TERRITORY" v={ag.territory} sub={ag.territories?.length ? `${ag.territories.length} regions` : null} />
        <AgKpi l="SHARE"     v={ag.share} />
        <AgKpi l="VALUE"     v={ag.value} accent />
        <AgKpi l="WORKS"     v={worksCount || '—'} sub={worksCount ? `${worksCount} covered` : 'no works attached'} />
      </div>

      {/* Tab strip */}
      <div style={{ borderBottom:'1px solid var(--rule)', display:'flex', gap:0, marginTop:0, flexWrap:'wrap' }}>
        {TABS.map(t => (
          <button key={t.k} onClick={() => setTab(t.k)} className="ff-mono upper"
            style={{ padding:'14px 18px', fontSize:11, fontWeight:600, letterSpacing:'.08em',
              borderBottom: tab === t.k ? '3px solid var(--ink)' : '3px solid transparent',
              color: tab === t.k ? 'var(--ink)' : 'var(--ink-3)',
              background:'transparent', cursor:'pointer', display:'inline-flex', gap:8, alignItems:'center' }}>
            {t.l}
            {t.n != null && <span className="ff-mono num" style={{ fontSize:10, color:'var(--ink-4)', fontWeight:500 }}>{t.n}</span>}
            {t.badge && <span className="ff-mono" style={{ fontSize:8, padding:'1px 4px', background:'var(--accent)', color:'var(--accent-ink)', letterSpacing:'.08em' }}>{t.badge}</span>}
          </button>
        ))}
      </div>

      {/* Tab pane */}
      <div style={{ paddingTop:18 }}>
        {tab === 'overview' && <AgOverview ag={ag} advanceTotal={advanceTotal} advancePaid={advancePaid} go={go} />}
        {tab === 'parties' && <AgParties ag={ag} />}
        {tab === 'works' && <AgWorks ag={ag} go={go} />}
        {tab === 'waterfall' && window.AgWaterfall && <window.AgWaterfall ag={ag} />}
        {tab === 'recoupment' && window.AgRecoupment && <window.AgRecoupment ag={ag} />}
        {tab === 'reversion' && window.AgReversion && <window.AgReversion ag={ag} />}
        {tab === 'renewals' && window.AgRenewalsPanel && <window.AgRenewalsPanel ag={ag} />}
        {tab === 'papergen' && window.AgreementPaperPanel && <window.AgreementPaperPanel agreement={ag} />}
        {tab === 'docuseal' && window.AgDocuseal && <window.AgDocuseal ag={ag} />}
        {tab === 'versions' && <AgVersions ag={ag} />}
        {tab === 'diff' && window.AgDiffPanel && <window.AgDiffPanel ag={ag} />}
        {tab === 'assets' && <AgAssets ag={ag} />}
      </div>
    </div>
  );
}

// ───────────────────────────────────────────────────────────── 01 OVERVIEW
function AgOverview({ ag, advanceTotal, advancePaid, go }) {
  return (
    <div style={{ display:'grid', gridTemplateColumns:'1fr 360px', gap:32 }}>
      {/* Left column */}
      <div>
        {/* Effective period */}
        <AgSection num="01">Effective period</AgSection>
        <div style={{ padding:'18px 0' }}>
          <div style={{ display:'flex', alignItems:'center', gap:14 }}>
            <div>
              <div className="ff-mono upper" style={{ fontSize:9, color:'var(--ink-3)', letterSpacing:'.1em' }}>START</div>
              <div className="ff-display num" style={{ fontSize:24, fontWeight:600, letterSpacing:'-0.02em' }}>{fmtDate(ag.start)}</div>
            </div>
            <div style={{ flex:1, height:2, background:'var(--rule)', position:'relative', margin:'0 8px' }}>
              <div style={{ position:'absolute', top:-3, left:0, width:8, height:8, background:'var(--ink)' }} />
              <div style={{ position:'absolute', top:-3, right:0, width:8, height:8, background: ag.status === 'expiring' ? 'var(--accent)' : 'var(--ink)' }} />
            </div>
            <div style={{ textAlign:'right' }}>
              <div className="ff-mono upper" style={{ fontSize:9, color:'var(--ink-3)', letterSpacing:'.1em' }}>END</div>
              <div className="ff-display num" style={{ fontSize:24, fontWeight:600, letterSpacing:'-0.02em' }}>{fmtDate(ag.end)}</div>
            </div>
          </div>
          {ag.retentionEndDate && (
            <div style={{ marginTop:14, padding:'12px 14px', background:'var(--bg-2)', display:'flex', justifyContent:'space-between', alignItems:'center' }}>
              <div>
                <div className="ff-mono upper" style={{ fontSize:9, color:'var(--ink-3)', letterSpacing:'.1em', marginBottom:2 }}>POST-TERM RETENTION</div>
                <div style={{ fontSize:13 }}>{ag.retentionYears} year{ag.retentionYears===1?'':'s'} after expiry</div>
              </div>
              <div className="ff-mono num" style={{ fontSize:13, fontWeight:600 }}>thru {fmtDate(ag.retentionEndDate)}</div>
            </div>
          )}
        </div>

        {/* Advance schedule */}
        {ag.advanceSchedule && ag.advanceSchedule.length > 0 && (
          <>
            <AgSection num="02" right={
              <span className="ff-mono num" style={{ fontSize:11, color:'var(--ink-3)' }}>
                {fmtMoney(advancePaid)} <span style={{ color:'var(--ink-4)' }}>of</span> {fmtMoney(advanceTotal)} paid
              </span>
            }>Advance schedule</AgSection>
            <div style={{ marginTop:0 }}>
              <div className="ff-mono upper" style={{ display:'grid', gridTemplateColumns:'40px 1fr 110px 110px 90px', gap:14, padding:'10px 14px', fontSize:10, color:'var(--ink-3)', background:'var(--bg-2)', borderBottom:'1px solid var(--rule)' }}>
                <span>#</span><span>MILESTONE</span><span style={{ textAlign:'right' }}>AMOUNT</span><span>DUE</span><span>STATUS</span>
              </div>
              {ag.advanceSchedule.map(p => (
                <div key={p.n} style={{ display:'grid', gridTemplateColumns:'40px 1fr 110px 110px 90px', gap:14, padding:'12px 14px', borderBottom:'1px solid var(--rule-soft)', alignItems:'center' }}>
                  <span className="ff-mono num" style={{ fontSize:11, color:'var(--ink-3)' }}>{String(p.n).padStart(2,'0')}</span>
                  <div>
                    <div style={{ fontSize:13, fontWeight:500 }}>{p.label}</div>
                    {p.paid && p.paidOn && <div className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)', marginTop:2 }}>paid {fmtDate(p.paidOn)}</div>}
                  </div>
                  <span className="ff-mono num" style={{ fontSize:13, fontWeight:600, textAlign:'right' }}>{fmtMoney(p.amount)}</span>
                  <span className="ff-mono num" style={{ fontSize:11 }}>{fmtDate(p.due)}</span>
                  {p.paid
                    ? <Pill tone="ok" dot>paid</Pill>
                    : <Pill tone="soft" dot>due</Pill>}
                </div>
              ))}
            </div>
          </>
        )}

        {/* Special clauses */}
        <AgSection num={ag.advanceSchedule?.length ? '03' : '02'}>Special clauses</AgSection>
        <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:0, borderBottom:'1px solid var(--rule-soft)' }}>
          {[
            ['AUTO-RENEW',         ag.autoRenew ? `yes · ${ag.renewNoticeMonths}m notice` : 'no'],
            ['SHARES CAN CHANGE',  ag.sharesCanChange ? 'yes' : 'no'],
            ['ADVANCE GIVEN',      ag.advanceGiven ? 'yes' : 'no'],
            ['SALES / MFR',        ag.salesOrManufacture === 'S' ? 'sales-based' : ag.salesOrManufacture === 'M' ? 'manufacture-based' : '—'],
            ['PRIOR ROYALTY',      ag.priorRoyaltyStatus === 'A' ? 'all retained' : ag.priorRoyaltyStatus === 'N' ? 'none' : '—'],
            ['JURISDICTION',       ag.jurisdiction || '—'],
            ['DISPUTE',            ag.disputeResolution || '—'],
            ['SOCIETY AGR. №',     ag.societyAgreementNumber || '—'],
          ].map(([l, v], i) => (
            <div key={l} style={{ padding:'14px 14px', borderTop:'1px solid var(--rule-soft)', borderRight: i % 2 === 0 ? '1px solid var(--rule-soft)' : 'none' }}>
              <div className="ff-mono upper" style={{ fontSize:9, color:'var(--ink-3)', letterSpacing:'.1em', marginBottom:4 }}>{l}</div>
              <div className="ff-mono" style={{ fontSize:13 }}>{v}</div>
            </div>
          ))}
        </div>
      </div>

      {/* Right column · timeline + activity */}
      <aside>
        <AgSection num="A">Timeline</AgSection>
        <div style={{ position:'relative', paddingLeft:18, marginTop:14 }}>
          <div style={{ position:'absolute', left:5, top:6, bottom:6, width:1, background:'var(--rule)' }} />
          {(ag.audit || []).slice(0, 8).map((e, i) => (
            <div key={i} style={{ position:'relative', paddingBottom:14 }}>
              <div style={{ position:'absolute', left:-18, top:5, width:11, height:11, background: e.who === 'System' ? 'var(--accent)' : 'var(--ink)' }} />
              <div className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)', marginBottom:2 }}>{fmtDateTime(e.at)} · {e.who}</div>
              <div style={{ fontSize:13, lineHeight:1.4 }}>{e.what}</div>
            </div>
          ))}
        </div>
      </aside>
    </div>
  );
}

// ───────────────────────────────────────────────────────────── 02 PARTIES & TERRITORIES
function AgParties({ ag }) {
  return (
    <div>
      <AgSection num="01" right={<span className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)' }}>{(ag.parties||[]).length} parties</span>}>Parties</AgSection>
      <div className="ff-mono upper" style={{ display:'grid', gridTemplateColumns:'130px 1fr 130px 90px 90px', gap:14, padding:'10px 14px', fontSize:10, color:'var(--ink-3)', background:'var(--bg-2)', borderBottom:'1px solid var(--rule)' }}>
        <span>ROLE</span><span>NAME</span><span>IPI</span><span style={{ textAlign:'right' }}>SHARE</span><span>CONTROL</span>
      </div>
      {(ag.parties || []).map((p, i) => (
        <div key={i} style={{ display:'grid', gridTemplateColumns:'130px 1fr 130px 90px 90px', gap:14, padding:'14px', borderBottom:'1px solid var(--rule-soft)', alignItems:'center' }}>
          <span className="ff-mono upper" style={{ fontSize:10, fontWeight:600, letterSpacing:'.08em' }}>{p.role}</span>
          <div style={{ display:'flex', gap:10, alignItems:'center' }}>
            <PartyKindIcon kind={p.kind} />
            <div>
              <div style={{ fontSize:13, fontWeight:600 }}>{p.name}</div>
              <div className="ff-mono upper" style={{ fontSize:9, color:'var(--ink-3)', letterSpacing:'.08em', marginTop:2 }}>{p.kind}</div>
            </div>
          </div>
          <span className="ff-mono num" style={{ fontSize:11 }}>{p.ipi || '—'}</span>
          <span className="ff-mono num" style={{ fontSize:13, fontWeight:600, textAlign:'right' }}>{p.share == null ? '—' : p.share + '%'}</span>
          {p.isControlled
            ? <Pill tone="ok" dot>controlled</Pill>
            : <span className="ff-mono" style={{ fontSize:11, color:'var(--ink-3)' }}>external</span>}
        </div>
      ))}

      <AgSection num="02" right={<span className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)' }}>{(ag.territories||[]).length} territory rows</span>}>Territories &amp; rights</AgSection>
      {window.AgreementTerritoryConflicts && <window.AgreementTerritoryConflicts ag={ag} />}
      <div className="ff-mono upper" style={{ display:'grid', gridTemplateColumns:'80px 1fr 1fr 100px 100px', gap:14, padding:'10px 14px', fontSize:10, color:'var(--ink-3)', background:'var(--bg-2)', borderBottom:'1px solid var(--rule)' }}>
        <span>CODE</span><span>TERRITORY</span><span>RIGHTS</span><span style={{ textAlign:'right' }}>COLLECTION</span><span style={{ textAlign:'right' }}>OWNERSHIP</span>
      </div>
      {(ag.territories || []).map((t, i) => {
        // Find sub-pub partner(s) covering this territory
        const subpubs = (window.SP_DEALS || [])
          .filter(d => (d.status === 'active' || d.status === 'expiring') && d.territories.includes(t.code))
          .map(d => ({ deal: d, partner: (window.SP_PARTNERS || []).find(p => p.id === d.partnerId) }))
          .filter(x => x.partner);
        return (
          <div key={i} style={{ display:'grid', gridTemplateColumns:'80px 1fr 1fr 100px 100px', gap:14, padding:'14px', borderBottom:'1px solid var(--rule-soft)', alignItems:'center' }}>
            <span className="ff-mono" style={{ fontSize:11, fontWeight:600 }}>{t.code}</span>
            <div>
              <div style={{ fontSize:13, fontWeight:500 }}>{t.label}</div>
              {t.excluded && t.excluded.length > 0 && (
                <div className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)', marginTop:2 }}>excluded · {t.excluded.join(' · ')}</div>
              )}
              {subpubs.length > 0 && (
                <div style={{ display:'flex', flexWrap:'wrap', gap:4, marginTop:6 }}>
                  {subpubs.map(({deal, partner}) => (
                    <button key={deal.id}
                      onClick={(e) => { e.stopPropagation(); window.dispatchEvent(new CustomEvent('astro-open-subpub', {detail:{partnerId: partner.id}})); if (window.__astroGo) window.__astroGo('subpubs', {partnerId: partner.id}); }}
                      className="ff-mono upper"
                      style={{ fontSize:9, letterSpacing:'.08em', padding:'2px 6px', background:'var(--bg-2)', border:'1px solid var(--rule)', cursor:'pointer', color:'var(--ink-2)' }}>
                      via {partner.name.split(' ')[0]} · {deal.feePct}%
                    </button>
                  ))}
                </div>
              )}
            </div>
            <span className="ff-mono" style={{ fontSize:11, color:'var(--ink-2)' }}>{t.rights}</span>
            <span className="ff-mono num" style={{ fontSize:13, fontWeight:600, textAlign:'right' }}>{t.collection}%</span>
            <span className="ff-mono num" style={{ fontSize:13, fontWeight:600, textAlign:'right' }}>{t.ownership}%</span>
          </div>
        );
      })}
      {window.AgreementTerritoryFooter && <window.AgreementTerritoryFooter ag={ag} />}
    </div>
  );
}

// ───────────────────────────────────────────────────────────── 03 WORKS COVERED
function AgWorks({ ag, go }) {
  const works = ag.works || [];
  if (works.length === 0) {
    return (
      <div style={{ padding:'60px 0', textAlign:'center', borderBottom:'1px solid var(--rule)' }}>
        <div className="ff-mono upper" style={{ fontSize:10, color:'var(--ink-3)', letterSpacing:'.12em', marginBottom:6 }}>NO WORKS ATTACHED</div>
        <div style={{ fontSize:13, color:'var(--ink-3)' }}>This is a {ag.kind.toLowerCase()} agreement — works are attached at the parent level.</div>
      </div>
    );
  }
  return (
    <div>
      <AgSection num="01" right={<button className="ff-mono upper" style={{ padding:'7px 12px', fontSize:10, letterSpacing:'.08em', border:'1px solid var(--rule)', background:'transparent', cursor:'pointer' }}>+ ATTACH WORK</button>}>
        Works covered <span className="ff-mono num" style={{ fontSize:13, color:'var(--ink-3)', fontWeight:500 }}>{works.length}</span>
      </AgSection>
      <div className="ff-mono upper" style={{ display:'grid', gridTemplateColumns:'90px 1fr 160px 110px 110px 90px', gap:14, padding:'10px 14px', fontSize:10, color:'var(--ink-3)', background:'var(--bg-2)', borderBottom:'1px solid var(--rule)' }}>
        <span>WORK ID</span><span>TITLE</span><span>ISWC</span><span style={{ textAlign:'right' }}>COLLECTION</span><span style={{ textAlign:'right' }}>OWNERSHIP</span><span>STATUS</span>
      </div>
      {works.map(w => (
        <div key={w.id} onClick={() => {
          // Open the matching work via existing routes if present
          const all = (typeof window.WORKS !== 'undefined') ? window.WORKS : [];
          const match = all.find(x => x.title === w.title || x.id === w.id);
          if (match && go) go('work', match);
        }} style={{ display:'grid', gridTemplateColumns:'90px 1fr 160px 110px 110px 90px', gap:14, padding:'14px', borderBottom:'1px solid var(--rule-soft)', alignItems:'center', cursor:'pointer' }}
          onMouseEnter={e => e.currentTarget.style.background = 'var(--bg-2)'}
          onMouseLeave={e => e.currentTarget.style.background = 'transparent'}>
          <span className="ff-mono" style={{ fontSize:11, fontWeight:600 }}>{w.id}</span>
          <span style={{ fontSize:13, fontWeight:500 }}>{w.title}</span>
          <span className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)' }}>{w.iswc}</span>
          <span className="ff-mono num" style={{ fontSize:13, fontWeight:600, textAlign:'right' }}>{w.collection}%</span>
          <span className="ff-mono num" style={{ fontSize:13, fontWeight:600, textAlign:'right' }}>{w.ownership}%</span>
          <Pill tone={w.status === 'registered' ? 'ok' : 'accent'} dot>{w.status}</Pill>
        </div>
      ))}
      {/* Footer summary */}
      <div style={{ display:'grid', gridTemplateColumns:'90px 1fr 160px 110px 110px 90px', gap:14, padding:'14px', background:'var(--bg-2)', borderTop:'2px solid var(--ink)' }}>
        <span></span>
        <span className="ff-mono upper" style={{ fontSize:10, fontWeight:700, letterSpacing:'.08em' }}>WEIGHTED AVG</span>
        <span></span>
        <span className="ff-mono num" style={{ fontSize:13, fontWeight:700, textAlign:'right' }}>{
          works.length ? Math.round(works.reduce((s, x) => s + x.collection, 0) / works.length) : 0
        }%</span>
        <span className="ff-mono num" style={{ fontSize:13, fontWeight:700, textAlign:'right' }}>{
          works.length ? Math.round(works.reduce((s, x) => s + x.ownership, 0) / works.length) : 0
        }%</span>
        <span></span>
      </div>
    </div>
  );
}

// ───────────────────────────────────────────────────────────── 04 VERSIONS & SIGNATURES
function AgVersions({ ag }) {
  return (
    <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:32 }}>
      {/* Versions */}
      <div>
        <AgSection num="01">Document versions</AgSection>
        <div style={{ position:'relative', paddingLeft:18 }}>
          <div style={{ position:'absolute', left:5, top:6, bottom:6, width:1, background:'var(--rule)' }} />
          {(ag.versions || []).map(v => (
            <div key={v.n} style={{ position:'relative', paddingBottom:18 }}>
              <div style={{ position:'absolute', left:-18, top:5, width:11, height:11, background: v.current ? 'var(--ink)' : 'var(--rule)' }} />
              <div style={{ display:'flex', gap:10, alignItems:'baseline', marginBottom:2 }}>
                <span className="ff-display num" style={{ fontSize:18, fontWeight:600, letterSpacing:'-0.02em' }}>v{v.n}</span>
                {v.current && <span className="ff-mono upper" style={{ fontSize:9, padding:'2px 6px', background:'var(--ink)', color:'var(--bg)', letterSpacing:'.1em' }}>CURRENT</span>}
                <span className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)' }}>{fmtDate(v.date)}</span>
              </div>
              <div className="ff-mono" style={{ fontSize:11, color:'var(--ink-3)', marginBottom:4 }}>by {v.author}</div>
              <div style={{ fontSize:13, lineHeight:1.45 }}>{v.note}</div>
              <button className="ff-mono upper" style={{ marginTop:8, padding:'5px 10px', fontSize:9, letterSpacing:'.08em', border:'1px solid var(--rule)', background:'transparent', cursor:'pointer' }}>
                {v.current ? 'OPEN' : 'COMPARE'}
              </button>
            </div>
          ))}
        </div>
      </div>

      {/* Signatures */}
      <div>
        <AgSection num="02">Signatures</AgSection>
        {(ag.signatures || []).map((s, i) => (
          <div key={i} style={{ padding:'14px', borderBottom:'1px solid var(--rule-soft)', display:'grid', gridTemplateColumns:'1fr auto', gap:12, alignItems:'flex-start' }}>
            <div>
              <div style={{ fontSize:13, fontWeight:600 }}>{s.party}</div>
              {s.signer ? (
                <>
                  <div className="ff-mono" style={{ fontSize:11, color:'var(--ink-2)', marginTop:3 }}>{s.signer} · <span style={{ color:'var(--ink-3)' }}>{s.role}</span></div>
                  <div className="ff-mono" style={{ fontSize:10, color:'var(--ink-3)', marginTop:2 }}>{s.method} · {fmtDateTime(s.at)}</div>
                </>
              ) : (
                <div className="ff-mono upper" style={{ fontSize:10, color:'var(--accent-ink)', background:'var(--accent)', display:'inline-block', padding:'2px 6px', marginTop:6, letterSpacing:'.1em' }}>AWAITING SIGNATURE</div>
              )}
            </div>
            {s.verified
              ? <span className="ff-mono upper" style={{ fontSize:9, padding:'3px 6px', background:'var(--bg-2)', border:'1px solid var(--rule-soft)', letterSpacing:'.1em', display:'inline-flex', gap:6, alignItems:'center' }}>
                  <span style={{ width:6, height:6, background:'#33d97a' }} />VERIFIED
                </span>
              : <span className="ff-mono upper" style={{ fontSize:9, padding:'3px 6px', background:'var(--bg-2)', letterSpacing:'.1em', color:'var(--ink-3)' }}>—</span>}
          </div>
        ))}
      </div>
    </div>
  );
}

// ───────────────────────────────────────────────────────────── 05 ASSETS & AUDIT
function AgAssets({ ag }) {
  return (
    <div>
      <AgSection num="01" right={<button className="ff-mono upper" style={{ padding:'7px 12px', fontSize:10, letterSpacing:'.08em', border:'1px solid var(--rule)', background:'transparent', cursor:'pointer' }}>+ UPLOAD</button>}>
        Documents &amp; assets <span className="ff-mono num" style={{ fontSize:13, color:'var(--ink-3)', fontWeight:500 }}>{(ag.assets||[]).length}</span>
      </AgSection>
      <div className="ff-mono upper" style={{ display:'grid', gridTemplateColumns:'180px 1fr 90px 110px 130px', gap:14, padding:'10px 14px', fontSize:10, color:'var(--ink-3)', background:'var(--bg-2)', borderBottom:'1px solid var(--rule)' }}>
        <span>KIND</span><span>FILE</span><span style={{ textAlign:'right' }}>SIZE</span><span>UPLOADED</span><span>BY</span>
      </div>
      {(ag.assets || []).map((a, i) => (
        <div key={i} style={{ display:'grid', gridTemplateColumns:'180px 1fr 90px 110px 130px', gap:14, padding:'14px', borderBottom:'1px solid var(--rule-soft)', alignItems:'center', cursor:'pointer' }}
          onMouseEnter={e => e.currentTarget.style.background = 'var(--bg-2)'}
          onMouseLeave={e => e.currentTarget.style.background = 'transparent'}>
          <span className="ff-mono upper" style={{ fontSize:10, fontWeight:600, letterSpacing:'.08em' }}>{a.kind}</span>
          <div style={{ display:'flex', gap:10, alignItems:'center' }}>
            <span style={{ width:24, height:30, background:'var(--bg-2)', border:'1px solid var(--rule)', display:'inline-flex', alignItems:'center', justifyContent:'center', fontSize:8, fontWeight:700, color:'var(--ink-3)', flexShrink:0 }}>PDF</span>
            <span className="ff-mono" style={{ fontSize:12 }}>{a.name}</span>
          </div>
          <span className="ff-mono num" style={{ fontSize:11, textAlign:'right' }}>{a.size}</span>
          <span className="ff-mono num" style={{ fontSize:11 }}>{fmtDate(a.uploaded)}</span>
          <span className="ff-mono" style={{ fontSize:11, color:'var(--ink-3)' }}>{a.by}</span>
        </div>
      ))}

      <AgSection num="02" right={<button className="ff-mono upper" style={{ padding:'7px 12px', fontSize:10, letterSpacing:'.08em', border:'1px solid var(--rule)', background:'transparent', cursor:'pointer' }}>EXPORT CSV</button>}>
        Audit log
      </AgSection>
      <div style={{ position:'relative', paddingLeft:18 }}>
        <div style={{ position:'absolute', left:5, top:6, bottom:6, width:1, background:'var(--rule)' }} />
        {(ag.audit || []).map((e, i) => (
          <div key={i} style={{ position:'relative', paddingBottom:14, display:'grid', gridTemplateColumns:'170px 110px 1fr', gap:14 }}>
            <span style={{ position:'absolute', left:-18, top:5, width:11, height:11, background: e.who === 'System' ? 'var(--accent)' : 'var(--ink)' }} />
            <span className="ff-mono num" style={{ fontSize:11, color:'var(--ink-3)' }}>{fmtDateTime(e.at)}</span>
            <span className="ff-mono" style={{ fontSize:11, color: e.who === 'System' ? 'var(--ink-3)' : 'var(--ink-2)' }}>{e.who}</span>
            <span style={{ fontSize:13, lineHeight:1.4 }}>{e.what}</span>
          </div>
        ))}
      </div>
    </div>
  );
}

Object.assign(window, { ScreenAgreement });
