#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""报销助手 · 生成测试样例（合成数据，非真实发票）

生成到 报销助手/测试样例/：
  样例1_住宿_正常.xml          金额/税额/合计自洽
  样例2_铁路电子客票.xml        行程类票据
  样例3_餐饮招待.xml           触发『待补：关联客户/陪同人数』
  样例4_金额不自洽.xml          触发『异常：金额不自洽』
  样例1_重复副本.xml           与样例1同号 → 触发『重复』
  样例5_发票.pdf               验证 PDF 文本层解析路径
用途：验证 解析→校验→台账→页面 全链路，可随时删除。
"""
import os
import sys

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import invoice_core as core  # noqa: E402

OUT = os.path.join(core.BASE, '测试样例')
os.makedirs(OUT, exist_ok=True)

TPL = '''<?xml version="1.0" encoding="UTF-8"?>
<EInvoice xmlns="http://www.chinatax.gov.cn/einv">
  <Header>
    <InvoiceType>{itype}</InvoiceType>
    <InvoiceNumber>{num}</InvoiceNumber>
    <IssueTime>{date}</IssueTime>
  </Header>
  <SellerInformation>
    <SellerName>{sname}</SellerName>
    <SellerTaxID>{stax}</SellerTaxID>
  </SellerInformation>
  <BuyerInformation>
    <BuyerName>{bname}</BuyerName>
    <BuyerTaxID>{btax}</BuyerTaxID>
  </BuyerInformation>
  <GoodsInfos>
    <GoodsInfo>
      <ItemName>{item}</ItemName>
      <Amount>{amt}</Amount>
      <TaxRate>{rate}</TaxRate>
      <TaxAmount>{tax}</TaxAmount>
    </GoodsInfo>
  </GoodsInfos>
  <TotalAmWithoutTax>{amt}</TotalAmWithoutTax>
  <TotalTaxAm>{tax}</TotalTaxAm>
  <TotalTax-includedAmount>{total}</TotalTax-includedAmount>
</EInvoice>
'''

CASES = [
    dict(fn='样例1_住宿_正常.xml', num='26120000000012345678', date='2026-09-15',
         itype='电子发票（普通发票）', sname='珠海样例酒店管理有限公司', stax='91440400MA000TEST1',
         bname='珠海宝锐生物科技有限公司', btax='91440400592109797M', item='住宿服务', amt='566.04', rate='6%', tax='33.96', total='600.00'),
    dict(fn='样例2_铁路电子客票.xml', num='26120000000012345679', date='2026-09-14',
         itype='电子发票（铁路电子客票）', sname='中国铁路广州局集团有限公司', stax='91440000100000TEST',
         bname='珠海宝锐生物科技有限公司', btax='91440400592109797M', item='铁路旅客运输服务', amt='100.00', rate='9%', tax='9.00', total='109.00'),
    dict(fn='样例3_餐饮招待.xml', num='26120000000012345680', date='2026-09-16',
         itype='电子发票（普通发票）', sname='珠海样例餐饮服务有限公司', stax='91440400MA000TEST3',
         bname='珠海宝锐生物科技有限公司', btax='91440400592109797M', item='餐饮服务', amt='500.00', rate='6%', tax='30.00', total='530.00'),
    dict(fn='样例7_住宿超标.xml', num='26120000000012345683', date='2026-09-17',
         itype='电子发票（普通发票）', sname='广州样例商务酒店有限公司', stax='91440100MA000TEST7',
         bname='珠海宝锐生物科技有限公司', btax='91440400592109797M', item='住宿服务', amt='754.72', rate='6%', tax='45.28', total='800.00'),
    dict(fn='样例8_私车公用.xml', num='26120000000012345684', date='2026-09-18',
         itype='电子发票（普通发票）', sname='中国石化销售股份有限公司广东石油分公司', stax='91440000100000TEST8',
         bname='珠海宝锐生物科技有限公司', btax='91440400592109797M', item='成品油*汽油', amt='265.49', rate='13%', tax='34.51', total='300.00'),
    dict(fn='样例4_金额不自洽.xml', num='26120000000012345681', date='2026-09-17',
         itype='电子发票（普通发票）', sname='珠海样例办公用品有限公司', stax='91440400MA000TEST4',
         bname='珠海宝锐生物科技有限公司', btax='91440400592109797M', item='办公用品', amt='200.00', rate='13%', tax='26.00', total='236.00'),
]


def main():
    for c in CASES:
        fn = c.pop('fn')
        p = os.path.join(OUT, fn)
        open(p, 'w', encoding='utf-8').write(TPL.format(**c))
        print('  ✅', fn)
        c['fn'] = fn
    # 重复副本（内容与样例1相同 → 触发重复检测）
    dup = os.path.join(OUT, '样例1_重复副本.xml')
    open(dup, 'w', encoding='utf-8').write(TPL.format(**CASES[0]))
    print('  ✅ 样例1_重复副本.xml')
    # 金额不自洽：样例4 的合计改成 240 制造差额 4 元
    p4 = os.path.join(OUT, '样例4_金额不自洽.xml')
    s = open(p4, encoding='utf-8').read().replace('<TotalTax-includedAmount>236.00<', '<TotalTax-includedAmount>240.00<')
    open(p4, 'w', encoding='utf-8').write(s)

    # PDF 样例：用 Chrome headless 生成（fitz 默认字体不含中文，文本层会变·，不可用）
    import subprocess, tempfile
    html_tpl = """<html><head><meta charset="utf-8"><style>
    body{font-family:"PingFang SC","Songti SC",sans-serif;font-size:13px;padding:28px;line-height:1.9}
    h3{text-align:center;letter-spacing:4px;margin:0 0 14px}
    .r{display:flex;gap:10px}.k{color:#333;min-width:150px}
    table{width:100%;border-collapse:collapse;margin-top:10px}
    td,th{border:1px solid #333;padding:4px 6px;font-size:12px}
    .b{font-weight:700}</style></head><body>
    <h3>电子发票（普通发票）</h3>
    <div class="r"><span class="k">发票号码：</span><span>26120000000012345682</span></div>
    <div class="r"><span class="k">开票日期：</span><span>2026年09月18日</span></div>
    <div class="r"><span class="k">购买方名称：</span><span>宝锐生物（样例抬头）</span></div>
    <div class="r"><span class="k">购买方纳税人识别号：</span><span>91440400MA000BIORI</span></div>
    <div class="r"><span class="k">销售方名称：</span><span>珠海样例信息技术有限公司</span></div>
    <div class="r"><span class="k">销售方纳税人识别号：</span><span>91440400MA000TEST5</span></div>
    <table><tr><th>项目名称</th><th>金额</th><th>税率</th><th>税额</th></tr>
    <tr><td>信息技术服务费</td><td>943.40</td><td>6%</td><td>56.60</td></tr></table>
    <div style="margin-top:10px">合计 ¥ 943.40 ¥ 56.60</div>
    <div class="b" style="margin-top:6px">价税合计（大写）壹仟圆整　（小写）¥1000.00</div>
    </body></html>"""
    tmp = os.path.join(tempfile.gettempdir(), 'invoice_fixture.html')
    open(tmp, 'w', encoding='utf-8').write(html_tpl)
    pp = os.path.join(OUT, '样例5_发票.pdf')
    chrome = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
    if os.path.exists(chrome):
        r = subprocess.run([chrome, '--headless', '--disable-gpu', '--no-pdf-header-footer',
                            '--print-to-pdf=' + pp, 'file://' + tmp],
                           capture_output=True, text=True, timeout=120)
        if os.path.exists(pp) and os.path.getsize(pp) > 3000:
            print('  ✅ 样例5_发票.pdf（Chrome 生成，含中文字体）')
        else:
            print('  ⚠️ PDF 样例生成失败：%s' % (r.stderr or '')[:120])
    else:
        print('  ⚠️ 未找到 Chrome，跳过 PDF 样例')

    print('\n测试样例目录：%s' % OUT)
    print('跑测试：/usr/bin/python3 脚本/invoice_parse.py 测试样例/*.xml')
    print('清空台账：/usr/bin/python3 脚本/reset_ledger.py')


if __name__ == '__main__':
    main()
