/* ============================================================
 * VVB / Auditor portal — the workbench that was misplaced in the
 * developer portal in the demo.
 *
 *   1. AuditList         — assigned reviews queue
 *   2. EvidenceBrowser   — pre-audit reconciliation
 *   3. SamplingPanel     — VM0047 sampling plan
 *   4. AnomalyQueue      — outliers to adjudicate
 *   5. SignOffCeremony   — Approve / Approve-pending / Reject
 *                          + Sign & commit to Hedera
 *
 * A developer signing off their own project is the one thing
 * that breaks the platform's trust story — these screens are
 * deliberately VVB-only.
 * ============================================================ */

function VVBHome({ projects, onPickAudit, onOpenView, signedOff }) {
  // Only projects in Phase 2+ with assigned VVB show in the queue
  const queue = projects.filter(p => p.vvbAssigned && p.phase >= 2 && !signedOff[p.id]);
  return (
    <main style={{flex:1, padding:'28px 32px', background:'#F9FAFB', minWidth:0}}>
      <div style={{display:'flex', justifyContent:'space-between', alignItems:'flex-end', gap:24, marginBottom:20, flexWrap:'wrap'}}>
        <div>
          <div style={{fontSize:11, fontWeight:800, letterSpacing:'0.12em', textTransform:'uppercase', color:'#F4C300', marginBottom:4}}>
            VVB Auditor · Verra VVB-007
          </div>
          <h1 style={{fontSize:32, fontWeight:900, color:'#022C28', letterSpacing:'-0.02em', margin:0, lineHeight:1.05}}>
            Verification queue
          </h1>
          <p style={{fontSize:14, color:'#6B7280', margin:'6px 0 0', maxWidth:680, lineHeight:1.55}}>
            Reviewers verify. They don't reconstruct. Every claim arrives pre-reconciled — you verify, sign, and the verdict commits to Hedera.
          </p>
        </div>
        <div style={{display:'flex', gap:8}}>
          <Btn kind="secondary" icon="filter">Filter</Btn>
          <Btn kind="secondary" icon="download">Export</Btn>
        </div>
      </div>

      <div style={{display:'grid', gridTemplateColumns:'repeat(4,1fr)', gap:14, marginBottom:24}}>
        <StatCard label="Open reviews" value={queue.length} sub="Across your assignments" accent="#F4C300" icon="list"/>
        <StatCard label="Avg desk-review days" value="7.2" sub="Down from 32 industry avg" accent="#2BC48A" icon="clock"/>
        <StatCard label="Pre-audit pass rate" value="87%" sub="Findings resolved pre-review" accent="#0077B6" icon="shield"/>
        <StatCard label="Anchors signed" value="42" sub="Last 90 days" accent="#7C5CFC" icon="hedera"/>
      </div>

      <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, overflow:'hidden', marginBottom:24}}>
        <div style={{padding:'18px 22px', display:'flex', justifyContent:'space-between', alignItems:'baseline', borderBottom:'1px solid #F3F4F6'}}>
          <div>
            <div style={{fontSize:10, fontWeight:800, textTransform:'uppercase', letterSpacing:'0.12em', color:'#F4C300'}}>Active</div>
            <h2 style={{fontSize:18, fontWeight:900, color:'#022C28', margin:'2px 0 0'}}>Assigned reviews</h2>
          </div>
          <div style={{fontSize:11, color:'#6B7280', fontFamily:'JetBrains Mono, monospace'}}>Sorted by due date</div>
        </div>

        {queue.length === 0 && (
          <div style={{padding:32}}>
            <EmptyState icon="check" title="No assignments waiting" body="All your assigned projects have been signed off. New assignments will appear here when project developers submit Phase 3 for validation."/>
          </div>
        )}

        {queue.map((p, i) => (
          <AuditQueueRow key={p.id} project={p} index={i+1} onClick={()=>onPickAudit(p)}/>
        ))}
      </div>

      <div style={{display:'grid', gridTemplateColumns:'1fr 1fr', gap:18}}>
        <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, overflow:'hidden'}}>
          <div style={{padding:'16px 20px', borderBottom:'1px solid #F3F4F6'}}>
            <div style={{fontSize:10, fontWeight:800, textTransform:'uppercase', letterSpacing:'0.12em', color:'#F4C300'}}>Pre-Audit Agent</div>
            <h2 style={{fontSize:16, fontWeight:900, color:'#022C28', margin:'2px 0 0'}}>Recent reconciliations</h2>
          </div>
          <div style={{padding:'6px 20px 18px'}}>
            {[
              { kind:'ok', body:<><b>Stratum B baseline — reconciled clean.</b> 42 plots, all DBH within methodology bounds.</>, meta:'PRJ-KE-BUS001 · 2 hrs ago' },
              { kind:'warn', body:<><b>Plot 42 outlier flagged.</b> DBH 84 cm exceeds species-typical range.</>, meta:'PRJ-KE-BUS001 · 4 hrs ago' },
              { kind:'ai', body:<><b>PDD §4.2 awaits human signature.</b> AI draft accepted by developer.</>, meta:'PRJ-KE-WAM002 · 6 hrs ago' },
              { kind:'ok', body:<><b>Methodology VM0047 imported.</b> Cross-checked against baseline params.</>, meta:'PRJ-KE-BUS001 · yesterday' },
            ].map((e,i) => (
              <div key={i} style={{display:'flex', gap:12, padding:'10px 0', borderBottom: i<3 ? '1px dashed #F3F4F6' : 'none'}}>
                <span style={{width:8, height:8, borderRadius:'50%', marginTop:6, background: e.kind==='warn' ? '#D97706' : e.kind==='ai' ? '#0077B6' : '#2BC48A', flexShrink:0}}/>
                <div style={{flex:1, minWidth:0}}>
                  <div style={{fontSize:13, color:'#022C28', lineHeight:1.45}}>{e.body}</div>
                  <div style={{fontSize:11, color:'#6B7280', marginTop:3}}>{e.meta}</div>
                </div>
              </div>
            ))}
          </div>
        </div>

        <div style={{background:'#022C28', borderRadius:10, padding:'18px 22px', color:'#fff'}}>
          <div style={{display:'flex', alignItems:'baseline', justifyContent:'space-between', marginBottom:12}}>
            <div>
              <div style={{fontSize:10, fontWeight:800, letterSpacing:'0.12em', textTransform:'uppercase', color:'#F4C300'}}>Hedera audit trail</div>
              <h2 style={{fontSize:16, fontWeight:900, margin:'2px 0 0'}}>Topic 0.0.8321350</h2>
            </div>
            <span style={{fontSize:10, fontFamily:'JetBrains Mono, monospace', color:'rgba(255,255,255,0.5)'}}>testnet</span>
          </div>
          <div style={{fontFamily:'JetBrains Mono, monospace', fontSize:11, lineHeight:1.8, color:'rgba(255,255,255,0.85)'}}>
            {HEDERA_EVENTS.slice(0,6).map((e,i) => (
              <div key={i} style={{display:'grid', gridTemplateColumns:'52px 1fr 60px', gap:10, padding:'4px 0', borderBottom: i<5 ? '1px dashed rgba(255,255,255,0.08)' : 'none'}}>
                <span style={{color:'rgba(255,255,255,0.4)'}}>{e.t.split(' ')[0]}</span>
                <span><span style={{color:'#F4C300'}}>{e.actor}</span> {e.action.split('·')[0].trim()}</span>
                <span style={{color:'#B894FF', textAlign:'right'}}>@{e.tx.split('@')[1]}</span>
              </div>
            ))}
          </div>
        </div>
      </div>
    </main>
  );
}

function AuditQueueRow({ project, index, onClick }) {
  const stage = project.phase === 3 ? 'DESK REVIEW' : project.phase === 4 ? 'SITE VISIT' : project.phase === 5 ? 'FINAL SIGN-OFF' : 'PRE-REVIEW';
  const due = { 'PRJ-KE-BUS001': '5 days', 'PRJ-KE-WAM002': '12 days', 'PRJ-RW-BUG005': '3 days' }[project.id] || '21 days';
  return (
    <div onClick={onClick} style={{
      display:'grid', gridTemplateColumns:'36px 1fr 140px 130px 100px',
      gap:18, padding:'16px 22px', borderBottom:'1px solid #F3F4F6',
      cursor:'pointer', alignItems:'center', transition:'background 150ms',
    }}
    onMouseEnter={e=>e.currentTarget.style.background='#FFF8E0'}
    onMouseLeave={e=>e.currentTarget.style.background='#fff'}>
      <span style={{fontFamily:'JetBrains Mono, monospace', fontSize:11, fontWeight:800, color:'#B8960A', letterSpacing:'0.06em'}}>{String(index).padStart(2,'0')}</span>
      <div>
        <div style={{display:'flex', alignItems:'center', gap:10, marginBottom:2}}>
          <span style={{fontSize:14, fontWeight:900, color:'#022C28', letterSpacing:'-0.01em'}}>{project.name}</span>
          <Badge variant={project.registryVariant} mono>{project.registry}</Badge>
        </div>
        <div style={{fontSize:12, color:'#6B7280'}}>
          <span style={{fontFamily:'JetBrains Mono, monospace'}}>{project.id}</span> · Phase {project.phase} · {project.methodology} · {project.area}
        </div>
      </div>
      <div style={{display:'flex', alignItems:'center', gap:8}}>
        <div style={{flex:1, height:5, background:'#F3F4F6', borderRadius:3, overflow:'hidden'}}>
          <div style={{height:'100%', background:'#F4C300', width:`${project.vvb}%`}}/>
        </div>
        <span style={{fontFamily:'JetBrains Mono, monospace', fontSize:11, fontWeight:800, color:'#022C28'}}>{project.vvb}</span>
      </div>
      <span style={{
        display:'inline-flex', alignItems:'center',
        fontSize:10, fontFamily:'JetBrains Mono, monospace', fontWeight:800, letterSpacing:'0.06em',
        padding:'4px 10px', borderRadius:6,
        background: stage==='DESK REVIEW' ? '#E6FBF3' : stage==='SITE VISIT' ? '#FEF3C7' : stage==='FINAL SIGN-OFF' ? '#FFF8E0' : '#F3F4F6',
        color:    stage==='DESK REVIEW' ? '#059669' : stage==='SITE VISIT' ? '#92400E' : stage==='FINAL SIGN-OFF' ? '#B8960A' : '#6B7280',
      }}>{stage}</span>
      <span style={{fontSize:11, fontWeight:700, color:'#6B7280', textAlign:'right'}}>Due in {due}</span>
    </div>
  );
}

/* ============================================================
 * Evidence Browser
 * ============================================================ */

function EvidenceBrowser({ projects, hero, onAdvance }) {
  const [pickId, setPickId] = React.useState(hero.id);
  const project = projects.find(p=>p.id===pickId) || hero;
  const fields = project.id === 'PRJ-KE-BUS001' ? PHASE3_FIELDS : syntheticFields(project);

  return (
    <main style={{flex:1, padding:'28px 32px', background:'#F9FAFB', minWidth:0}}>
      <VVBToolbar project={project} pickId={pickId} setPickId={setPickId} projects={projects.filter(p=>p.vvbAssigned)} title="Evidence browser" subtitle="Verify each claim against its source — the Pre-Audit Agent has already done the matching."/>

      <div style={{display:'grid', gridTemplateColumns:'1.5fr 1fr', gap:18}}>
        <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding:24}}>
          <SectionHeader eyebrow="Pre-reconciled" title="Field-by-field evidence" tail={`${fields.length} fields · ${fields.filter(f=>f.state==='confirmed' || f.state==='committed' || f.state==='imported').length} traceable`}/>
          <div style={{display:'flex', flexDirection:'column', gap:8, marginTop:14}}>
            {fields.map(f => <EvidenceRow key={f.id} field={f}/>)}
          </div>
        </div>

        <aside style={{display:'flex', flexDirection:'column', gap:18}}>
          <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding:20}}>
            <div style={{fontSize:11, fontWeight:800, textTransform:'uppercase', letterSpacing:'0.1em', color:'#9CA3AF', marginBottom:10}}>Reconciliation summary</div>
            <Row k="Fields total" v={fields.length}/>
            <Row k="Source-linked" v={`${fields.filter(f=>['confirmed','committed','imported','ai'].includes(f.state)).length}`} fg="#059669"/>
            <Row k="AI-suggested awaiting review" v={fields.filter(f=>f.state==='ai').length} fg="#0077B6"/>
            <Row k="Flagged" v={fields.filter(f=>f.state==='flagged').length} fg="#D97706"/>
            <Row k="Empty" v={fields.filter(f=>f.state==='empty').length} fg="#9CA3AF"/>
          </div>

          <div style={{background:'#022C28', borderRadius:10, padding:20, color:'#fff'}}>
            <div style={{fontSize:10, fontWeight:800, letterSpacing:'0.1em', textTransform:'uppercase', color:'#F4C300', marginBottom:6}}>Methodology</div>
            <div style={{fontSize:15, fontWeight:900, marginBottom:4}}>{project.methodology}</div>
            <div style={{fontSize:12, color:'rgba(255,255,255,0.65)', lineHeight:1.5, marginBottom:14}}>{project.methodologyName}</div>
            <Btn kind="primary" onClick={()=>onAdvance(project, 'sampling')} icon="arrowRight" style={{width:'100%', justifyContent:'space-between'}}>Continue to sampling</Btn>
          </div>
        </aside>
      </div>
    </main>
  );
}

function EvidenceRow({ field }) {
  const S = FIELD_STATE[field.state] || FIELD_STATE.empty;
  return (
    <div style={{
      display:'grid', gridTemplateColumns:'1fr 1fr 120px', gap:14, alignItems:'center',
      padding:'12px 14px', border:`1px solid ${S.bd}55`, background: S.state==='empty' ? '#fff' : S.bg + '40', borderRadius:10,
    }}>
      <div style={{minWidth:0}}>
        <div style={{fontSize:10, fontWeight:800, textTransform:'uppercase', letterSpacing:'0.06em', color:S.lblc, marginBottom:2}}>{field.label}</div>
        <div style={{fontSize:13, fontWeight:700, color:'#022C28'}}>{field.value}</div>
      </div>
      <div style={{fontSize:11, color:'#6B7280', minWidth:0}}>{field.who}</div>
      <div style={{display:'flex', justifyContent:'flex-end'}}>
        <span style={{display:'inline-flex', alignItems:'center', gap:4, fontSize:10, fontWeight:800, color:S.lblc, letterSpacing:'0.04em', textTransform:'uppercase', whiteSpace:'nowrap'}}>
          <PamojaIcon name={S.icon} size={10} color={S.lblc} stroke={2}/>
          {S.lbl}
        </span>
      </div>
    </div>
  );
}

/* ============================================================
 * Sampling Panel — VM0047 plot sampling plan
 * ============================================================ */

function SamplingPanel({ projects, hero, onAdvance }) {
  const [pickId, setPickId] = React.useState(hero.id);
  const project = projects.find(p=>p.id===pickId) || hero;

  const strata = [
    { id:'A', name:'Stratum A — Lowland', target:18, sampled:18, area:'6,420 ha', mean:'42.1', sd:'4.8', ok:true },
    { id:'B', name:'Stratum B — Riparian', target:12, sampled:8, area:'2,180 ha', mean:'48.6', sd:'7.1', ok:false },
    { id:'C', name:'Stratum C — Midland', target:14, sampled:14, area:'3,850 ha', mean:'39.4', sd:'5.2', ok:true },
  ];

  return (
    <main style={{flex:1, padding:'28px 32px', background:'#F9FAFB', minWidth:0}}>
      <VVBToolbar project={project} pickId={pickId} setPickId={setPickId} projects={projects.filter(p=>p.vvbAssigned)} title="Sampling plan" subtitle={`VM0047 §6.2 requires ≥12 plots per stratum (90% confidence, ±10% precision). Pre-Audit Agent has reconciled measurements against plot photos and field-agent timestamps.`}/>

      <div style={{display:'grid', gridTemplateColumns:'2fr 1fr', gap:18}}>
        <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding:24}}>
          <SectionHeader eyebrow="Stratification" title="Sampling by stratum" tail={`${strata.reduce((s,x)=>s+x.sampled,0)} of ${strata.reduce((s,x)=>s+x.target,0)} plots`}/>
          <div style={{display:'flex', flexDirection:'column', gap:10, marginTop:14}}>
            {strata.map(s => <StratumRow key={s.id} s={s}/>)}
          </div>

          <div style={{marginTop:20, padding:'14px 16px', background:'#FEF3C7', border:'1.5px solid #FDE68A', borderRadius:10, display:'flex', alignItems:'flex-start', gap:12}}>
            <PamojaIcon name="alert" size={16} color="#92400E" stroke={1.8} style={{marginTop:1, flexShrink:0}}/>
            <div style={{flex:1, fontSize:12, color:'#7C5104', lineHeight:1.5}}>
              <b>Stratum B is under-sampled.</b> Either raise a CAP requiring the developer to add ≥4 plots, or merge B into A with a statistical justification (recommended if variance permits — see Pre-Audit Agent note below).
            </div>
            <Btn kind="secondary" style={{minHeight:32, padding:'4px 12px', fontSize:11, borderColor:'#FDE68A', color:'#92400E'}}>Raise CAP</Btn>
          </div>

          <div style={{marginTop:14, padding:'14px 16px', background:'#E8F4FC', border:'1px solid #BAE0F7', borderRadius:10, fontSize:12, color:'#0C4A6E', display:'flex', alignItems:'flex-start', gap:12}}>
            <PamojaIcon name="star" size={14} color="#0077B6" stroke={1.8} style={{marginTop:1, flexShrink:0}}/>
            <div>
              <b>Pre-Audit Agent suggestion.</b> Stratum B σ = 7.1 tC/ha; pooled with A (σ=4.8) yields σ_pooled = 5.4 — within methodology tolerance. <a href="#" style={{color:'#0077B6', fontWeight:700, textDecoration:'underline'}}>View calculation →</a>
            </div>
          </div>
        </div>

        <aside style={{display:'flex', flexDirection:'column', gap:18}}>
          <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding:0, overflow:'hidden'}}>
            <div style={{padding:'14px 18px', borderBottom:'1px solid #F3F4F6'}}>
              <div style={{fontSize:11, fontWeight:800, textTransform:'uppercase', letterSpacing:'0.1em', color:'#9CA3AF'}}>Plot locations</div>
              <div style={{fontSize:14, fontWeight:800, color:'#022C28', marginTop:2}}>{project.plots} plots · {project.area}</div>
            </div>
            <div style={{aspectRatio:'4/3', background:'#022C28', position:'relative', overflow:'hidden'}}>
              {/* Synthetic map */}
              <svg width="100%" height="100%" viewBox="0 0 400 300" style={{position:'absolute', inset:0}}>
                <defs>
                  <pattern id="topo" x="0" y="0" width="40" height="40" patternUnits="userSpaceOnUse">
                    <circle cx="20" cy="20" r="18" fill="none" stroke="rgba(244,195,0,0.06)" strokeWidth="1"/>
                  </pattern>
                </defs>
                <rect width="400" height="300" fill="url(#topo)"/>
                <path d="M30 80 Q 120 60 200 100 T 380 90 L 380 220 Q 280 200 200 230 T 30 220 Z" fill="rgba(43,196,138,0.15)" stroke="rgba(43,196,138,0.4)" strokeWidth="1"/>
                {/* Plots */}
                {Array.from({length: 32}).map((_, i) => {
                  const x = 50 + Math.sin(i*1.7)*140 + i*9;
                  const y = 100 + Math.cos(i*2.1)*60 + (i%8)*8;
                  const flagged = i === 14;
                  return <circle key={i} cx={x % 360 + 20} cy={y % 200 + 50} r={flagged?5:3} fill={flagged ? '#D97706' : '#F4C300'} stroke={flagged ? '#fff' : 'none'} strokeWidth="1.5"/>;
                })}
              </svg>
              <div style={{position:'absolute', bottom:10, left:12, fontSize:10, fontFamily:'JetBrains Mono, monospace', color:'rgba(255,255,255,0.7)'}}>{project.coords}</div>
            </div>
          </div>

          <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding:20}}>
            <div style={{fontSize:11, fontWeight:800, textTransform:'uppercase', letterSpacing:'0.1em', color:'#9CA3AF', marginBottom:10}}>Site visit plan</div>
            <Row k="Site visit date" v="22 May 2026"/>
            <Row k="Plots to re-measure" v="6 (random)"/>
            <Row k="Travel time" v="2 days"/>
            <Btn kind="secondary" style={{width:'100%', marginTop:12, justifyContent:'center'}} icon="map">Open visit checklist</Btn>
          </div>

          <Btn kind="primary" onClick={()=>onAdvance(project, 'anomalies')} icon="arrowRight" style={{justifyContent:'space-between'}}>Continue to anomalies</Btn>
        </aside>
      </div>
    </main>
  );
}

function StratumRow({ s }) {
  const pct = Math.round((s.sampled / s.target) * 100);
  return (
    <div style={{border:`1.5px solid ${s.ok?'#A7F3D0':'#FDE68A'}`, background: s.ok?'#E6FBF3':'#FEF3C7', borderRadius:10, padding:'14px 16px'}}>
      <div style={{display:'flex', justifyContent:'space-between', alignItems:'center', marginBottom:8, gap:14}}>
        <div>
          <div style={{fontSize:13, fontWeight:900, color:'#022C28'}}>{s.name}</div>
          <div style={{fontSize:11, color:'#4B5563', marginTop:2}}>{s.area} · mean {s.mean} tC/ha · σ {s.sd}</div>
        </div>
        <div style={{textAlign:'right'}}>
          <div style={{fontFamily:'JetBrains Mono, monospace', fontSize:16, fontWeight:900, color: s.ok?'#059669':'#92400E'}}>{s.sampled}/{s.target}</div>
          <div style={{fontSize:10, fontWeight:800, color: s.ok?'#059669':'#92400E', letterSpacing:'0.06em'}}>{s.ok ? 'PASS' : `${s.target - s.sampled} SHORT`}</div>
        </div>
      </div>
      <div style={{height:6, background:'rgba(255,255,255,0.6)', borderRadius:9999, overflow:'hidden'}}>
        <div style={{height:'100%', background: s.ok?'#2BC48A':'#D97706', width:`${Math.min(100, pct)}%`}}/>
      </div>
    </div>
  );
}

/* ============================================================
 * Anomaly Queue
 * ============================================================ */

function AnomalyQueue({ projects, hero, onAdvance }) {
  const [pickId, setPickId] = React.useState(hero.id);
  const project = projects.find(p=>p.id===pickId) || hero;
  const [decisions, setDecisions] = React.useState({});

  const anomalies = [
    { id:'AN-001', plot:'Plot 42', metric:'DBH', value:'84 cm', expected:'48 ± 8 cm', deviation:'5.0σ', captured:'13 Mar · Field Agent', photoCount:4, severity:'high', detail:'Field agent confirmed measurement on-site. Photo evidence shows mature bamboo (Bambusa bambos rather than expected vulgaris) — likely natural recruit, not planted.' },
    { id:'AN-002', plot:'Plot 17', metric:'Tree count', value:'1,840/ha', expected:'2,200 ± 200', deviation:'-1.6σ', captured:'11 Mar · Field Agent', photoCount:2, severity:'medium', detail:'Lower density consistent with riparian buffer zone. Methodology allows ±15% in riparian strata.' },
  ];
  const decide = (id, verdict) => setDecisions(d => ({...d, [id]: verdict}));

  return (
    <main style={{flex:1, padding:'28px 32px', background:'#F9FAFB', minWidth:0}}>
      <VVBToolbar project={project} pickId={pickId} setPickId={setPickId} projects={projects.filter(p=>p.vvbAssigned)} title="Anomaly queue" subtitle="Outliers flagged by the Pre-Audit Agent. Adjudicate each: accept the value, exclude the plot, or raise a CAP for re-measurement."/>

      <div style={{display:'grid', gridTemplateColumns:'2fr 1fr', gap:18}}>
        <div style={{display:'flex', flexDirection:'column', gap:14}}>
          {anomalies.map(a => <AnomalyCard key={a.id} a={a} decision={decisions[a.id]} onDecide={(v)=>decide(a.id, v)}/>)}
          {anomalies.length === 0 && <EmptyState icon="check" title="No anomalies in this audit" body="Pre-Audit Agent has not flagged any measurements outside methodology tolerances."/>}
        </div>

        <aside style={{display:'flex', flexDirection:'column', gap:18}}>
          <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding:20}}>
            <div style={{fontSize:11, fontWeight:800, textTransform:'uppercase', letterSpacing:'0.1em', color:'#9CA3AF', marginBottom:10}}>Adjudication progress</div>
            <Row k="Anomalies" v={anomalies.length}/>
            <Row k="Decided" v={Object.keys(decisions).length} fg="#059669"/>
            <Row k="Pending" v={anomalies.length - Object.keys(decisions).length} fg={anomalies.length - Object.keys(decisions).length > 0 ? '#D97706' : '#059669'}/>
          </div>

          <Btn
            kind="primary"
            disabled={Object.keys(decisions).length < anomalies.length}
            onClick={()=>onAdvance(project, 'signoff')}
            icon="arrowRight"
            style={{justifyContent:'space-between'}}
          >
            {Object.keys(decisions).length < anomalies.length ? `${anomalies.length - Object.keys(decisions).length} pending` : 'Continue to sign-off'}
          </Btn>
        </aside>
      </div>
    </main>
  );
}

function AnomalyCard({ a, decision, onDecide }) {
  const sev = {
    high:   { bg:'#FEE2E2', bd:'#FCA5A5', fg:'#991B1B' },
    medium: { bg:'#FEF3C7', bd:'#FDE68A', fg:'#92400E' },
    low:    { bg:'#E8F4FC', bd:'#BAE0F7', fg:'#0C4A6E' },
  }[a.severity];
  const decisionLabel = {
    accept:  { label:'ACCEPTED', color:'#059669', bg:'#E6FBF3' },
    exclude: { label:'EXCLUDED', color:'#6B7280', bg:'#F3F4F6' },
    cap:     { label:'CAP RAISED', color:'#D97706', bg:'#FEF3C7' },
  }[decision];

  return (
    <div style={{background:'#fff', border:`1px solid ${sev.bd}`, borderRadius:10, overflow:'hidden'}}>
      <div style={{padding:'16px 20px', background: sev.bg, borderBottom:`1px solid ${sev.bd}`, display:'flex', justifyContent:'space-between', alignItems:'flex-start', gap:14}}>
        <div>
          <div style={{display:'flex', alignItems:'center', gap:10, marginBottom:6}}>
            <span style={{fontFamily:'JetBrains Mono, monospace', fontSize:10, fontWeight:800, color:sev.fg, letterSpacing:'0.06em', padding:'2px 8px', background:'rgba(255,255,255,0.7)', borderRadius:6}}>
              {a.id} · {a.severity.toUpperCase()}
            </span>
            <span style={{fontSize:11, color:'#6B7280'}}>{a.captured}</span>
          </div>
          <div style={{display:'flex', alignItems:'baseline', gap:14, flexWrap:'wrap'}}>
            <div>
              <div style={{fontSize:10, fontWeight:800, color:'#6B7280', letterSpacing:'0.08em', textTransform:'uppercase'}}>{a.plot} · {a.metric}</div>
              <div style={{fontSize:24, fontWeight:900, color:'#022C28', letterSpacing:'-0.01em'}}>{a.value}</div>
            </div>
            <div style={{fontSize:12, color:'#4B5563'}}>
              expected <b>{a.expected}</b><br/>
              deviation <b style={{color:sev.fg}}>{a.deviation}</b>
            </div>
          </div>
        </div>
        {decision && (
          <span style={{fontSize:10, fontWeight:800, color:decisionLabel.color, letterSpacing:'0.06em', padding:'4px 10px', background:decisionLabel.bg, borderRadius:6}}>{decisionLabel.label}</span>
        )}
      </div>

      <div style={{padding:'16px 20px'}}>
        <div style={{fontSize:12, color:'#4B5563', lineHeight:1.55, marginBottom:14}}>{a.detail}</div>

        <div style={{display:'flex', gap:10, alignItems:'center', marginBottom:14}}>
          {Array.from({length: a.photoCount}).map((_, i) => (
            <div key={i} style={{width:60, height:44, background:'#022C28', borderRadius:6, position:'relative', overflow:'hidden'}}>
              <svg width="100%" height="100%" viewBox="0 0 60 44">
                <rect width="60" height="44" fill="#022C28"/>
                <path d="M0 30 Q 15 22 30 28 T 60 24 L 60 44 L 0 44 Z" fill="#2BC48A" opacity="0.4"/>
                <circle cx="48" cy="14" r="6" fill="#F4C300"/>
              </svg>
              <div style={{position:'absolute', bottom:2, right:4, fontSize:8, fontFamily:'JetBrains Mono, monospace', color:'#fff'}}>{i+1}</div>
            </div>
          ))}
          <div style={{fontSize:11, color:'#6B7280'}}>{a.photoCount} photos · GPS verified</div>
        </div>

        <div style={{display:'flex', gap:8, flexWrap:'wrap'}}>
          <Btn kind={decision==='accept'  ? 'primary' : 'secondary'} onClick={()=>onDecide('accept')}  icon="check">Accept value</Btn>
          <Btn kind={decision==='exclude' ? 'primary' : 'secondary'} onClick={()=>onDecide('exclude')} icon="trash">Exclude plot</Btn>
          <Btn kind={decision==='cap'     ? 'primary' : 'secondary'} onClick={()=>onDecide('cap')}     icon="flag">Raise CAP</Btn>
        </div>
      </div>
    </div>
  );
}

/* ============================================================
 * VVB Toolbar — shared across the four workbench screens
 * ============================================================ */

function VVBToolbar({ project, pickId, setPickId, projects, title, subtitle }) {
  return (
    <>
      <div style={{display:'flex', justifyContent:'space-between', alignItems:'flex-end', gap:24, marginBottom:18, flexWrap:'wrap'}}>
        <div style={{minWidth:0}}>
          <div style={{fontSize:11, fontWeight:800, letterSpacing:'0.12em', textTransform:'uppercase', color:'#F4C300', marginBottom:4}}>VVB Workbench</div>
          <h1 style={{fontSize:28, fontWeight:900, color:'#022C28', letterSpacing:'-0.02em', margin:0, lineHeight:1.1}}>{title}</h1>
          {subtitle && <p style={{fontSize:14, color:'#6B7280', margin:'8px 0 0', maxWidth:720, lineHeight:1.55}}>{subtitle}</p>}
        </div>
      </div>
      <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding:'14px 18px', marginBottom:18, display:'flex', alignItems:'center', justifyContent:'space-between', gap:14, flexWrap:'wrap'}}>
        <div style={{display:'flex', alignItems:'center', gap:14, minWidth:0}}>
          <span style={{fontSize:11, fontWeight:800, color:'#9CA3AF', letterSpacing:'0.1em', textTransform:'uppercase'}}>Auditing</span>
          <select value={pickId} onChange={(e)=>setPickId(e.target.value)} style={{
            background:'#fff', border:'1.5px solid #E5E7EB', borderRadius:10,
            padding:'8px 32px 8px 12px', fontFamily:'inherit', fontSize:13, fontWeight:700, color:'#022C28',
            outline:'none', minHeight:38, cursor:'pointer',
          }}>
            {projects.map(p => <option key={p.id} value={p.id}>{p.name} · {p.id}</option>)}
          </select>
          <Badge variant={project.registryVariant} mono>{project.registry}</Badge>
          <span style={{fontSize:11, color:'#6B7280'}}><span style={{fontFamily:'JetBrains Mono, monospace'}}>{project.auditId}</span> · Phase {project.phase}</span>
        </div>
        <div style={{display:'flex', alignItems:'center', gap:8}}>
          <span style={{fontSize:11, color:'#6B7280'}}>Developer:</span>
          <span style={{fontSize:12, fontWeight:700, color:'#022C28'}}>{project.developer.name}</span>
        </div>
      </div>
    </>
  );
}

/* ============================================================
 * Sign-Off Ceremony — the trust moment
 *
 * Three layout variants exposed via Tweaks:
 *   - 'ceremony' (default): full-page review → signature → commit
 *   - 'drawer'  : side drawer summary + commit
 *   - 'modal'   : compact modal confirmation
 * ============================================================ */

function SignOffCeremony({ projects, hero, layout = 'ceremony', signedOff, setSignedOff }) {
  const eligible = projects.filter(p => p.vvbAssigned && p.phase >= 3 && !signedOff[p.id]);
  const initial = eligible[0] || hero;
  const [pickId, setPickId] = React.useState(initial.id);
  const project = projects.find(p=>p.id===pickId) || initial;

  React.useEffect(() => {
    if (signedOff[pickId] && eligible.length > 0) setPickId(eligible[0].id);
  }, [signedOff]);

  const [verdict, setVerdict] = React.useState(null);
  const [signature, setSignature] = React.useState('');
  const [committing, setCommitting] = React.useState(false);
  const [committed, setCommitted] = React.useState(false);

  const reset = () => { setVerdict(null); setSignature(''); setCommitted(false); setCommitting(false); };
  React.useEffect(reset, [pickId]);

  const commit = () => {
    setCommitting(true);
    setTimeout(() => {
      setCommitting(false);
      setCommitted(true);
      setSignedOff(s => ({ ...s, [project.id]: { verdict, when:'just now' }}));
    }, 2400);
  };

  if (signedOff[pickId] && committed) {
    return <SignedConfirmation project={project} verdict={verdict} onAnother={() => {
      const next = eligible.filter(p=>p.id!==project.id)[0];
      if (next) setPickId(next.id);
      reset();
    }}/>;
  }

  return (
    <main style={{flex:1, padding:'28px 32px', background:'#F9FAFB', minWidth:0}}>
      <VVBToolbar project={project} pickId={pickId} setPickId={setPickId} projects={eligible.length ? eligible : projects.filter(p=>p.vvbAssigned)} title="Sign-off &amp; commit" subtitle="Final verification verdict. Once signed, the decision is anchored to Hedera and cannot be withdrawn."/>

      {layout === 'drawer'   && <SignOffDrawerLayout   project={project} verdict={verdict} setVerdict={setVerdict} signature={signature} setSignature={setSignature} committing={committing} committed={committed} onCommit={commit}/>}
      {layout === 'modal'    && <SignOffModalLayout    project={project} verdict={verdict} setVerdict={setVerdict} signature={signature} setSignature={setSignature} committing={committing} committed={committed} onCommit={commit}/>}
      {layout === 'ceremony' && <SignOffCeremonyLayout project={project} verdict={verdict} setVerdict={setVerdict} signature={signature} setSignature={setSignature} committing={committing} committed={committed} onCommit={commit}/>}
    </main>
  );
}

/* --- Ceremony (full-page) ------------------------------------ */
function SignOffCeremonyLayout({ project, verdict, setVerdict, signature, setSignature, committing, committed, onCommit }) {
  return (
    <div style={{display:'grid', gridTemplateColumns:'1fr 380px', gap:24}}>
      {/* Left: review summary */}
      <div style={{display:'flex', flexDirection:'column', gap:18}}>
        <ReviewSummaryCard project={project}/>
        <VerdictChooser verdict={verdict} setVerdict={setVerdict}/>
        {verdict && <SignatureCard verdict={verdict} signature={signature} setSignature={setSignature}/>}
      </div>

      {/* Right: commit panel (sticky-ish) */}
      <aside>
        <CommitPanel project={project} verdict={verdict} signature={signature} committing={committing} committed={committed} onCommit={onCommit}/>
      </aside>
    </div>
  );
}

/* --- Drawer layout ------------------------------------------- */
function SignOffDrawerLayout({ project, verdict, setVerdict, signature, setSignature, committing, committed, onCommit }) {
  return (
    <div style={{display:'grid', gridTemplateColumns:'1fr 360px', gap:24}}>
      <ReviewSummaryCard project={project} compact/>
      <aside style={{display:'flex', flexDirection:'column', gap:14}}>
        <VerdictChooser verdict={verdict} setVerdict={setVerdict} compact/>
        {verdict && <SignatureCard verdict={verdict} signature={signature} setSignature={setSignature}/>}
        <CommitPanel project={project} verdict={verdict} signature={signature} committing={committing} committed={committed} onCommit={onCommit}/>
      </aside>
    </div>
  );
}

/* --- Modal layout -------------------------------------------- */
function SignOffModalLayout({ project, verdict, setVerdict, signature, setSignature, committing, committed, onCommit }) {
  const [open, setOpen] = React.useState(false);
  return (
    <>
      <ReviewSummaryCard project={project}/>
      <div style={{marginTop:18, display:'flex', justifyContent:'flex-end'}}>
        <Btn kind="primary" onClick={()=>setOpen(true)} icon="signature">Open sign-off…</Btn>
      </div>
      <Modal open={open} onClose={()=>!committing && !committed && setOpen(false)} width={520} padding={0}>
        <div style={{padding:'22px 26px', borderBottom:'1px solid #F3F4F6'}}>
          <div style={{fontSize:11, fontWeight:800, letterSpacing:'0.12em', textTransform:'uppercase', color:'#F4C300', marginBottom:4}}>Sign-off</div>
          <h2 style={{fontSize:20, fontWeight:900, color:'#022C28', margin:0}}>{project.name}</h2>
          <div style={{fontSize:12, color:'#6B7280', marginTop:4}}><span style={{fontFamily:'JetBrains Mono, monospace'}}>{project.auditId}</span> · Phase {project.phase}</div>
        </div>
        <div style={{padding:'18px 26px', display:'flex', flexDirection:'column', gap:14}}>
          <VerdictChooser verdict={verdict} setVerdict={setVerdict} compact/>
          {verdict && <SignatureCard verdict={verdict} signature={signature} setSignature={setSignature} compact/>}
        </div>
        <div style={{padding:'16px 26px', borderTop:'1px solid #E5E7EB', background:'#FAFAFA'}}>
          <CommitPanel project={project} verdict={verdict} signature={signature} committing={committing} committed={committed} onCommit={onCommit} compact/>
        </div>
      </Modal>
    </>
  );
}

function ReviewSummaryCard({ project, compact }) {
  return (
    <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding:24}}>
      <SectionHeader eyebrow="Review summary" title={project.name} tail={`${project.vvb}/100 readiness`}/>

      <div style={{display:'grid', gridTemplateColumns: compact ? '1fr 1fr' : 'repeat(3,1fr)', gap:14, marginTop:18}}>
        <Mini l="Methodology" v={project.methodology} sub={project.methodologyName}/>
        <Mini l="Area" v={project.area} sub={`${project.households.toLocaleString()} households`}/>
        <Mini l="Field plots" v={`${project.plots}`} sub={`${project.plotsFlagged} flagged`}/>
        <Mini l="Documents" v={`${project.documents}`} sub="all hashed"/>
        <Mini l="Findings raised" v={`${project.findings}`} sub={`${project.findingsOpen} resolved · 0 outstanding`}/>
        <Mini l="Hedera anchors" v="142" sub="this audit"/>
      </div>

      <div style={{marginTop:18, paddingTop:18, borderTop:'1px dashed #E5E7EB'}}>
        <div style={{fontSize:10, fontWeight:800, textTransform:'uppercase', letterSpacing:'0.1em', color:'#9CA3AF', marginBottom:10}}>What will be hashed &amp; committed</div>
        <div style={{display:'flex', flexDirection:'column', gap:8}}>
          {[
            { l:'Audit bundle manifest',  v:'sha256:8f2a…c9d1', kind:'manifest' },
            { l:'Verdict + signature',    v:'sha256:[pending]',  kind:'verdict' },
            { l:'Findings log (3 items)', v:'sha256:1c7e…44a2', kind:'log' },
            { l:'Sampling-plan checksum', v:'sha256:b71d…2ee0', kind:'sampling' },
            { l:'Anomaly adjudications',  v:'sha256:a3f9…5c10', kind:'anomalies' },
          ].map((r,i) => (
            <div key={i} style={{display:'flex', alignItems:'center', justifyContent:'space-between', padding:'8px 12px', background:'#F9FAFB', borderRadius:8, border:'1px solid #F3F4F6', gap:14}}>
              <div style={{display:'flex', alignItems:'center', gap:10, minWidth:0}}>
                <PamojaIcon name={r.kind==='manifest'?'document':r.kind==='verdict'?'signature':r.kind==='log'?'flag':r.kind==='sampling'?'layers':'star'} size={14} color="#6B7280" stroke={1.7}/>
                <span style={{fontSize:13, color:'#022C28'}}>{r.l}</span>
              </div>
              <span style={{fontFamily:'JetBrains Mono, monospace', fontSize:11, color:r.v.includes('pending')?'#9CA3AF':'#7C5CFC'}}>{r.v}</span>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}
function Mini({ l, v, sub }) {
  return (
    <div>
      <div style={{fontSize:10, fontWeight:800, textTransform:'uppercase', letterSpacing:'0.08em', color:'#9CA3AF'}}>{l}</div>
      <div style={{fontSize:15, fontWeight:800, color:'#022C28', marginTop:4, letterSpacing:'-0.01em'}}>{v}</div>
      {sub && <div style={{fontSize:11, color:'#6B7280', marginTop:2}}>{sub}</div>}
    </div>
  );
}

function VerdictChooser({ verdict, setVerdict, compact }) {
  const options = [
    { id:'approve',         label:'Approve',                sub:'Validate the project as submitted',                       color:'#059669', bg:'#E6FBF3', bd:'#A7F3D0', icon:'check' },
    { id:'approve-pending', label:'Approve pending CAPs',   sub:'Validate subject to outstanding corrective actions',      color:'#92400E', bg:'#FEF3C7', bd:'#FDE68A', icon:'flag' },
    { id:'reject',          label:'Reject',                 sub:'Validation cannot proceed — issue blocking findings',     color:'#991B1B', bg:'#FEE2E2', bd:'#FCA5A5', icon:'alert' },
  ];
  return (
    <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding: compact ? 16 : 22}}>
      <SectionHeader eyebrow="Verdict" title="Choose your decision"/>
      <div style={{display:'flex', flexDirection:'column', gap:8, marginTop:14}}>
        {options.map(o => {
          const selected = verdict === o.id;
          return (
            <button key={o.id} onClick={()=>setVerdict(o.id)} style={{
              textAlign:'left', cursor:'pointer', fontFamily:'inherit',
              padding:'14px 16px', borderRadius:10,
              background: selected ? o.bg : '#fff',
              border: selected ? `1.5px solid ${o.bd}` : '1.5px solid #E5E7EB',
              transition:'all 150ms',
              display:'flex', alignItems:'center', gap:14,
            }}>
              <div style={{width:36, height:36, borderRadius:'50%', background: selected ? o.color : '#F3F4F6', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0}}>
                <PamojaIcon name={o.icon} size={16} color={selected ? '#fff' : '#9CA3AF'} stroke={2.2}/>
              </div>
              <div style={{flex:1, minWidth:0}}>
                <div style={{fontSize:14, fontWeight:900, color: selected ? o.color : '#022C28'}}>{o.label}</div>
                <div style={{fontSize:12, color:'#6B7280', marginTop:2}}>{o.sub}</div>
              </div>
              <div style={{width:18, height:18, borderRadius:'50%', border: selected ? `5px solid ${o.color}` : '2px solid #E5E7EB', flexShrink:0}}/>
            </button>
          );
        })}
      </div>
    </div>
  );
}

function SignatureCard({ verdict, signature, setSignature, compact }) {
  const expected = 'Sarah Chen';
  const matches = signature.trim().toLowerCase() === expected.toLowerCase();
  return (
    <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding: compact ? 16 : 22}}>
      <SectionHeader eyebrow="Sign &amp; commit" title="Type your full name as it appears on your accreditation"/>
      <div style={{fontSize:12, color:'#6B7280', marginTop:8, marginBottom:14, lineHeight:1.5}}>
        Your signature, the verdict, and the audit bundle hash will be committed to Hedera topic <span style={{fontFamily:'JetBrains Mono, monospace'}}>0.0.8321350</span> as a single, immutable record.
      </div>
      <input value={signature} onChange={(e)=>setSignature(e.target.value)} placeholder={`Type "${expected}" to sign`} style={{
        width:'100%', padding:'14px 18px',
        border: signature && !matches ? '1.5px solid #FCA5A5' : matches ? '1.5px solid #2BC48A' : '1.5px solid #E5E7EB',
        borderRadius:10, fontFamily:"'Caveat', 'Brush Script MT', cursive", fontSize:26, color:'#022C28',
        outline:'none', letterSpacing:'-0.01em',
      }}/>
      <div style={{display:'flex', justifyContent:'space-between', alignItems:'center', marginTop:8, gap:14}}>
        <span style={{fontSize:11, color:'#6B7280'}}>
          Expected: <b style={{color:'#022C28'}}>{expected}</b> · accredited <span style={{fontFamily:'JetBrains Mono, monospace'}}>VVB-007</span>
        </span>
        {matches && (
          <span style={{display:'inline-flex', alignItems:'center', gap:6, fontSize:11, fontWeight:800, color:'#059669', letterSpacing:'0.04em'}}>
            <PamojaIcon name="check" size={14} color="#059669" stroke={2.5}/>
            SIGNATURE VERIFIED
          </span>
        )}
      </div>
    </div>
  );
}

function CommitPanel({ project, verdict, signature, committing, committed, onCommit, compact }) {
  const expected = 'Sarah Chen';
  const matches = signature.trim().toLowerCase() === expected.toLowerCase();
  const canCommit = verdict && matches && !committing && !committed;

  return (
    <div style={{
      background:'#022C28', borderRadius:10, padding: compact ? 18 : 24, color:'#fff',
      position: compact ? 'static' : 'sticky', top: 80,
    }}>
      <div style={{fontSize:10, fontWeight:800, letterSpacing:'0.12em', textTransform:'uppercase', color:'#F4C300', marginBottom:6}}>Final commit</div>
      <div style={{fontSize:16, fontWeight:900, marginBottom:14, lineHeight:1.3}}>Commit verdict to Hedera</div>

      <CommitRow k="Audit ID" v={<span style={{fontFamily:'JetBrains Mono, monospace'}}>{project.auditId}</span>}/>
      <CommitRow k="Verdict" v={verdict ? <span style={{fontWeight:900, color:'#F4C300'}}>{verdict.replace('-',' ').toUpperCase()}</span> : <span style={{color:'rgba(255,255,255,0.4)'}}>—</span>}/>
      <CommitRow k="Signed by" v={matches ? <span style={{fontWeight:700, color:'#fff'}}>{expected}</span> : <span style={{color:'rgba(255,255,255,0.4)'}}>—</span>}/>
      <CommitRow k="Topic" v={<span style={{fontFamily:'JetBrains Mono, monospace', color:'rgba(255,255,255,0.7)'}}>0.0.8321350</span>}/>

      <div style={{marginTop:18, paddingTop:18, borderTop:'1px solid rgba(255,255,255,0.1)'}}>
        {committing && (
          <div>
            <div style={{display:'flex', alignItems:'center', gap:10, marginBottom:10}}>
              <span style={{width:10, height:10, borderRadius:'50%', background:'#F4C300', animation:'p-pulse 0.9s infinite'}}/>
              <span style={{fontSize:13, fontWeight:700, color:'#F4C300', letterSpacing:'0.02em'}}>Committing to Hedera…</span>
            </div>
            <div style={{height:4, background:'rgba(255,255,255,0.1)', borderRadius:9999, overflow:'hidden'}}>
              <div style={{height:'100%', background:'#F4C300', animation:'p-progress 2.2s ease-out'}}/>
            </div>
            <div style={{fontSize:10, fontFamily:'JetBrains Mono, monospace', color:'rgba(255,255,255,0.5)', marginTop:10, lineHeight:1.7}}>
              → Building bundle…<br/>
              → Hashing manifest sha256:8f2a…c9d1<br/>
              → Submitting to topic 0.0.8321350…
            </div>
          </div>
        )}
        {committed && (
          <div style={{padding:'12px 14px', background:'rgba(43,196,138,0.12)', border:'1px solid rgba(43,196,138,0.3)', borderRadius:10, display:'flex', alignItems:'center', gap:10}}>
            <PamojaIcon name="check" size={18} color="#2BC48A" stroke={2.5}/>
            <div style={{fontSize:12, color:'#A7F3D0', lineHeight:1.4}}>
              <b style={{color:'#2BC48A'}}>Anchored.</b>
              <div style={{fontFamily:'JetBrains Mono, monospace', fontSize:11, marginTop:2}}>0.0.8321350@143</div>
            </div>
          </div>
        )}
        {!committing && !committed && (
          <Btn kind="primary" disabled={!canCommit} onClick={onCommit} icon="signature" style={{width:'100%', justifyContent:'center'}}>
            Sign &amp; commit to Hedera
          </Btn>
        )}
      </div>
    </div>
  );
}
function CommitRow({ k, v }) {
  return (
    <div style={{display:'flex', justifyContent:'space-between', padding:'6px 0', fontSize:12, gap:14}}>
      <span style={{color:'rgba(255,255,255,0.55)'}}>{k}</span>
      <span style={{textAlign:'right'}}>{v}</span>
    </div>
  );
}

function SignedConfirmation({ project, verdict, onAnother }) {
  return (
    <main style={{flex:1, padding:'56px 32px', background:'#F9FAFB', minWidth:0, display:'flex', alignItems:'flex-start', justifyContent:'center'}}>
      <div style={{maxWidth:560, width:'100%', background:'#fff', border:'1px solid #E5E7EB', borderRadius:14, overflow:'hidden', boxShadow:'0 12px 40px rgba(0,0,0,0.08)'}}>
        <div style={{background:'#022C28', padding:'40px 32px', color:'#fff', textAlign:'center'}}>
          <div style={{
            width:72, height:72, borderRadius:'50%', background:'rgba(43,196,138,0.18)',
            display:'flex', alignItems:'center', justifyContent:'center', margin:'0 auto 16px',
            border:'1.5px solid rgba(43,196,138,0.35)',
          }}>
            <PamojaIcon name="check" size={32} color="#2BC48A" stroke={2.5}/>
          </div>
          <div style={{fontSize:11, fontWeight:800, letterSpacing:'0.14em', textTransform:'uppercase', color:'#F4C300', marginBottom:6}}>Anchored to Hedera</div>
          <h1 style={{fontSize:24, fontWeight:900, margin:0, letterSpacing:'-0.02em'}}>Verdict committed</h1>
          <div style={{fontSize:13, color:'rgba(255,255,255,0.7)', marginTop:8, lineHeight:1.55}}>
            {project.name} · {verdict?.replace('-',' ').toUpperCase()}
          </div>
        </div>
        <div style={{padding:'24px 32px'}}>
          <Row k="Audit ID" v={<span style={{fontFamily:'JetBrains Mono, monospace'}}>{project.auditId}</span>}/>
          <Row k="Signed by" v="Sarah Chen · VVB-007"/>
          <Row k="Hedera TX" v={<span style={{fontFamily:'JetBrains Mono, monospace', color:'#7C5CFC'}}>0.0.8321350@143</span>}/>
          <Row k="Consensus latency" v="3.2s"/>
          <Row k="Committed at" v="just now"/>
          <div style={{display:'flex', gap:10, marginTop:20, justifyContent:'flex-end'}}>
            <Btn kind="secondary" icon="external">View on HashScan</Btn>
            <Btn kind="primary" onClick={onAnother} icon="arrowRight">Next assignment</Btn>
          </div>
        </div>
      </div>
    </main>
  );
}

/* --- Hedera anchors view for VVB ----------------------------- */
function VVBAnchors({ projects }) {
  return <HederaMonitor projects={projects}/>;
}

/* --- Accreditation page (simple stub) ------------------------ */
function VVBAccount({ user }) {
  return (
    <main style={{flex:1, padding:'28px 32px', background:'#F9FAFB', minWidth:0}}>
      <h1 style={{fontSize:28, fontWeight:900, color:'#022C28', letterSpacing:'-0.02em', margin:'0 0 6px'}}>Accreditation</h1>
      <p style={{fontSize:14, color:'#6B7280', margin:'0 0 24px'}}>Your VVB accreditation, certificates, and scope of authority.</p>
      <div style={{display:'grid', gridTemplateColumns:'1.4fr 1fr', gap:20}}>
        <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding:24}}>
          <SectionHeader eyebrow="Identity" title="Sarah Chen" tail="Active"/>
          <div style={{marginTop:16}}>
            <Row k="Firm" v="SCS Global Services"/>
            <Row k="Accreditation ID" v={<span style={{fontFamily:'JetBrains Mono, monospace'}}>VVB-007</span>}/>
            <Row k="Pamoja account ID" v={<span style={{fontFamily:'JetBrains Mono, monospace'}}>usr_vvb_8f2a9c</span>}/>
            <Row k="Email" v="sarah.chen@scsglobalservices.com"/>
            <Row k="Active since" v="Jan 2024"/>
            <Row k="Audits signed" v="42"/>
          </div>
        </div>
        <div style={{background:'#fff', border:'1px solid #E5E7EB', borderRadius:10, padding:24}}>
          <SectionHeader eyebrow="Scope" title="Authorised standards"/>
          <div style={{marginTop:14, display:'flex', flexDirection:'column', gap:10}}>
            {['Verra VCS', 'Gold Standard', 'Puro.Earth', 'CAR'].map(s => (
              <div key={s} style={{display:'flex', alignItems:'center', justifyContent:'space-between', padding:'10px 14px', border:'1px solid #E5E7EB', borderRadius:8, background:'#F9FAFB'}}>
                <span style={{fontSize:13, fontWeight:700, color:'#022C28'}}>{s}</span>
                <Badge variant="green" dot>Active</Badge>
              </div>
            ))}
          </div>
        </div>
      </div>
    </main>
  );
}

window.VVBHome = VVBHome;
window.EvidenceBrowser = EvidenceBrowser;
window.SamplingPanel = SamplingPanel;
window.AnomalyQueue = AnomalyQueue;
window.SignOffCeremony = SignOffCeremony;
window.VVBAnchors = VVBAnchors;
window.VVBAccount = VVBAccount;
