#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""首次调研（近三年）· 时间线 + 里程碑渲染器。

输入：runs/<date>_enriched_first.jsonl
输出：runs/<date>_首次三年版.md
"""
import json
import os
import re
from collections import Counter, defaultdict
from datetime import datetime

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
RUNS = os.path.join(W, '数据/market_intel/runs')
DAY = datetime.now().strftime('%Y%m%d')
data = json.load(open(os.path.join(RUNS, DAY + '_enriched_first.jsonl'), encoding='utf-8'))
# 全量采集（用于年度统计，口径与「三年年度趋势.md」一致）
import re as _re
FULL = [json.loads(l) for l in open(os.path.join(RUNS, DAY + '_items_first.jsonl'), encoding='utf-8') if l.strip()]


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 '日期缺'


_fc = [i for i in FULL if i['来源'].startswith('竞品官网')]
_fu = [i for i in FULL if i['来源'] == '巨潮公告']
items = [i for i in data if isinstance(i.get('要点'), dict) and '错误' not in i['要点']]
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(('全国公共资源交易', '检索源'))]
for g in (comp, cust, bid):
    g.sort(key=lambda x: x.get('日期', ''), reverse=True)

L = []
L.append('# 行业信息 · 首次调研（近三年）· 时间线与里程碑\n')
L.append('> 版本：v0.1 首次调研 ｜ 生成：%s ｜ 窗口：近三年（1095 天）' % datetime.now().strftime('%Y-%m-%d %H:%M'))
L.append('> 提炼条目：**%d** 条（竞品 %d ／ 客户 %d ／ 招投标 %d）｜引擎：DeepSeek ｜ 口径：时间/地点/人物/主体/事件/关键事项/与我方关联\n' % (
    len(items), len(comp), len(cust), len(bid)))
L.append('---\n')


def y(it):
    return (it.get('日期') or '')[:4] or '日期缺'


L.append('## 〇、三年数据概览\n')
L.append('> 口径说明：**年度统计按全量采集条目计算**（共 %d 条），与 `%s_三年年度趋势.md` 完全一致；第二章之后的逐条明细只列**已提炼**的条目。\n' % (len(FULL), DAY))
L.append('| 年份 | 客户公告 | 竞品动态 | 招投标 | 合计 |')
L.append('|---|---|---|---|---|')
_fb = [i for i in FULL if i['来源'].startswith(('全国公共资源', '检索源'))]
years = ['2026', '2025', '2024', '2023', '日期缺']
for yr in years:
    L.append('| %s | %d | %d | %d | %d |' % (
        yr, sum(1 for i in _fu if _yr(i) == yr), sum(1 for i in _fc if _yr(i) == yr),
        sum(1 for i in _fb if _yr(i) == yr), sum(1 for i in FULL if _yr(i) == yr)))
L.append('')
# 客户拿证节奏（按年）
L.append('**客户拿证节奏（按年，标题含「注册证」）**\n')
L.append('| 年份 | 注册证公告 |')
L.append('|---|---|')
for yr in ['2026', '2025', '2024', '2023']:
    L.append('| %s | %d |' % (yr, sum(1 for i in _fu if _yr(i) == yr and '注册证' in i['标题'])))
L.append('')
# 竞品发布节奏（按年）
L.append('**竞品动态节奏（按年 × 品牌）**\n')
L.append('| 品牌 | ' + ' | '.join(years) + ' |')
L.append('|---' * (len(years) + 1) + '|')
for b in dict.fromkeys(i['主体'] for i in comp):
    L.append('| %s | %s |' % (b, ' | '.join(str(sum(1 for i in comp if i['主体'] == b and y(i) == yr)) for yr in years)))
L.append('')
kd = Counter()
for i in cust:
    for k in ('注册证', '批准', '合作', '投资', '中标', '年报', '半年报'):
        if k in i['标题']:
            kd[k] += 1
L.append('**客户侧动作类型**：' + '；'.join('%s %d 条' % (k, v) for k, v in kd.most_common()))
L.append('')

L.append('---\n')
L.append('## 一、竞品里程碑时间线\n')
for brand in dict.fromkeys(i['主体'] for i in comp):
    g = [i for i in comp if i['主体'] == brand]
    L.append('### %s（%d 条）\n' % (brand, len(g)))
    L.append('| 日期 | 事件 | 关键事项 | 与我方关联 |')
    L.append('|---|---|---|---|')
    for it in g[:40]:
        p = it['要点']
        L.append('| %s | %s | %s | %s |' % (
            it.get('日期', '—'), str(p.get('事件', ''))[:60].replace('|', '／'),
            str(p.get('关键事项', ''))[:120].replace('|', '／'), str(p.get('与我方关联', ''))[:80].replace('|', '／')))
    L.append('')

L.append('---\n')
L.append('## 二、客户体系大事记\n')
for nm in dict.fromkeys(i['主体'] for i in cust):
    g = [i for i in cust if i['主体'] == nm]
    L.append('### %s（%d 条）\n' % (nm, len(g)))
    L.append('| 日期 | 事件 | 关键事项 |')
    L.append('|---|---|---|')
    for it in g[:30]:
        p = it['要点']
        L.append('| %s | %s | %s |' % (
            it.get('日期', '—'), str(p.get('事件', it['标题']))[:70].replace('|', '／'),
            str(p.get('关键事项', ''))[:120].replace('|', '／')))
    L.append('')

if bid:
    L.append('---\n')
    L.append('## 三、招投标 / 采购沿革\n')
    for it in bid[:20]:
        p = it['要点']
        L.append('- %s ｜ %s ｜ %s' % (it.get('日期', '—'), str(p.get('事件', it['标题']))[:70],
                                     str(p.get('关键事项', ''))[:90]))
    L.append('')

L.append('---\n')
L.append('## 四、三年观察（自动汇总）\n')
pl = defaultdict(int)
for i in comp:
    for t in i.get('标签', []):
        if t.startswith('产品线:'):
            pl[t.split(':')[1]] += 1
L.append('- 竞品侧产品线信号分布：' + '；'.join('%s %d' % (k, v) for k, v in Counter(pl).most_common(8)))
rel = [i for i in items if '未提及' not in str(i['要点'].get('与我方关联', '未提及')) and i['要点'].get('与我方关联')]
L.append('- 提炼出对我方有关联的条目：**%d 条**' % len(rel))
for i in rel[:10]:
    L.append('  - 【%s｜%s】%s' % (i['主体'][:12], i.get('日期', ''), str(i['要点'].get('与我方关联'))[:70]))
L.append('')
open(os.path.join(RUNS, DAY + '_首次三年版.md'), 'w', encoding='utf-8').write('\n'.join(L))
print('✅ 三年时间线已生成:', DAY + '_首次三年版.md')
print('   条目 %d（竞品 %d ／ 客户 %d ／ 招投标 %d）｜年份: %s' % (len(items), len(comp), len(cust), len(bid), years))
