#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""三年年度趋势（确定性统计，不经 LLM）：按标题+日期算。

输入：runs/20261013_items_first.jsonl（全量采集）
      runs/20261013_enriched_first.jsonl（已提炼子集，用于算增量）
输出：runs/20261013_三年年度趋势.md + runs/20261013_delta.json
"""
import json
import os
import re
from collections import Counter, defaultdict

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
RUNS = os.path.join(W, '数据/market_intel/runs')
DAY = '20261013'
items = [json.loads(l) for l in open(os.path.join(RUNS, DAY + '_items_first.jsonl'), encoding='utf-8') if l.strip()]
enr = json.load(open(os.path.join(RUNS, DAY + '_enriched_first.jsonl'), encoding='utf-8'))
done = {i['链接'] for i in enr}


def yr(i):
    m = re.search(r'20\d{2}-\d{2}-\d{2}', i.get('日期', '') or '')
    if m:
        return m.group(0)[:4]
    m = re.search(r'(20\d{2})[/年]', i.get('日期', '') or '')
    return m.group(1) if m else '日期缺'


comp = [i for i in items if i['来源'].startswith('竞品官网')]
cust = [i for i in items if i['来源'] == '巨潮公告']
bid = [i for i in items if i['来源'].startswith(('全国公共资源', '检索源'))]
BIZ = re.compile(r'注册证|批准|中标|合同|产能|专利|临床|GMP|收购|增资|投资|业绩|年报|半年报|季度|新品|上市|合作|签约|扩产|获证|CE|FDA|IVDR')
cust_biz = [i for i in cust if BIZ.search(i['标题'])]

L = []
L.append('# 三年年度趋势（确定性统计 · 按标题+日期）\n')
L.append('> 数据源：全量采集 %d 条（巨潮 %d ／ 竞品 %d ／ 招投标 %d）｜窗口：2023-10-14 起（近三年）' % (
    len(items), len(cust), len(comp), len(bid)))
L.append('> 口径：按公告/新闻的**发布年份**归集，标题关键词判定类型；不经模型，可逐条复查\n')
L.append('---\n')
years = ['2026', '2025', '2024', '2023', '日期缺']

L.append('## 一、逐年条目量\n')
L.append('| 年份 | 客户公告 | 竞品动态 | 招投标 | 合计 |')
L.append('|---|---|---|---|---|')
for y in years:
    L.append('| %s | %d | %d | %d | %d |' % (
        y, sum(1 for i in cust if yr(i) == y), sum(1 for i in comp if yr(i) == y),
        sum(1 for i in bid if yr(i) == y), sum(1 for i in items if yr(i) == y)))
L.append('')

L.append('## 二、客户拿证节奏（标题含「注册证」）\n')
L.append('| 年份 | 注册证公告数 | 涉及客户数 |')
L.append('|---|---|---|')
for y in years:
    g = [i for i in cust if yr(i) == y and '注册证' in i['标题']]
    L.append('| %s | %d | %d |' % (y, len(g), len(set(i['主体'] for i in g))))
L.append('')
L.append('**按客户分布（前 8）**：' + '；'.join(
    '%s %d 条' % (k, v) for k, v in Counter(i['主体'] for i in cust if '注册证' in i['标题']).most_common(8)))
L.append('')

L.append('## 三、客户侧动作结构（全窗口，按标题关键词）\n')
kd = Counter()
for i in cust:
    for k in ('注册证', '批准', '合作', '投资', '中标', '增资', '收购', '年报', '半年报', '业绩', '专利'):
        if k in i['标题']:
            kd[k] += 1
L.append('| 类型 | 条数 |')
L.append('|---|---|')
for k, v in kd.most_common():
    L.append('| %s | %d |' % (k, v))
L.append('')

L.append('## 四、竞品发布节奏（年 × 品牌）\n')
brands = list(dict.fromkeys(i['主体'] for i in comp))
L.append('| 品牌 | ' + ' | '.join(years) + ' |')
L.append('|---' * (len(years) + 1) + '|')
for b in brands:
    L.append('| %s | %s |' % (b, ' | '.join(
        str(sum(1 for i in comp if i['主体'] == b and yr(i) == y)) for y in years)))
L.append('')

L.append('## 五、提炼增量（本次重采新增，需补提炼）\n')
delta_comp = [i for i in comp if i['链接'] not in done]
delta_cust = [i for i in cust_biz if i['链接'] not in done]
L.append('- 竞品新增：%d 条' % len(delta_comp))
L.append('- 客户业务相关新增：%d 条（全窗口业务相关合计 %d 条）' % (len(delta_cust), len(cust_biz)))
L.append('- 待提炼合计：**%d 条**' % (len(delta_comp) + len(delta_cust)))
L.append('')
open(os.path.join(RUNS, DAY + '_三年年度趋势.md'), 'w', encoding='utf-8').write('\n'.join(L))
json.dump({'comp': delta_comp + delta_cust}, open(os.path.join(RUNS, DAY + '_delta.json'), 'w', encoding='utf-8'),
          ensure_ascii=False, indent=1)

print('\n'.join(L[:44]))
print('...')
print('\n→ 趋势文件:', DAY + '_三年年度趋势.md')
print('   待补提炼:', len(delta_comp) + len(delta_cust), '条（竞品 %d + 客户业务相关 %d）' % (len(delta_comp), len(delta_cust)))
