#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
报销 Tab 加「使用流程」指南（EXPENSE_GUIDE_V1）
  · 可折叠 <details>，不给常规操作添乱
  · 七步流程 + 状态说明 + 制度注意事项 + 常见问题
双文件：工具/index.html、工具/app.html
"""
import re, subprocess, tempfile, os, sys

CSS_ANCHOR = "/* ===== 报销 Tab (EXPENSE_TAB_V1) ===== */"

CSS_NEW = CSS_ANCHOR + """
/* 使用流程指南（EXPENSE_GUIDE_V1） */
.exp-guide{margin:0 0 12px;border:1px solid #dbe3ef;border-radius:10px;background:#f8fbff}
.exp-guide>summary{cursor:pointer;padding:10px 14px;font-weight:600;color:#1a4d8f;list-style:none;outline:none}
.exp-guide>summary::-webkit-details-marker{display:none}
.exp-guide>summary::before{content:'\\25B8';display:inline-block;margin-right:6px;transition:transform .2s}
.exp-guide[open]>summary::before{transform:rotate(90deg)}
.eg-body{padding:2px 14px 14px;border-top:1px solid #e6edf7}
.eg-steps{margin:10px 0 14px;padding-left:22px;line-height:1.95;font-size:13.5px;color:#2c3b52}
.eg-steps li{margin-bottom:6px}
.eg-steps b{color:#12386e}
.eg-tip{color:#8a94a6;font-size:12px}
.eg-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:12px}
.eg-col{background:#fff;border:1px solid #e6edf7;border-radius:8px;padding:10px 12px}
.eg-col h4{margin:0 0 6px;font-size:13px;color:#1a4d8f}
.eg-col ul{margin:0;padding-left:18px;line-height:1.8;font-size:12.5px;color:#44506a}
.eg-col li{margin-bottom:3px}
@media (max-width:640px){.eg-steps{font-size:13px;padding-left:18px}.eg-cols{grid-template-columns:1fr}}
"""

GUIDE = (
    "'<details class=\"exp-guide\" id=\"expGuide\"><summary>\\u{1F4D6} 使用流程（新用户必读 · 点击展开）</summary>' +\n"
    "    '<div class=\"eg-body\">' +\n"
    "      '<ol class=\"eg-steps\">' +\n"
    "        '<li><b>登录</b>：飞书里打开宝锐销售工作台 → 左侧「\\u{1F9FE} 报销」<span class=\"eg-tip\">（若显示「未开通权限」，找刘新元开通）</span></li>' +\n"
    "        '<li><b>上传发票</b>：把发票拖进虚线框，或点「点击选择」多选，或「选文件夹」整包上传。打车/ETC 商家发的 ZIP 压缩包直接丢进来，系统会自己解包。</li>' +\n"
    "        '<li><b>等系统处理</b>：自动解包 → 识别票面（发票号 / 开票日期 / 金额 / 抬头）→ 校验 → 生成台账和打印包。约 1–3 分钟，期间可关页面，处理完飞书通知你。</li>' +\n"
    "        '<li><b>看状态</b>：每张票会被标成 通过 / 待补 / 待核 / 异常 / 重复 五类，含义见下方「状态怎么看」。</li>' +\n"
    "        '<li><b>补录缺失信息</b>：住宿缺城市档位和间夜数、招待缺就餐人数、私车公用缺公里数和能源类型，直接在页面「补录」列填，然后导出 JSON 回灌台账即可重新判定。</li>' +\n"
    "        '<li><b>下载打印包</b>：页面「打印包」区点击下载。打印包已按制度粘贴次序合并成一个 PDF（批次清单 → 发票 → 行程单/住宿清单 → 小票 → 抵扣联），住宿发票后面紧跟着当日的入住确认（结账单），直接打印即可。</li>' +\n"
    "        '<li><b>交财务</b>：打印后按《单据粘贴要求》粘贴（用胶水，不要用订书针），连同必备附件一并提交。</li>' +\n"
    "      '</ol>' +\n"
    "      '<div class=\"eg-cols\">' +\n"
    "        '<div class=\"eg-col\"><h4>状态怎么看</h4><ul>' +\n"
    "          '<li><b>通过</b>：票面信息齐全、抬头开给公司</li>' +\n"
    "          '<li><b>待补</b>：系统缺信息（不是票的问题），按提示补录</li>' +\n"
    "          '<li><b>待核</b>：金额/税额可能有提取误差，请对照票面核对</li>' +\n"
    "          '<li><b>异常</b>：票本身有问题，<b>必须让商家重开</b>（常见：抬头开成个人或其他公司）</li>' +\n"
    "          '<li><b>重复</b>：同一张票传了两次，已自动跳过</li>' +\n"
    "        '</ul></div>' +\n"
    "        '<div class=\"eg-col\"><h4>注意事项（制度）</h4><ul>' +\n"
    "          '<li>抬头必须是<b>珠海宝锐生物科技有限公司</b>（税号 91440400592109797M），开成个人的一律重开</li>' +\n"
    "          '<li>电子发票只能使用一次，用 A5 打印</li>' +\n"
    "          '<li>招待 / 外出 / 出差 / 加班需<b>事前申请</b>并关联申请单</li>' +\n"
    "          '<li>超标费用需另附《费用超标申请》，否则按上限报销</li>' +\n"
    "          '<li>跨年度票据在年末关账后失效</li>' +\n"
    "          '<li>必备附件不能少：住宿要住宿清单、机票/网约车要行程单、私车公用要《行驶记录明细表》</li>' +\n"
    "          '<li>平台只做校验与整理，不会把不合规的票变成合规</li>' +\n"
    "        '</ul></div>' +\n"
    "        '<div class=\"eg-col\"><h4>差旅报销专项</h4><ul>' +\n"
    "          '<li>先拿《附件2-差旅费报销汇总表》，<b>只填出差日期、出差地、同住人</b>，各栏金额由系统按发票自动归集</li>' +\n"
    "          '<li>租车要另附《附件3-行驶记录明细表》</li>' +\n"
    "          '<li>汇总表原件格式不改动，系统只单独编辑 Excel 并保存</li>' +\n"
    "          '<li>打印包文件名与差旅文件同名，便于对照</li>' +\n"
    "        '</ul></div>' +\n"
    "        '<div class=\"eg-col\"><h4>常见问题</h4><ul>' +\n"
    "          '<li>一直「排队中」？公司 Mac 端需在线，离线时只排队不处理</li>' +\n"
    "          '<li>看不到别人的票？按账号隔离，每人只看自己的</li>' +\n"
    "          '<li>发票开错了？找商家重开，不要自己修图或改写</li>' +\n"
    "          '<li>打印包在哪？页面「打印包」区，点文件名即可下载</li>' +\n"
    "          '<li>发票没有发到邮箱？平台只读邮箱收件，不会主动去要票，请让商家补发</li>' +\n"
    "        '</ul></div>' +\n"
    "      '</div>' +\n"
    "    '</div></details>' +\n"
    "    "
)

JS_ANCHOR = "'<div class=\"exp-drop\" id=\"expDrop\">把发票拖到这里"


def patch(path):
    s = open(path, encoding='utf-8').read()
    orig = len(s)
    if 'exp-guide' in s:
        print('  ⏭️ %s 已有使用流程，跳过' % path)
        return True
    assert CSS_ANCHOR in s, 'CSS 锚点未命中 ' + path
    s = s.replace(CSS_ANCHOR, CSS_NEW, 1)
    assert JS_ANCHOR in s, 'HTML 锚点未命中 ' + path
    s = s.replace(JS_ANCHOR, GUIDE + JS_ANCHOR, 1)
    open(path, 'w', encoding='utf-8').write(s)
    # 语法检查
    js = '\n'.join(re.findall(r'<script>(.*?)</script>', s, re.S))
    p = tempfile.mktemp(suffix='.js')
    open(p, 'w', encoding='utf-8').write(js)
    r = subprocess.run(['node', '--check', p], capture_output=True, text=True)
    os.unlink(p)
    print('  %s %d → %d 字节 ｜ JS %s %s' % (path, orig, len(s), '✅' if r.returncode == 0 else '❌', r.stderr[:120] if r.returncode else ''))
    return r.returncode == 0


if __name__ == '__main__':
    ok = all(patch(f) for f in ('工具/index.html', '工具/app.html'))
    print('  结果:', '✅ 全部通过' if ok else '❌ 有失败')
    sys.exit(0 if ok else 1)
