#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""把页面「导出 JSON」的改动回灌到台账，并重跑 校验 → 页面（自动生成打印包）

用法：
  /usr/bin/python3 脚本/apply_page_edits.py ~/Downloads/报销台账_2026-09-19.json
  /usr/bin/python3 脚本/apply_page_edits.py            # 自动找 ~/Downloads 里最新的 报销台账_*.json
说明：合并 分类 / 补录 / 票面 三组字段（页面里改的分类、补的票面字段都会生效），
      然后重跑校验与页面生成——票面覆盖值会参与判定（抬头/税号/金额等）。
"""
import os
import sys
import glob
import json
import subprocess

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

GROUPS = ('分类', '补录', '票面')


def find_latest():
    pats = [os.path.expanduser('~/Downloads/报销台账_*.json'),
            os.path.expanduser('~/Desktop/报销台账_*.json'),
            os.path.join(core.DATA, '报销台账_*.json')]
    hits = []
    for p in pats:
        hits += glob.glob(p)
    hits.sort(key=os.path.getmtime)
    return hits[-1] if hits else None


def main(argv):
    path = argv[0] if argv else find_latest()
    if not path or not os.path.exists(path):
        print('❌ 没找到导出的 JSON。请在页面点「🗂 导出 JSON」，然后用它的路径调用本脚本。')
        return 1
    exp = json.load(open(path, encoding='utf-8'))
    led = core.load_ledger()
    by_id = {r.get('id'): r for r in led['发票']}
    n, miss = 0, 0
    for r in exp.get('发票', []):
        t = by_id.get(r.get('id'))
        if not t:
            miss += 1
            continue
        for g in GROUPS:
            src = r.get(g) or {}
            for k, v in src.items():
                if v in (None, ''):
                    continue
                if str(t.get(k) or '') == str(v):
                    continue
                t.setdefault(g, {})[k] = v
                n += 1
        if r.get('备注变更'):
            t['备注'] = r['备注变更']
    core.save_ledger(led)
    print('✅ 已回灌 %s：%d 处改动（未匹配 %d 条）' % (os.path.basename(path), n, miss))
    for step in ['invoice_check.py', 'build_page.py']:
        r = subprocess.run(['/usr/bin/python3', os.path.join(core.BASE, '脚本', step)],
                           capture_output=True, text=True)
        tail = [l for l in (r.stdout or '').strip().split('\n') if l.strip()][-2:]
        print('   %s → %s' % (step, ' / '.join(tail)))
    print('   提示：接着可跑 脚本/build_print_pack.py 生成打印包')
    return 0


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
