#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""把 4 个 LS 生成器统一切到【2026-10-09 新导出 + 剔除作废/终止】口径。

1) SRC → 销售分析/源数据/生命科学销售订单_20261009_含作废终止标记.xlsx
2) 标准口径追加：剔 作废状态=已作废、剔 业务终止=业务终止
3) CALIBER 文案同步
每个锚点必须命中恰好 1 次，否则整体不写（防止改一半）。
"""
import io
import os
import re
import sys

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
os.chdir(ROOT)
NEW_SRC = ("'/Users/liuxinyuan/Desktop/Hermes输出-工作类/销售分析/源数据/"
           "生命科学销售订单_20261009_含作废终止标记.xlsx'")
FILES = ['脚本/build_ls_from_orders.py', '脚本/gen_promo_tier_by_ketizu.py',
         '脚本/gen_promo_tier_xlsx.py', '脚本/gen_ls_ketizu_period_table.py']
OLD_CAL = '& (~df[\'客户\'].str.contains(\'宝锐|宝泰|横琴\', na=False))'
NEW_CAL = OLD_CAL + " & (~df['作废状态'].isin(['已作废'])) & (~df['业务终止'].isin(['业务终止']))"
OLD_CAL_TXT = "'标准销售订单 & 已审核 & 非赠品 & 客户不含(宝锐|宝泰|横琴)'"
NEW_CAL_TXT = "'标准销售订单 & 已审核 & 非赠品 & 客户不含(宝锐|宝泰|横琴) & 未作废 & 非业务终止'"

plans = {}
for p in FILES:
    s = io.open(p, encoding='utf-8').read()
    o = s
    # ① SRC
    n1 = len(re.findall(r"SRC = \('[^']*'\s*\n\s*'[^']*'\)", s))
    s = re.sub(r"SRC = \('[^']*'\s*\n\s*'[^']*'\)", 'SRC = ' + NEW_SRC, s)
    # ② 口径 mask
    n2 = s.count(OLD_CAL)
    s = s.replace(OLD_CAL, NEW_CAL)
    # ③ CALIBER 文案
    n3 = s.count(OLD_CAL_TXT)
    s = s.replace(OLD_CAL_TXT, NEW_CAL_TXT)
    plans[p] = (s, n1, n2, n3)
    print('%-34s SRC:%d  口径:%d  文案:%d  %s' % (os.path.basename(p), n1, n2, n3,
          '✅' if (n1 == 1 and n2 == 1 and n3 <= 1) else '❌ 锚点异常'))

if not all(v[1] == 1 and v[2] == 1 and v[3] <= 1 for v in plans.values()):
    print('\n❌ 有锚点未命中，未写任何文件')
    sys.exit(1)
import py_compile
for p, (s, _, _, _) in plans.items():
    io.open(p, 'w', encoding='utf-8').write(s)
    try:
        py_compile.compile(p, doraise=True)
    except Exception as e:
        print('❌ 语法错 %s: %s' % (p, e))
        sys.exit(1)
print('\n✅ 4 个脚本已更新并通过 py_compile')
