"""One-page end-user guide, vector PDF plus externally rendered PNG."""
from pathlib import Path
from io import BytesIO
from zipfile import ZipFile
import json
from reportlab.pdfgen import canvas
from reportlab.lib.colors import HexColor, Color
from reportlab.lib.utils import ImageReader
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

ROOT = Path(__file__).resolve().parents[2]
OUT = ROOT / 'outputs/presales-ticket-flow-20260920/user-guide'
OUT.mkdir(parents=True, exist_ok=True)
PDF = OUT / '项目支持工单-使用速查.pdf'
W, H = 595.276, 841.89
INK = '#183B43'; GRAY = '#546C73'; ORANGE = '#ED6A32'; TEAL = '#087C80'
pdfmetrics.registerFont(TTFont('Guide', '/System/Library/Fonts/STHeiti Light.ttc', subfontIndex=0))
pdfmetrics.registerFont(TTFont('GuideBold', '/System/Library/Fonts/STHeiti Medium.ttc', subfontIndex=0))
c = canvas.Canvas(str(PDF), pagesize=(W,H))
c.setTitle('项目支持工单使用速查')
c.setAuthor('康比特数字体育科技')
text_boxes=[]

def box(x,y,w,h,fill,stroke=None,r=7):
    c.setFillColor(HexColor(fill))
    c.setStrokeColor(HexColor(stroke or fill))
    c.setLineWidth(.6)
    c.roundRect(x,H-y-h,w,h,r,fill=1,stroke=bool(stroke))

def text(s,x,y,size=11,bold=False,color=INK):
    font='GuideBold' if bold else 'Guide'
    width=pdfmetrics.stringWidth(s,font,size)
    assert x>=0 and x+width<=W-20,(s,x,width)
    assert 0<=y<H-10,(s,y)
    c.setFillColor(HexColor(color));c.setFont(font,size)
    c.drawString(x,H-y-size,s)
    text_boxes.append({'text':s,'x':x,'top':y,'width':width,'height':size})

def line(x,y,x2,y2,color='#DCE5E5',width=.6):
    c.setStrokeColor(HexColor(color));c.setLineWidth(width)
    c.line(x,H-y,x2,H-y2)

def section(n,title,y,hint=''):
    box(32,y,23,23,ORANGE,r=6)
    text(n,37,y+5,11,True,'#FFFFFF')
    text(title,64,y+2,16,True)
    if hint:text(hint,459,y+6,10,False,GRAY)

def arrow(x,y):
    line(x,y,x+8,y,TEAL,1)
    line(x+5,y-3,x+8,y,TEAL,1)
    line(x+5,y+3,x+8,y,TEAL,1)

c.setFillColor(HexColor('#FFFFFF'));c.rect(0,0,W,H,fill=1,stroke=0)
with ZipFile(ROOT/'outputs/presales-ticket-flow-20260920/template/reference.docx') as z:
    logo=ImageReader(BytesIO(z.read('word/media/image1.png')))
    c.drawImage(logo,32,H-44,width=105,height=16.34,mask='auto')
text('使用速查 · 2026.09',442,30,9,False,GRAY)
text('项目支持工单',32,62,28,True)
text('需要支持，直接在企业微信提单。',33,105,12,False,GRAY)

box(32,133,531,35,'#EAF5F3',r=6)
text('企业微信  →  工作台  →  审批  →  发起申请  →  项目支持工单',45,144,10.5,True,TEAL)

section('01','哪些事，可以申请？',188)
cards=[('试用与技术',['账号申请与试用','系统环境部署','接口与定制开发评估'],TEAL),
       ('需求与方案',['需求文档确认','方案与产品资料','配置报价与投标支持'],ORANGE),
       ('现场与设备',['现场勘察','图纸与设备点位','演示接待','设备借用','售前转实施交接'],INK)]
for i,(title,items,color) in enumerate(cards):
    x=32+i*181
    box(x,222,169,141,'#F8FAFA','#DCE6E5')
    box(x+12,236,4,16,color,r=1)
    text(title,x+23,234,13,True,color)
    for k,item in enumerate(items):
        c.setFillColor(HexColor(color));c.circle(x+14,H-(268+k*18),1.5,fill=1,stroke=0)
        text(item,x+23,261+k*18,10.5)

section('02','表单这样填',389,'必填 5 项')
fields=[('项目名称','写客户和项目名称'),('支持事项','选一项最符合本次需求的事情'),
        ('需求说明','说清现状、问题和需要什么帮助'),('预期成果','写清要方案、图纸、账号还是评估结论'),
        ('期望完成时间','填到具体日期和时间')]
for i,(label,desc) in enumerate(fields):
    y=424+i*27
    if i%2==0:box(32,y-4,531,27,'#F3F7F6',r=0)
    text(str(i+1),43,y+2,10,True,TEAL)
    text(label,66,y+1,11,True)
    text(desc,181,y+2,10.5)

text('按需补充：项目/商机编号、附件、资源及费用、关联原单编号。',33,569,10,False,GRAY)
text('申请试用或借设备：还要填写截止日期。',33,587,10.5,True,TEAL)

box(32,622,531,78,'#FFF3E9',r=7)
text('填写示例',45,631,10,True,ORANGE)
text('项目：某客户餐厅  ｜  事项：方案与产品资料',45,649,10)
text('需求：新建自助称重餐厅，平面图见附件。',45,665,10)
text('成果：方案PPT＋设备清单  ｜  期望：9月25日17:00',45,681,10)

section('03','提交后，怎么走？',718)
nodes=['产品经理受理','姜阳审批','朱总审批','产品/交付办理','你确认结果']
for i,label in enumerate(nodes):
    x=32+i*109
    box(x,752,95,29,'#EAF5F3',r=5)
    width=pdfmetrics.stringWidth(label,'GuideBold',10)
    text(label,x+(95-width)/2,760,10,True,TEAL)
    if i<4:arrow(x+98,766.5)
text('看进度：审批 → 已提交。收到成果后，请向负责人反馈是否满足需求。',33,797,9,False,GRAY)
text('试用账号、借用设备，请按约定办理续期、回收或归还。',33,815,9,False,GRAY)
c.showPage();c.save()
(OUT/'layout-check.json').write_text(json.dumps({'pages':1,'text_elements':len(text_boxes),'text_boxes':text_boxes},ensure_ascii=False,indent=2)+'\n')
print(PDF)
