#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""复核 MiniMax 第二轮交付（映射表 / 去重表 / 关键词表）。"""
import csv
import json
import re
from collections import Counter

D = ('/Users/liuxinyuan/Desktop/Minimax工作区/客户满意度2026/'
     '行业信息推送_M1-M5_2026-10-13')

ALLOWED = {'分子诊断-核酸检测（PCR/qPCR）', '分子诊断-测序（NGS/tNGS/mNGS）',
           '分子诊断-恒温扩增（LAMP/RPA）', '分子POCT', '化学发光/免疫诊断',
           '血凝/生化', 'ICL 第三方检验', '科研试剂/生命科学工具', '原料与 CDMO',
           '动物诊断', '司法/海关检测'}

print('══ ① 映射表 client_track_map_liu.csv ══')
rows = list(csv.reader(open(D + '/client_track_map_liu.csv', encoding='utf-8-sig')))
hdr, data = rows[0], rows[1:]
print('  数据行:', len(data))
bad_track, no_url, kw_bad, tbd = [], [], [], []
urls = set()
for r in data:
    idx, name = r[0], r[1]
    track, kw, u = r[3], r[6], r[7]
    for t in re.split(r'[；;]', track):
        t = t.strip()
        if t and t not in ALLOWED:
            bad_track.append((idx, t))
    if not u.strip() or '待确认' in u:
        no_url.append(idx)
    if not (2 <= len(re.split(r'[；;]', kw)) <= 7):
        kw_bad.append((idx, len(re.split(r'[；;]', kw))))
    if '待确认' in ' '.join(r):
        tbd.append(idx)
    for m in re.findall(r'https?://[^\s|]+', u):
        urls.add(m.rstrip('|,'))
print('  赛道越界:', bad_track or '无 ✅')
print('  缺 URL 行:', no_url or '无 ✅')
print('  关键词数量异常:', kw_bad or '无 ✅')
print('  含「待确认」的行:', tbd)
print('  唯一来源 URL 数:', len(urls))
print()
print('  第 12 行（它说已修正）:')
r12 = [r for r in data if r[0] == '12'][0]
print('    关联上市主体列 →', r12[2][:90])
print('    赛道 →', r12[3][:60], '｜ 对标 →', r12[5][:40])
print('    来源 →', r12[7][:80])

print()
print('══ ② 去重表 client_group_dedup.csv ══')
g = list(csv.reader(open(D + '/client_group_dedup.csv', encoding='utf-8-sig')))
print('  表头:', g[0])
print('  行数:', len(g) - 1)
merged = sum(int(x[4]) for x in g[1:] if x[4].isdigit())
print('  合并后客户数合计:', merged, '（应 = 20）')
for x in g[1:]:
    if len(x[3].split('/')) > 1:
        print('  · 合并组 %s %s ← 行 %s（%d 家）理由: %s' % (x[0], x[1], x[3], int(x[4]) if x[4].isdigit() else 0, x[8][:60]))

print()
print('══ ③ 关键词表 daily_push_keywords.csv ══')
k = list(csv.reader(open(D + '/daily_push_keywords.csv', encoding='utf-8-sig')))
kh, kd = k[0], k[1:]
print('  数据行:', len(kd), '（交付方声称 1814）', '✅ 一致' if len(kd) == 1814 else '❌ 不一致，差 %d' % (len(kd) - 1814))
print('  按主体类型:', dict(Counter(x[0] for x in kd)))
print('  按动态类型:', dict(Counter(x[3] for x in kd).most_common()))
cust_rows = [x for x in kd if x[0] == '客户']
print('  客户行数:', len(cust_rows), '（声称 1084）')
print('  客户覆盖主体数:', len(set(x[2] for x in cust_rows)))
print('  客户集团数:', len(set(x[1] for x in cust_rows if x[1] != '—')))
comps = set(x[2] for x in kd if x[0] == '竞品')
print('  竞品主体:', sorted(comps))

json.dump(sorted(urls), open('/tmp/map_urls.json', 'w'), ensure_ascii=False, indent=1)
print()
print('→ 27 条来源 URL 已导出 /tmp/map_urls.json 供复测')
