#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""验收 MiniMax M1/M2/M4 交付：结构校验 + 抽样生成（供独立 HTTP 复测）。"""
import csv
import json
import os
import random
import re
from collections import Counter

D = ('/Users/liuxinyuan/Desktop/Minimax工作区/客户满意度2026/'
     '行业信息推送_M1-M5_2026-10-13')
OUT = os.path.expanduser('~/.hermes/profiles/zone-b/cache/scratch/mm/verify')

m1 = json.load(open(os.path.join(D, 'm1_competitor_sources.json'), encoding='utf-8'))
m2 = json.load(open(os.path.join(D, 'm2_public_sources.json'), encoding='utf-8'))
m4 = json.load(open(os.path.join(D, 'm4_event_rules.json'), encoding='utf-8'))
rows = list(csv.reader(open(os.path.join(D, 'm3_keyword_matrix.csv'), encoding='utf-8')))

print('=== ① 结构 ===')
print('  m1 类型:', type(m1).__name__)
if isinstance(m1, dict):
    print('  m1 键:', list(m1.keys())[:6])
    items = m1.get('品牌') or m1.get('items') or m1
else:
    items = m1

def flat_urls(o, acc):
    if isinstance(o, dict):
        for k, v in o.items():
            if isinstance(v, str) and v.startswith('http'):
                acc.append((k, v))
            else:
                flat_urls(v, acc)
    elif isinstance(o, list):
        for v in o:
            flat_urls(v, acc)

u1, u2 = [], []
flat_urls(m1, u1)
flat_urls(m2, u2)
print('  m1 含 URL 字段数:', len(u1), '｜ m2 含 URL 字段数:', len(u2))
print('  m3 行数(含表头):', len(rows), '｜ 表头:', rows[0])

# 每家竞品的源数量
def count_sources(m1):
    out = {}
    brands = m1 if isinstance(m1, list) else (m1.get('品牌') or m1.get('品牌清单') or m1.get('competitors'))
    if isinstance(brands, list):
        for b in brands:
            nm = b.get('品牌') or b.get('name') or '?'
            src = b.get('源') or b.get('sources') or []
            out[nm] = len(src)
    elif isinstance(brands, dict):
        for nm, b in brands.items():
            src = b.get('源') if isinstance(b, dict) else b
            out[nm] = len(src) if isinstance(src, list) else 0
    return out

cs = count_sources(m1)
print('  每家源数:', cs, '｜ 合计', sum(cs.values()) if cs else '?')

print()
print('=== ② m4 规则 ===')
rules = m4 if isinstance(m4, list) else (m4.get('规则') or m4.get('rules') or list(m4.values())[0])
print('  规则数:', len(rules) if isinstance(rules, list) else '?')
if isinstance(rules, list):
    for r in rules[:5]:
        nm = r.get('类型') or r.get('动态类型') or r.get('name')
        pos = r.get('正例') or r.get('positive') or []
        neg = r.get('负例') or r.get('negative') or []
        print('   · %-12s 正例 %d 负例 %d' % (str(nm)[:12], len(pos), len(neg)))

print()
print('=== ③ 状态码分布（自述）===')
codes = Counter()
for _, u in u1 + u2:
    codes['URL'] += 1
blob = json.dumps({'m1': m1, 'm2': m2}, ensure_ascii=False)
for m in re.finditer(r'"(?:实测状态码|status|状态码)"\s*:\s*(\d+)', blob):
    codes[m.group(1)] += 1
print(' ', dict(codes.most_common(8)))

# 抽样：优先抽查声称 200 的（因为一条错=整批退）
def collect_claims(o, acc, path=''):
    if isinstance(o, dict):
        code = None
        for k in ('实测状态码', 'status', '状态码'):
            if k in o:
                try:
                    code = int(o[k])
                except Exception:
                    code = None
        url = next((v for k, v in o.items() if isinstance(v, str) and v.startswith('http')), None)
        if not url:
            for k, v in o.items():
                if isinstance(v, str) and v.startswith('http'):
                    url = v
                    break
        if url:
            acc.append({'url': url, 'claimed': code, 'path': path})
        for k, v in o.items():
            collect_claims(v, acc, path + '/' + str(k))
    elif isinstance(o, list):
        for i, v in enumerate(o):
            collect_claims(v, acc, path + '[%d]' % i)

claims = []
collect_claims(m1, claims)
collect_claims(m2, claims)
print()
print('=== ④ 可复测条目 ===', len(claims))
os.makedirs(OUT, exist_ok=True)
json.dump(claims, open(os.path.join(OUT, 'claims.json'), 'w', encoding='utf-8'), ensure_ascii=False, indent=1)

random.seed(13)
n200 = [c for c in claims if c['claimed'] == 200]
n_other = [c for c in claims if c['claimed'] != 200]
sample = random.sample(n200, min(22, len(n200))) + random.sample(n_other, min(6, len(n_other)))
# 再钉几个关键主张
must = ['cninfo.com.cn', 'ggzy.gov.cn', 'takara.co.jp', 'bio.vazyme.com', 'meridianbioscience',
        'nmpa.gov.cn', 'roche.com', 'transgen.com']
for m in must:
    for c in claims:
        if m in c['url'] and c not in sample:
            sample.append(c)
            break
json.dump(sample, open(os.path.join(OUT, 'sample.json'), 'w', encoding='utf-8'), ensure_ascii=False, indent=1)
print('   抽样（含关键主张）:', len(sample), '条 →', os.path.join(OUT, 'sample.json'))
for c in sample[:8]:
    print('    [%s] %s' % (c['claimed'], c['url'][:96]))
