#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""年度目标统一为 6,650.0 万元 + 全库加注「300万元北京科研目标空缺」

口径（用户 2026-10-15 指定）：
  全司年度目标 = 6,650 万（大客户 2650 + 拓展 3400 + 生命科学 600，权威源 数据/目标基础数据_2026.json）
  原 6,950 万 = 6650 + 生命科学北京区域 300 万（区域未搭建 → 空缺），此 300 万单列注释，不计入 6650。

动作：① 修正错值载体  ② 给所有载目标字段的文件加 target_note  ③ 备份
用法：env -u PYTHONPATH /opt/homebrew/bin/python3 脚本/set_annual_target_note.py [--dry]
"""
import io
import json
import os
import re
import shutil
import sys
from datetime import datetime

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
BK = W + '/数据/backup'
NOTE = '300万元北京科研目标空缺'
TS = datetime.now().strftime('%Y%m%d_%H%M%S')
DRY = '--dry' in sys.argv
TARGET_YUAN = 66500000.0
TARGET_WAN = 6650.0

# 文件 → 需改的键（值以元或万元给出）
FIX = {
    '数据/kpi_dashboard.json': [('total_target', TARGET_YUAN, 'yuan')],
    '数据/my_kpis.json': [('total_target', TARGET_YUAN, 'yuan')],
}
# 仅加注释的文件（不改正目标，只补 target_note）
ANNOTATE = ['数据/kpi_dashboard.json', '数据/my_kpis.json', '数据/year_targets_2026.json',
            '数据/月度目标_2026统一.json', '数据/目标基础数据_2026.json', '数据/h2_monthly_targets.json',
            '数据/2026Q3汇报_部门口径.json', '数据/2026Q3汇报_汇报数据层.json']

report = []
os.makedirs(BK, exist_ok=True)
for rel, edits in FIX.items():
    p = os.path.join(W, rel)
    d = json.load(io.open(p, encoding='utf-8'))
    before = d.get('total_target')
    for key, val, unit in edits:
        if key in d:
            d[key] = val
    d['target_note'] = NOTE
    d['annual_target'] = TARGET_WAN
    if 'year_targets_note' in d:
        d['year_targets_note'] = d['year_targets_note'].replace('6,950 万', '6,650 万').replace('6950 万', '6650 万')
        d['year_targets_note'] += '；全司年度目标口径 6,650 万 = 大客户 2650 + 拓展 3400 + 生命科学 600（原 6,950 万中的 300 万为北京科研目标空缺，不计入）'
    report.append('%-40s total_target %s → %s ｜ 加 target_note' % (rel, before, d.get('total_target')))
    if not DRY:
        shutil.copy2(p, '%s/%s.bak-%s' % (BK, os.path.basename(p), TS))
        with io.open(p, 'w', encoding='utf-8') as f:
            json.dump(d, f, ensure_ascii=False, indent=1)

for rel in ANNOTATE:
    p = os.path.join(W, rel)
    if not os.path.exists(p):
        report.append('%-40s ⚠️ 不存在' % rel); continue
    d = json.load(io.open(p, encoding='utf-8'))
    changed = False
    if isinstance(d, dict):
        if d.get('target_note') != NOTE:
            d['target_note'] = NOTE
            changed = True
        # 递归：把任何 6950 的年度目标值改为 6650（只改目标类键，避免误伤）
        def fix_vals(o, path=''):
            global_changed = False
            if isinstance(o, dict):
                for k, v in list(o.items()):
                    kk = str(k)
                    if isinstance(v, (int, float)) and kk in ('annual_total', 'annual', 'total_annual', 'annual_target'):
                        if abs(v - 6950) < 0.6:
                            o[k] = 6650.0
                            global_changed = True
                    elif isinstance(v, str) and re.search(r'6,?950', v) and re.search(r'annual|总|年度', kk, re.I):
                        o[k] = re.sub(r'6,?950', '6,650', v)
                        global_changed = True
                    elif isinstance(v, (dict, list)):
                        global_changed = fix_vals(v, path + '/' + kk) or global_changed
            elif isinstance(o, list):
                for i, it in enumerate(o):
                    global_changed = fix_vals(it, path + '[%d]' % i) or global_changed
            return global_changed
        if fix_vals(d):
            changed = True
    if changed and not DRY:
        shutil.copy2(p, '%s/%s.bak-%s' % (BK, os.path.basename(p), TS))
        with io.open(p, 'w', encoding='utf-8') as f:
            json.dump(d, f, ensure_ascii=False, indent=1)
    report.append('%-40s %s' % (rel, '已加注/修正' if changed else '已是最新'))

print('═' * 92)
print('年度目标统一 6,650.0 万元 + 注释「%s」%s' % (NOTE, '（--dry 未写盘）' if DRY else ''))
print('═' * 92)
for r in report:
    print('  ' + r)

# 验证：权威源一致性
tb = json.load(io.open(W + '/数据/目标基础数据_2026.json', encoding='utf-8'))
depts = sum(v.get('target_annual', 0) for v in tb['departments'].values())
print()
print('  权威源核对：meta.total_annual=%s ｜ Σ部门=%s ｜ 一致=%s'
      % (tb['meta'].get('total_annual'), depts, abs(tb['meta'].get('total_annual', 0) - depts) < 0.01))
if not DRY:
    print('  备份目录：数据/backup/*.bak-%s' % TS)
