#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""P0 迁移逐条对差：从迁移前备份取旧类，与当前值并列，并对文本做语义信号打分。

旧值来源：_bak_todo_p0_20261007-212235/todos.json（迁移前快照，按 id 匹配）
"""
import io
import json
import os
import sys
from collections import Counter

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
BAK = os.path.join(ROOT, '_bak_todo_p0_20261007-212235', 'todos.json')

OLD_LABEL = {'prep': '访前准备', 'post': '访后跟进', 'complaint': '客诉',
             'custom': '定制需求', 'meeting': '会议邀约', 'travel': '出差计划', 'other': '其他'}
NEW_LABEL = {'internal_project': '对内·立项跟进', 'internal_complaint': '对内·客诉跟进',
             'internal_test_plan': '对内·测试方案', 'internal_other': '对内·其他（客户需求）',
             'external_visit': '对外·拜访计划', 'external_test_req': '对外·测试需求',
             'external_test_result': '对外·测试结果', 'external_project': '对外·项目进度',
             'external_appointment': '对外·邀约及计划'}

# 语义信号：文本里出现这些词，说明它更像哪一类
SIG = {
    'test':      ['测试', '试测', '送测', '测评', '复测', '上机', '跑板', '验证', '比对', '对标', '数据'],
    'complaint': ['客诉', '投诉', '异常', '故障', '不稳定', '非特异', '杂带', '假阳', '污染',
                  '无扩增', '灵敏度', '冻融', '失效', '退换', '问题现象', '不一致', '波动'],
    'commercial': ['回款', '催款', '逾期', '下单', '订单', '采购', '报价', '价格', '合同', '结算'],
    'internal_ops': ['绩效', '人事', '报销', '培训', '规范', '规则', '流程', '制度', '排期',
                     '生产', '质控', '放行', '备货', '库存', '研发', '质量', '财务'],
    'appointment': ['约', '会议', '拜访', '出差', '行程', '上门', '当面'],
    'project':   ['立项', '推进', '转产', '量产', '注册', '报证', '项目', '走通', '导入'],
}
# 类型 → 期望的语义域
EXPECT = {
    'internal_complaint': 'complaint', 'internal_test_plan': 'test',
    'internal_project': 'project', 'internal_other': None,
    'external_visit': 'appointment', 'external_test_req': 'test',
    'external_test_result': 'test', 'external_project': 'project',
    'external_appointment': 'appointment',
}


def fmt(t):
    return ' '.join((t or '').split())


def main():
    bak = json.load(io.open(BAK, encoding='utf-8'))
    cur = json.load(io.open(os.path.join(ROOT, '数据', 'todos.json'), encoding='utf-8'))

    old = {}
    for u, lst in (bak.get('users') or {}).items():
        for t in (lst or []):
            old[t.get('id')] = (u, t.get('cat'), bool(t.get('done')))
    for t in (bak.get('closed') or []):
        old[t.get('id')] = (t.get('salesperson') or '—', t.get('cat'), True)

    rows = []
    for u, lst in (cur.get('users') or {}).items():
        for t in (lst or []):
            rows.append((u, t))
    for t in (cur.get('closed') or []):
        rows.append((t.get('salesperson') or '—', t))

    out = []
    for i, (owner, t) in enumerate(rows, 1):
        o = old.get(t.get('id'))
        oldcat = (o[1] if o else '?')
        txt = fmt(t.get('text'))
        nt = t.get('type')
        exp = EXPECT.get(nt)
        sc = {k: [w for w in v if w in txt] for k, v in SIG.items()}
        sc = {k: v for k, v in sc.items() if v}
        best = max(sc.items(), key=lambda x: len(x[1]))[0] if sc else None
        suspect = bool(exp and best and best != exp and len(sc[best]) >= 2)
        out.append({'i': i, 'owner': owner, 'id': t.get('id'), 'text': txt,
                    'oldcat': oldcat, 'type': nt, 'scope': t.get('scope'),
                    'done': bool(t.get('done')), 'suspect': suspect,
                    'expect': exp, 'best': best, 'hits': sc, 'src': (t.get('source') or {}).get('kind', '')})

    print('总条数 %d ｜ 旧值命中 %d ｜ 疑似不符 %d\n' % (len(out), sum(1 for r in out if r['oldcat'] != '?'),
                                              sum(1 for r in out if r['suspect'])))
    print('=== 旧类 → 新类 分布 ===')
    c = Counter('%s → %s' % (r['oldcat'], r['type']) for r in out)
    for k, v in c.most_common():
        print('  %-34s %d' % (k, v))

    print('\n=== 疑似不符（需你判定）===')
    for r in out:
        if r['suspect']:
            print('  #%-3d [%s] %s' % (r['i'], r['owner'], r['text'][:78]))
            print('        现:%s(%s) ｜ 信号更像:%s %s' % (r['type'], NEW_LABEL.get(r['type'], ''),
                                                      r['best'], r['hits'][r['best']][:6]))

    print('\n=== 全部 %d 条（供你逐条确认）===' % len(out))
    for r in out:
        print('  #%-3d [%-4s] %-11s→%-22s %s %s' % (
            r['i'], r['owner'], r['oldcat'], r['type'],
            '⚠' if r['suspect'] else ' ', r['text'][:62]))

    io.open('/tmp/p0_diff.json', 'w', encoding='utf-8').write(
        json.dumps({'rows': out, 'old_label': OLD_LABEL, 'new_label': NEW_LABEL}, ensure_ascii=False, indent=1))
    print('\n（明细已存 /tmp/p0_diff.json）')


main()
