from pathlib import Path
import csv,re,subprocess,html,json
from openpyxl import Workbook,load_workbook
from openpyxl.styles import Font,PatternFill,Alignment
from openpyxl.utils import get_column_letter
base=Path(__file__).resolve().parent;out=base/'output';out.mkdir(exist_ok=True)
tables={
'30天动作':[['阶段','动作','唯一A待实名','完成标准','实际时间','实际状态'],['D0-D3','核账号权限、基线、人员、入口与预算','增长负责人','账号/入口/台账/响应时段/成本上限齐全','','未启动'],['D4-D7','5条标记测试线索全流程演练','销售负责人','来源→分配→诊断→方案→结果可追溯，测试不计业绩','','未启动'],['D8-D14','3至6条审核内容+1次演示场','内容负责人','一内容一邀请，接待人可响应','','未启动'],['D15-D21','真实诊断并比较1项AI工作流','销售负责人','真实推进证据及人工时间/错误/返工','','未启动'],['D22-D30','争取累计12条内容、2次演示场','增长负责人','真实漏斗与成本，不按工作量宣称渠道成功','','未启动']],
'首批内容':[['ID','题目','素材要求','行动邀请','审核人','发布时间','结果'],['DY01','同一食堂为何报价不同','分项示例，不编固定价','配置范围梳理','','','未发布'],['DY02','餐补对不上先查三张记录','真实已验证版本的脱敏账','20分钟对账诊断','','','未发布'],['DY03','旧消费机一定全换吗','设备调查与兼容边界','设备接口清单','','','未发布'],['DY04','一笔称重疑问订单如何定位','授权或清楚标注的模拟演示','同场景演示','','','未发布'],['DY05','买系统先让财务看懂一张账','充值补贴消费退款核对流程','后勤财务联合演示','','','未发布'],['DY06','营养菜单多了哪些实际工作','内容来源/维护/服务责任','营养展示服务沟通','','','未发布']],
'线索字段模板':[['字段','填写规则','是否必填'],['线索ID','使用实际平台/CRM稳定ID；无系统先编号','是'],['是否测试','团队自测明确测试，排除业绩','是'],['首次内容来源/本次影响来源','内容ID、入口及时间；未获平台数据写未知','是'],['客户与组织类型','企业/机关/学校/伙伴/其他；不编客户','是'],['主要问题/场景','客户原意与确认信息分开','是'],['联系方式授权范围','仅记受控系统引用，不把手机号填进Git','是'],['负责人/认领/人工首响时间','自动回执不算人工响应','是'],['阶段与客户下一步日期','在途/培育/无效及原因','是'],['预算/决策人/采购窗口','正式商机前补齐，未知不猜','进入商机前'],['诊断/演示/报价/合同/回款日期','按真实事件记录','事件发生时'],['合同ID及金额','关联正式合同；一单多SKU不拆成多单','签约时'],['成本及工时','内容广告接待售前投入按同批跟踪','发生时'],['去重/新客/存量增购','保留重复关联；助攻不冒充新客','是']],
'AI工作流':[['环节','输入','AI输出','人确认','指标'],['案例转内容','授权素材与真实功能','脚本草稿、来源及禁用表述检查','产品/内容','人工耗时、事实错误、返工'],['咨询转诊断','经授权的咨询/表单','场景、重复提示、缺字段','销售','响应/完整度/分类纠错'],['诊断转方案','已确认范围、BOM与价格真源','方案、差距、报价草稿、验收表','产品交付商务','准备人时、遗漏、客户推进'],['结果转行动','来源、阶段、反馈、合同','断点与下周建议','Jack','可追溯/重复错误/阶段推进']],
'指标与判断':[['指标','口径','空白或小样本处理'],['有效咨询','去重后确认角色与业务场景的人/单位咨询','未核不计'],['有效商机','痛点/付费方/预算/关键人/窗口/下一步完整','不把有效咨询直接当商机'],['首响','公布工作时段内首次人工有效回应','建议30分钟，未落实值班不承诺'],['订单','正式合同，新客/增购/续费/试点分列','不把口头意向或同单多SKU重复计数'],['获客成本','同批线索成熟后归集广告内容接待售前成本','无成熟订单写未可评，不写0'],['AI提效','同类任务实际人时及事实错误/返工比较','不能只凭感觉或工具数'],['投放扩大','质量/后续转化/贡献及现金支持','无预算批准或样本不足不宣布可规模化']],
'启动缺口':[['输入','当前情况','负责补齐'],['账号与资质、可用工具','未核后台','账号负责人'],['近30天内容咨询订单与支出','未统计/未取得','内容与销售负责人'],['内容接待和诊断人员姓名/时间','待确定','Jack'],['试跑资金与人工投入上限','待批准','Jack'],['CRM现状和线索去重映射','待核','销售运营'],['素材授权与可售版本','逐条确认','产品交付负责人']]}
wb=Workbook();wb.remove(wb.active)
for name,rows in tables.items():
 s=wb.create_sheet(name)
 for r in rows:s.append(r)
 s.freeze_panes='A2';s.auto_filter.ref=s.dimensions;s.sheet_view.showGridLines=False
 for i in range(1,s.max_column+1):s.column_dimensions[get_column_letter(i)].width=24 if i==1 else 43
 for row in s:
  for c in row:
   c.font=Font(name='微软雅黑',size=12,bold=c.row==1,color='FFFFFF' if c.row==1 else '203746');c.fill=PatternFill('solid',fgColor='173448' if c.row==1 else ('F3F6F7' if c.row%2==0 else 'FFFFFF'));c.alignment=Alignment(wrap_text=True,vertical='top')
 for i in range(2,s.max_row+1):s.row_dimensions[i].height=65
 s.row_dimensions[1].height=30
 s.sheet_properties.pageSetUpPr.fitToPage=True;s.page_setup.orientation='landscape';s.page_setup.paperSize=s.PAPERSIZE_A3;s.page_setup.fitToWidth=1;s.page_setup.fitToHeight=0;s.print_title_rows='1:1'
wb.save(out/'AI与抖音_30天成交试跑台账.xlsx')
for name,rows in tables.items():
 fname={'30天动作':'douyin-actions.csv','首批内容':'douyin-content-pilot.csv','线索字段模板':'douyin-lead-schema.csv','AI工作流':'ai-sales-workflows.csv','指标与判断':'douyin-metric-contract.csv','启动缺口':'douyin-startup-gaps.csv'}[name]
 with (base/fname).open('w',encoding='utf-8-sig',newline='') as f:csv.writer(f,lineterminator='\n').writerows(rows)
md=(base/'ai-douyin-operating-plan.md').read_text();body=subprocess.run(['pandoc','--from=gfm','--to=html5'],input=md,capture_output=True,text=True,check=True).stdout
body=re.sub(r'<h1[^>]*>.*?</h1>','',body,count=1,flags=re.S);body=body.replace('<table>','<div class="table-wrap" tabindex="0" role="region" aria-label="可横向滚动的数据表"><table>').replace('</table>','</table></div>')
# Reuse the already validated pakco-derived local page and design tokens.
page=(base/'government-enterprise-school-sales-plan.html').read_text();page=re.sub(r'<title>.*?</title>','<title>体系、AI与抖音｜30天成交试跑</title>',page)
page=re.sub(r'<section class="hero">.*?</section><section class="rail">.*?</section>', '<section class="hero"><p class="kicker">康比特 · 经营流程试跑</p><h1>把体系、AI和抖音<br>连到同一笔订单。</h1><p class="lede">一个小组，从真实内容、有效咨询、线上诊断和演示，持续跟到采购、合同与交付反馈。</p><p class="meta">内部执行准备版 · 30天从团队正式启动日算起 · 账号、人员和预算待核</p><div class="pills"><a href="output/AI与抖音_30天成交试跑台账.xlsx" download>下载30天试跑台账</a><a href="government-enterprise-school-sales-plan.html">政府 / 企业 / 学校打法</a></div></section>',page,flags=re.S)
page=re.sub(r'<main>.*?</main>','<main>'+body+'</main>',page,flags=re.S);page=re.sub(r'<div class="page-footer">.*?</div>','<div class="page-footer">本次交付为方案与草稿；未发布内容、联系客户、投放广告或配置账号自动化。</div>',page,flags=re.S)
(base/'ai-douyin-sales-operating-plan.html').write_text(page)
print('6Sheet workbook, 6CSV, updated HTML created')
