# -*- coding: utf-8 -*-
"""导入《诊断原料&生命科学客户清单》→ 权威归属注册表

数据源：诊断原料&生命科学客户清单<YYYYMMDD>.xls（WPS/Excel，BIFF8）
输出：  数据/pricing/_auth_customers_<YYYYMMDD>.json

取数口径（关键）：
  * 只取【部门表】= 大客户销售部 / 销售拓展部 / 生命科学销售部
    理由：三张部门表按人统计与本文件【汇总表】完全自洽
          （陈溪子167/黄文才186/刘虹晶133/李江辉134/冯贤平146/
            杨天雄116/宋学伟116/林潇86/路要峰66/徐卓凡33/张文蝶34/
            赵云浩36/刘子研14 全部逐一对上）；
          而【区域表】（华北华西/华中华南/华东）里的李丽佳、龙友波
          在汇总表中根本不存在 → 区域表是旧快照，弃用。
  * 部门表内部对同一客户零冲突（已校验）。
  * 客户归属是 (业务线, 销售员) 二元组：24 个客户同时属诊断线+生命科学线。

用法：/usr/bin/python3 脚本/import_auth_customers.py [xls路径]
"""
import xlrd, json, os, re, sys, collections, datetime

B = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEFAULT_SRC = ("/Users/liuxinyuan/.hermes/cache/documents/"
               "doc_e3fb9453f29f_诊断原料&生命科学客户清单20260831.xls")

DEPT_SHEETS = [('大客户销售部', 'da'), ('销售拓展部', 'da'), ('生命科学销售部', 'ls')]
# 销售员列中出现的非人名占位值（源表瑕疵，不擅自指派）
PLACEHOLDERS = {'上海', '浙江', '广东', '浙江/广东', '华东', '华北', '华南'}


def s(v):
    if isinstance(v, float) and v == int(v):
        return str(int(v))
    if v is None:
        return ''
    return str(v).strip()


def main():
    src = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_SRC
    m = os.path.basename(src)
    data_date = ''
    for tok in re.findall(r'\d{8}', m):          # 文件名内嵌日期，如 ...20260831.xls
        data_date = f"{tok[:4]}-{tok[4:6]}-{tok[6:]}"
        break

    wb = xlrd.open_workbook(src)
    customers, by_line, groups = {}, {}, {}
    unassigned, joint = {}, {}
    sheet_stat = {}

    for sn, line in DEPT_SHEETS:
        if sn not in wb.sheet_names():
            continue
        sh = wb.sheet_by_name(sn)
        n = 0
        for r in range(2, sh.nrows):                 # r0 标题行, r1 表头
            if sn == '生命科学销售部':                # 4 列：序号|客户名称|销售员|区域
                nm, sp, grp, listed = s(sh.cell_value(r, 1)), s(sh.cell_value(r, 2)), '', ''
            else:                                     # 5 列：序号|集团简称|客户名称|销售员|是否上市
                nm, sp, grp, listed = (s(sh.cell_value(r, 2)), s(sh.cell_value(r, 3)),
                                       s(sh.cell_value(r, 1)), s(sh.cell_value(r, 4)))
            if not nm or not sp:
                continue
            n += 1
            if sp in PLACEHOLDERS:                    # 源表占位，不指派归属
                unassigned[nm] = sp
                continue
            if '/' in sp:                             # 联合服务（如 吴云/韩远怀）
                joint[nm] = sp
            by_line.setdefault(nm, {})[line] = sp
            # customers 主记录：诊断线优先（业务主口径），生命科学线单客户才落 ls
            if nm not in customers or line == 'da':
                customers[nm] = {'sp': sp, 'line': line, 'dept': sn,
                                 'group': grp, 'listed': listed}
            if grp:
                g = groups.setdefault(grp, {'line': line, 'sp': [], 'members': []})
                if sp not in g['sp']:
                    g['sp'].append(sp)
                if nm not in g['members']:
                    g['members'].append(nm)
        sheet_stat[sn] = n

    multi = {nm: v for nm, v in by_line.items() if len(v) > 1}

    out = {
        '_meta': {
            'source_file': m,
            'data_date': data_date,
            'imported_at': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            'sheets': sheet_stat,
            'total_rows': sum(sheet_stat.values()),
            'total_customers': len(customers),
            'multi_line_customers': len(multi),
            'group_count': len(groups),
            'placeholder_unassigned': len(unassigned),
            'note': ('权威口径=部门表（大客户销售部/销售拓展部/生命科学销售部）；'
                     '区域表为旧快照已弃用。归属为 (业务线, 销售员) 二元组。'),
        },
        'customers': customers,
        'by_line': by_line,
        'groups': groups,
        'unassigned': unassigned,
        'joint': joint,
    }

    day = (data_date or datetime.date.today().isoformat()).replace('-', '')
    dst = os.path.join(B, '数据', 'pricing', f'_auth_customers_{day}.json')
    with open(dst, 'w', encoding='utf-8') as f:
        json.dump(out, f, ensure_ascii=False, indent=1)

    print(f"✅ 写入 {os.path.relpath(dst, B)}")
    print(f"   客户 {len(customers)} / 双线 {len(multi)} / 集团 {len(groups)} "
          f"/ 占位未指派 {len(unassigned)} / 联合服务 {len(joint)}")
    print(f"   部门表行数 {sheet_stat}")
    if unassigned:
        print("\n⚠️ 源表销售员列为区域占位（未指派到人），共 %d 条：" % len(unassigned))
        for nm, v in unassigned.items():
            print(f"     [{v}] {nm}")
    if joint:
        print("\n⚠️ 联合服务客户：")
        for nm, v in joint.items():
            print(f"     {v}  ← {nm}")
    # 交叉核对汇总表
    per = collections.Counter(v['sp'] for v in customers.values())
    print("\n按人统计:", dict(per.most_common()))


if __name__ == '__main__':
    main()
