#!/usr/bin/env python3
"""Render the four business-reader pages from one reviewed copy file."""
from pathlib import Path
from html import escape as e
import json,re
from team_manual import render_manual
from before_after_gallery import load_gallery_assets
gallery_assets=load_gallery_assets()
ROOT=Path(__file__).resolve().parents[2];OUT=Path(__file__).resolve().parent
pages=json.loads((OUT/'leadership-copy.json').read_text())
css=(OUT/'plain-theme.css').read_text()+'''
.hero{padding-top:38px}.hero h1{font-size:clamp(30px,3.6vw,49px);line-height:1.25;letter-spacing:-1px}.topnav a[aria-current="page"]{background:var(--soft);padding:4px 10px;border-radius:8px}.section-nav{gap:16px;font-size:13px}.cases{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}.case h3{margin-bottom:10px}.case strong{display:block;line-height:1.4;margin:8px 0}.case small{display:block;line-height:1.7}.case p{font-size:16px}.row-foot{font-size:14px}.section-intro{max-width:900px}.simple-list{padding-left:22px}.copy-note{font-size:14px;color:var(--muted)}.table-scroll th{white-space:normal}.speech{font-size:19px}.page-footer-links{display:flex;flex-wrap:wrap;gap:18px;margin-bottom:14px}@media(max-width:700px){.cases{grid-template-columns:1fr}.hero{padding-top:26px}.hero h1{font-size:32px}.speech{font-size:17px}.topnav strong{flex-basis:100%}.section-nav{gap:12px}table{min-width:620px}}
'''
css += """
.hero-panel{background:var(--surface);border:1px solid var(--border);border-radius:20px;padding:26px}.hero-panel h2{font-size:22px}.panel-step{display:flex;gap:14px;margin-top:18px}.panel-step>span{display:grid;place-items:center;align-self:flex-start;width:27px;height:27px;border-radius:50%;background:var(--soft);color:var(--accent);flex:none}.panel-step p{font-size:14px;color:var(--muted);margin:4px 0}.hero-panel.management{border-top:4px solid #e65c1e}.hero-panel.collaboration .panel-step{border-bottom:1px solid var(--border);padding-bottom:12px}.hero-panel.catalog{background:var(--soft)}.resource-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px}.resource-card{display:block;color:var(--ink);text-decoration:none;border:1px solid var(--border);border-radius:14px;background:var(--surface);padding:22px}.resource-card p{color:var(--muted);font-size:15px}.resource-card span{color:var(--accent);font-weight:600}.resource-card:hover{border-color:var(--accent)}.handoff-list{list-style:none;counter-reset:handoff;padding:0}.handoff-list li{counter-increment:handoff;border-left:3px solid var(--accent);padding:18px 22px;margin:16px 0;background:var(--surface)}.handoff-head{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap}.handoff-head b:before{content:counter(handoff)". "}.handoff-head span,.handoff-list small{color:var(--muted)}.filters{display:flex;flex-wrap:wrap;gap:8px}button{font:inherit;cursor:pointer;border:1px solid var(--border);padding:9px 15px;border-radius:9px;background:var(--surface);color:var(--accent)}button[aria-pressed="true"],button:hover{border-color:var(--accent);background:var(--soft)}button:focus-visible,input:focus-visible{outline:3px solid #e65c1e;outline-offset:3px}.usecase{margin:14px 0}.usecase[hidden]{display:none}.usecase-body{padding-top:18px}.usecase dl{display:grid;grid-template-columns:145px 1fr;gap:10px 18px}.usecase dt{font-weight:650;color:var(--accent)}.usecase dd{margin:0}.prompt-text{background:var(--bg);padding:18px;border-radius:12px}.manual-toc{display:flex;flex-wrap:wrap;gap:10px;margin:20px 0}.manual-toc a{padding:8px 12px;background:var(--soft);border-radius:8px}.manual-chapter{margin:14px 0}.manual-chapter summary{display:flex;justify-content:space-between;gap:12px;list-style-position:inside}.manual-chapter summary span{font-size:12px;color:var(--muted);white-space:nowrap}.manual-body{padding-top:20px;min-width:0}.manual-body table{font-size:14px;min-width:680px}.manual-body h3{margin:22px 0 12px}.manual-body pre{white-space:pre-wrap;overflow-wrap:anywhere;background:var(--bg);padding:18px;border-radius:10px}.manual-body code{overflow-wrap:anywhere}.manual-body a{overflow-wrap:anywhere}.search-label{display:block;font-weight:650;margin:18px 0 8px}input[type="search"]{width:100%;font:inherit;padding:12px;border:1px solid var(--border);border-radius:9px}.skill-directory{max-height:510px;overflow:auto;background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:16px}.skill-directory ul{list-style:none;padding:0;columns:2;column-gap:30px}.skill-directory li{padding:7px 0;break-inside:avoid;overflow-wrap:anywhere}.skill-directory li[hidden]{display:none}#copy-status{min-height:26px;color:var(--accent)}@media(max-width:700px){.resource-grid{grid-template-columns:1fr}.usecase dl{grid-template-columns:1fr;gap:4px}.usecase dd{margin-bottom:12px}.hero-panel{padding:20px}.skill-directory ul{columns:1}.manual-chapter{padding:15px}.section-nav{font-size:12px}}
"""
css += """
.ba-columns{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:24px}.ba-column-title{padding:16px 20px;background:var(--soft);border-radius:12px;color:var(--accent);font-size:19px;font-weight:700}.ba-column.before .ba-column-title{background:var(--surface);color:var(--muted);border:1px solid var(--border)}.ba-figure{margin:18px 0 28px;padding:20px;border:1px solid var(--border);border-radius:16px;background:var(--surface)}.ba-figure h3{font-size:19px;min-height:52px}.ba-image-button{display:block;width:100%;border:0;padding:0;margin:14px 0;background:var(--surface);text-align:left;overflow:hidden}.ba-image-button:hover{background:var(--surface)}.ba-image-button img{display:block;width:100%;height:300px;object-fit:contain;background:var(--surface)}.ba-image-button span{display:block;font-size:12px;margin-top:8px;color:var(--accent)}.ba-figure figcaption{font-size:15px;color:var(--muted);line-height:1.75}#before-after-viewer{width:min(1400px,94vw);max-width:94vw;max-height:94vh;border:1px solid var(--border);border-radius:14px;padding:18px;background:var(--surface)}#before-after-viewer::backdrop{background:rgba(0,0,0,.65)}.viewer-tools{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding-bottom:12px}.viewer-tools strong{margin-right:auto}.viewer-scroll{overflow:auto;max-height:78vh}#image-viewer-image{display:block;max-width:100%;height:auto;margin:auto}#image-viewer-image.natural{max-width:none;margin:0}@media(max-width:700px){.ba-columns{grid-template-columns:1fr;gap:8px}.ba-image-button img{height:auto;max-height:350px}.ba-figure h3{min-height:0}.ba-figure{padding:16px}.viewer-tools button{font-size:13px;padding:7px 10px}}
"""
client_js = r"""
const viewer=document.getElementById('before-after-viewer');if(viewer){const image=document.getElementById('image-viewer-image');document.querySelectorAll('[data-image-open]').forEach(button=>button.addEventListener('click',()=>{const source=document.querySelector('img[data-before-after-id="'+button.dataset.imageOpen+'"]');image.src=source.src;image.alt=source.alt;image.classList.remove('natural');document.getElementById('image-viewer-size').textContent='按原尺寸查看';document.getElementById('image-viewer-title').textContent=source.alt;viewer.showModal();}));document.getElementById('image-viewer-close').addEventListener('click',()=>viewer.close());document.getElementById('image-viewer-size').addEventListener('click',e=>{const natural=image.classList.toggle('natural');e.currentTarget.textContent=natural?'适应窗口':'按原尺寸查看';});viewer.addEventListener('click',e=>{if(e.target===viewer){const r=viewer.getBoundingClientRect();if(e.clientX<r.left||e.clientX>r.right||e.clientY<r.top||e.clientY>r.bottom)viewer.close();}});}
document.querySelectorAll('[data-filter]').forEach(button=>button.addEventListener('click',()=>{const key=button.dataset.filter;document.querySelectorAll('[data-filter]').forEach(b=>b.setAttribute('aria-pressed',String(b===button)));let shown=0;document.querySelectorAll('.usecase').forEach(card=>{card.hidden=key!=='all'&&card.dataset.group!==key;if(!card.hidden)shown++;});document.getElementById('usecase-count').textContent='显示 '+shown+' 项用法';}));
document.querySelectorAll('[data-copy]').forEach(button=>button.addEventListener('click',async()=>{const value=document.getElementById(button.dataset.copy).textContent;const status=document.getElementById('copy-status');try{if(navigator.clipboard&&window.isSecureContext){await navigator.clipboard.writeText(value);}else{const area=document.createElement('textarea');area.value=value;document.body.append(area);area.select();const ok=document.execCommand('copy');area.remove();if(!ok)throw Error('copy');}status.textContent='任务描述已复制，请补充你的资料和具体要求。';}catch{status.textContent='浏览器未允许自动复制，请选中上方任务描述手动复制。';}}));
const search=document.getElementById('skill-search');if(search){search.addEventListener('input',()=>{const key=search.value.trim().toLowerCase();let n=0;document.querySelectorAll('#skill-list li').forEach(li=>{li.hidden=!li.dataset.skill.toLowerCase().includes(key);if(!li.hidden)n++;});document.getElementById('skill-status').textContent='显示 '+n+' 项';});}
function revealHash(){if(!location.hash)return;const node=document.getElementById(decodeURIComponent(location.hash.slice(1)));if(!node)return;let p=node;while(p){if(p.tagName==='DETAILS')p.open=true;p=p.parentElement;}node.scrollIntoView({block:'start'});}window.addEventListener('hashchange',revealHash);if(location.hash)requestAnimationFrame(revealHash);
"""
svg=(OUT/'plain-workflow.svg').read_text()
nav_labels={'change':'工作变化','results':'实际成果','value':'公司价值','measure':'衡量效果','next':'下一步','start':'怎么开始','example':'举个例子','roles':'岗位分工','check':'交付前检查','record':'记录时间','uses':'能帮什么忙'}
source_paths={'CPT_AI_ENABLEMENT_BRIEF.html':'company-brief.md','AI_AGENT_PROJECT_INTRO_FOR_BEGINNERS.html':'leadership-page.md','TEAM_AI_NATIVE_COLLABORATION_GUIDE.html':'team-page.md','AI_PRACTICE_SHARING.html':'practice-page.md'}
def section(s):
 chunks=[];md=['## '+s['title'],'']
 if s.get('intro'):chunks.append('<p class="intro section-intro">'+e(s['intro'])+'</p>');md += [s['intro'],'']
 if s.get('comparisons'):
  md += ['| 工作 | 以前 | 现在 | 关注的结果 |','|---|---|---|---|']
  for i,(title,before,after,measure) in enumerate(s['comparisons'],1):
   chunks.append(f'<article class="comparison"><div class="row-head"><span>{i:02}</span><h3>{e(title)}</h3></div><div class="compare-grid"><div class="before"><b>以前</b><p>{e(before)}</p></div><div class="after"><b>现在</b><p>{e(after)}</p></div></div><div class="row-foot">{e(measure)}</div></article>')
   md.append('| '+' | '.join([title,before,after,measure])+' |')
  md.append('')
 if s.get('cards'):
  cards=[]
  for c in s['cards']:
   cards.append('<article class="case"><h3>'+e(c['title'])+'</h3>'+('<strong>'+e(c['number'])+'</strong>' if c.get('number') else '')+'<p>'+e(c['text'])+'</p>'+('<small>'+e(c['note'])+'</small>' if c.get('note') else '')+'</article>')
   md += ['### '+c['title'],'',*([c['number'],''] if c.get('number') else []),c['text'],'',*([c['note'],''] if c.get('note') else [])]
  chunks.append('<div class="cases">'+''.join(cards)+'</div>')
 if s.get('gallery'):
  columns=[]
  for side,label in [('before','以前 · 流程长、资料散'),('after','现在 · 工作与记录连起来')]:
   figures=[]
   for item in [x for x in s['gallery'] if x['side']==side]:
    gid=item['id'];figures.append('<figure class="ba-figure"><h3>'+e(item['title'])+'</h3><button type="button" class="ba-image-button" data-image-open="'+gid+'" aria-label="放大查看：'+e(item['title'],quote=True)+'"><img data-before-after-id="'+gid+'" src="'+gallery_assets[gid]+'" alt="'+e(item['alt'],quote=True)+'"><span>点击放大查看</span></button><figcaption>'+e(item['caption'])+'</figcaption></figure>')
    md += ['### '+item['title'],'',item['caption'],'']
   columns.append('<div class="ba-column '+side+'"><div class="ba-column-title">'+label+'</div>'+''.join(figures)+'</div>')
  chunks.append('<div class="ba-columns">'+''.join(columns)+'</div><dialog id="before-after-viewer" aria-labelledby="image-viewer-title"><div class="viewer-tools"><strong id="image-viewer-title">图片查看</strong><button type="button" id="image-viewer-size">按原尺寸查看</button><button type="button" id="image-viewer-close">关闭</button></div><div class="viewer-scroll"><img id="image-viewer-image" alt=""></div></dialog>')
 if s.get('manual'):
  chunks.append(render_manual());md += ['完整章节恢复自 `work/2026-05-25-team-ai-native-collaboration-guide/TEAM_AI_NATIVE_COLLABORATION_GUIDE.md`；包含原模块入口、历史详细说明和当前完整方法目录。','']
 if s.get('links'):
  chunks.append('<div class="resource-grid">'+''.join('<a class="resource-card" href="'+e(c['href'],quote=True)+'"><h3>'+e(c['title'])+'</h3><p>'+e(c['text'])+'</p><span>'+e(c['label'])+' →</span></a>' for c in s['links'])+'</div>')
  md += ['- ['+c['title']+']('+c['href']+')：'+c['text'] for c in s['links']]+['']
 if s.get('steps'):
  chunks.append('<ol class="handoff-list">'+''.join('<li><div class="handoff-head"><b>'+e(c['title'])+'</b><span>'+e(c['owner'])+'</span></div><p>'+e(c['text'])+'</p><small>交出：'+e(c['deliver'])+'</small></li>' for c in s['steps'])+'</ol>')
  md += [str(i)+'. '+c['title']+'（'+c['owner']+'）：'+c['text']+' 交出：'+c['deliver'] for i,c in enumerate(s['steps'],1)]+['']
 if s.get('catalog'):
  chunks.append('<div class="filters" role="group" aria-label="按工作类型筛选">'+''.join('<button type="button" data-filter="'+key+'" aria-pressed="'+('true' if key=='all' else 'false')+'">'+label+'</button>' for key,label in [('all','全部'),('materials','资料与材料'),('data','表格与数据'),('delivery','技术与交付')])+'</div><p id="usecase-count" role="status">共 '+str(len(s['catalog']))+' 项用法</p>')
  for i,c in enumerate(s['catalog']):
   pid='prompt-'+c['id']
   chunks.append('<details class="usecase" id="practice-'+e(c['id'])+'" data-group="'+e(c['group'])+'"'+(' open' if i==0 else '')+'><summary>'+e(c['title'])+'</summary><div class="usecase-body"><dl>'+''.join('<dt>'+label+'</dt><dd>'+e(c[key])+'</dd>' for key,label in [('input','先准备'),('output','会得到'),('evidence','实际用过的地方'),('check','完成前检查')])+'</dl><p class="prompt-text" id="'+pid+'">'+e(c['prompt'])+'</p><button class="copy-prompt" type="button" data-copy="'+pid+'">复制任务描述</button></div></details>')
   md += ['### '+c['title'],'',*['- '+label+'：'+c[key] for key,label in [('input','先准备'),('output','会得到'),('evidence','实际用过的地方'),('check','完成前检查')]],'', '> '+c['prompt'],'']
  chunks.append('<p id="copy-status" role="status" aria-live="polite"></p>')
 if s.get('table'):
  t=s['table'];chunks.append('<div class="table-scroll" tabindex="0" aria-label="'+e(s['title'])+'"><table><thead><tr>'+''.join('<th>'+e(h)+'</th>' for h in t['headers'])+'</tr></thead><tbody>'+''.join('<tr>'+''.join('<td>'+e(v)+'</td>' for v in row)+'</tr>' for row in t['rows'])+'</tbody></table></div>')
  md += ['| '+' | '.join(t['headers'])+' |','|'+'|'.join('---' for _ in t['headers'])+'|',*['| '+' | '.join(row)+' |' for row in t['rows']],'']
 if s.get('quote'):chunks.append('<div class="speech">'+e(s['quote'])+'</div>');md += ['> '+s['quote'],'']
 if s.get('note'):chunks.append('<p class="copy-note">'+e(s['note'])+'</p>');md += [s['note'],'']
 content=''.join(chunks)
 if s.get('details'):content='<details><summary>'+e(s['title'])+'</summary>'+content+'</details>'
 elif not s.get('manual'):content='<h2>'+e(s['title'])+'</h2>'+content
 return '<section id="'+e(s['id'])+'">'+content+'</section>',md
for name,p in pages.items():
 nav='<nav class="topnav" aria-label="四页导航"><strong>CPTAI native</strong>'+''.join('<a href="'+n+'"'+(' aria-current="page"' if n==name else '')+'>'+e(x['label'])+'</a>' for n,x in pages.items())+'</nav>'
 nav+='<nav class="topnav section-nav" aria-label="本页内容">'+''.join('<a href="#'+s['id']+'">'+e(s.get('nav',nav_labels.get(s['id'],s['title'])))+'</a>' for s in p['sections'] if not s.get('details'))+'</nav>'
 panel='<aside class="hero-panel '+e(p.get('kind',''))+'"><h2>'+e(p['panel_title'])+'</h2>'+''.join('<div class="panel-step"><span>'+str(i)+'</span><div><b>'+e(v[0])+'</b><p>'+e(v[1])+'</p></div></div>' for i,v in enumerate(p['panel_steps'],1))+'</aside>'
 hero='<header class="hero"><div><span class="tag">'+e(p['label'])+' · 2026 年 9 月</span><h1>'+p['headline']+'</h1><p class="lede">'+e(p['intro'])+'</p><p class="caption">'+e(p['hero_note'])+'</p></div>'+panel+'</header>'

 body=[];md=['# '+p['title'],'','更新日期：2026-09-26；读者：'+{'overview':'公司同事','management':'管理者','collaboration':'实际执行任务的团队成员','catalog':'需要查找具体用法的同事'}[p['kind']]+'。','',p['intro'],'']
 for s in p['sections']:
  h,m=section(s);body.append(h);md+=m
 footer='<footer><div class="page-footer-links">'+''.join('<a href="'+n+'">'+e(x['label'])+'</a>' for n,x in pages.items())+'</div>CPTAI native · 康比特团队工作实践｜资料统计截至 2026-09-26。具体数字仅代表文中说明的工作范围。</footer>'
 text='<!DOCTYPE html>\n<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="description" content="'+e(p['intro'],quote=True)+'"><title>'+e(p['title'])+'</title><link rel="icon" href="data:,"><style>'+css+'</style></head><body class="webpage" data-audience="plain-business"><main class="page">'+nav+hero+''.join(body)+footer+'</main><script>'+client_js+'</script></body></html>\n'
 (ROOT/name).write_text(text)
 (OUT/source_paths[name]).write_text('\n'.join(md).rstrip()+'\n')
# The leadership source is now for business readers. Detailed records stay in the evidence folder and Git history.
leader=ROOT/'standards-stack/ai-engineering/AI_AGENT_PROJECT_INTRO_FOR_BEGINNERS.md'
leader.write_text((OUT/'leadership-page.md').read_text()+'\n## 内部维护入口\n\n当前页面文案由 `work/2026-09-26-ai-enablement-refresh/leadership-copy.json` 维护。数字来源见同目录 `evidence-ledger.csv` 和 `metrics.json`；旧技术详述保留在Git历史。\n')
# Preserve the team operational catalog and historical practice records, but point the public prose to its own source.
for filename,source in [('work/2026-05-25-team-ai-native-collaboration-guide/TEAM_AI_NATIVE_COLLABORATION_GUIDE.md','team-page.md'),('standards-stack/ai-engineering/AI_PRACTICE_SHARING.md','practice-page.md')]:
 path=ROOT/filename;s=path.read_text();marker='<!-- BUSINESS_READER_COPY -->'
 note=f'\n{marker}\n四页按受众分工；团队协作页已恢复本文件的完整章节、模块入口及当前方法目录。当前展示结构见 `work/2026-09-26-ai-enablement-refresh/{source}`。以下详细操作与历史记录继续保留；团队页按章节展开，领导与公司页面不重复这些操作内容。\n<!-- /BUSINESS_READER_COPY -->\n'
 if marker in s:s=re.sub(re.escape(marker)+r'.*?<!-- /BUSINESS_READER_COPY -->',lambda _:note.strip(),s,flags=re.S)
 else:i=s.index('\n');s=s[:i+1]+note+s[i+1:]
 path.write_text(s)
print('Rendered four business-reader pages and matching Markdown sources')
