#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""高价值精选：按评分模型从已提炼条目里选出高价值信息，并渲染完整细节。

评分（v0.1 提案，确定性规则）：
  需求信号  注册证 +5 ｜ 中标/合同 +4 ｜ 产品获批 +3 ｜ 投资/增资/收购/合作/扩产 +2
  经营风险  亏损/减值/业绩/集采降价 +2
  竞争威胁  竞品 × 产品线标签命中（冻干/无甘油/预混/多重/LAMP/POCT/酶/引物） +5 ｜ 竞品新品发布 +3
  战略层    竞品战略合作/融资 +2 ｜ 人事变动（总裁/CEO/任命/辞任） +2
  关联性    与我方关联非「无直接关联」 +3 ｜ 每个产品线标签 +1
  时效性    近 30 天 +2 ｜ 近 90 天 +1
分档：S ≥ 10 ｜ A 7–9 ｜ B 4–6（B 以下不进精选）

输出：runs/<date>_高价值精选.md
"""
import json
import os
import re
from datetime import datetime, timedelta

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
RUNS = os.path.join(W, '数据/market_intel/runs')
DAY = '20261013'
data = json.load(open(os.path.join(RUNS, DAY + '_enriched_first.jsonl'), encoding='utf-8'))
items = [i for i in data if isinstance(i.get('要点'), dict) and '错误' not in i['要点']]
NOW = datetime.now()
REC30 = (NOW - timedelta(days=30)).strftime('%Y-%m-%d')
REC90 = (NOW - timedelta(days=90)).strftime('%Y-%m-%d')
PL = re.compile(r'冻干|无甘油|glycerol|Lyo|全预混|直扩|多重|熔解曲线|LAMP|恒温|RNA|逆转录|RT-qPCR|聚合酶|Taq|UNG|POCT|提取')

ACTION = [
    (r'注册证', '技术对接 + 送样：按证号产品线匹配我方酶/预混液，7 日内出选型建议', '技术支持部 · 客户对应销售'),
    (r'中标|成交', '投标跟进：核实招标参数与我方货号适配度，评估投标或配套供应', '销售拓展部 · 招投标专员'),
    (r'收购|增资|投资|合作|签约|协议', '情报跟踪：判断资本动作是否牵动诊断板块采购策略，纳入下次拜访议题', '大客户部 · 客户经理'),
    (r'亏损|减值|业绩|下降|商誉', '信用复核：调取财报明细，评估账期与信用额度风险', '营销中心 · 财务对接人'),
    (r'总裁|CEO|任命|辞任|换帅', '关系维护：新任负责人背景摸底，安排礼节性拜访', '大客户部'),
    (r'冻干|无甘油|Lyo|glycerol', '竞品对标：更新可冻干原料参数对比表，检查我方 FM/FMD 差异化话术', '市场部 · 产品线负责人'),
    (r'预混液|全预混|多重|熔解曲线|LAMP', '竞品对标：按品类更新对标表，准备「同等性能-成本优势」论证材料', '市场部'),
    (r'新品|发布|上市|推出', '竞品跟踪：纳入月度竞品动态，评估是否需要 PK 实验', '市场部 · 技术支持部'),
]


def score(i):
    t, p = i['标题'], i['要点']
    tags = i.get('标签', [])
    s, why = 0, []
    if '注册证' in t:
        s += 5; why.append('客户拿证')
    if re.search(r'中标|成交|合同', t):
        s += 4; why.append('客户中标/合同')
    if re.search(r'获得.*批准|获批|批准通知书', t):
        s += 3; why.append('产品获批')
    if re.search(r'投资|增资|收购|合作|协议|扩产', t):
        s += 2; why.append('客户资本/合作动作')
    if re.search(r'亏损|减值|业绩|集采|下降', t):
        s += 2; why.append('客户经营/价格风险')
    is_comp = i['来源'].startswith('竞品官网')
    pltags = [x for x in tags if x.startswith('产品线:')]
    if is_comp and pltags:
        s += 5; why.append('竞品命中我方赛道（%s）' % '、'.join(x.split(':')[1] for x in pltags[:3]))
    if is_comp and re.search(r'新品|发布|上市|推出', t):
        s += 3; why.append('竞品新品')
    if is_comp and re.search(r'战略合作|签约|融资|并购', t):
        s += 2; why.append('竞品战略动作')
    if re.search(r'总裁|CEO|任命|辞任|董事长', t):
        s += 2; why.append('人事变动')
    rel = str(p.get('与我方关联', ''))
    if rel and rel != '无直接关联':
        s += 3; why.append('与我方有关联')
    s += len(pltags)
    d = (i.get('日期') or '')[:10]
    if d >= REC30:
        s += 2
    elif d >= REC90:
        s += 1
    return s, why


rows = []
for i in items:
    s, why = score(i)
    i['_s'], i['_why'] = s, why
    if s >= 4:
        rows.append(i)
# 排序：分数降序 → 日期降序（同分新的在前）
rows.sort(key=lambda x: x.get('日期', ''), reverse=True)
rows.sort(key=lambda x: -x['_s'])
# 时效闸门：非近 90 天的条目不得进 S 档（避免"陈年专利"挤占行动位）


def gate(i):
    d = (i.get('日期') or '')[:10]
    if i['_s'] >= 9 and d < REC90:
        i['_s'] = min(i['_s'], 6)
        i['_why'].append('（时效外：降档）')


for i in rows:
    gate(i)
rows.sort(key=lambda x: x.get('日期', ''), reverse=True)
rows.sort(key=lambda x: -x['_s'])

L = []
L.append('# 高价值信息精选 · %s\n' % DAY)
L.append('> 来源：近三年存量（已提炼 %d 条）｜评分：v0.1 提案（S≥10 / A 7-9 / B 4-6）' % len(items))
L.append('> 分档分布：S %d ｜ A %d ｜ B %d ｜ 合计 %d\n' % (
    sum(1 for i in rows if i['_s'] >= 10), sum(1 for i in rows if 7 <= i['_s'] < 10),
    sum(1 for i in rows if 4 <= i['_s'] < 7), len(rows)))
L.append('---\n')
L.append('## 一、S 档：需本周内动作\n')
for n, i in enumerate([x for x in rows if x['_s'] >= 10][:30], 1):
    p = i['要点']
    act = next((a for pat, a, _ in ACTION if re.search(pat, i['标题'])), '情报归档：纳入季度行业分析')
    own = next((o for pat, _, o in ACTION if re.search(pat, i['标题'])), '市场部')
    L.append('### S%d. [%d分] %s' % (n, i['_s'], i['标题'][:100]))
    L.append('')
    L.append('**来源**：%s ｜ **日期**：%s ｜ **原文**：%s' % (i['来源'], i.get('日期', '—'), i['链接']))
    L.append('')
    L.append('| 维度 | 内容 |')
    L.append('|---|---|')
    L.append('| 时间 | %s |' % p.get('时间', '未提及'))
    L.append('| 地点 | %s |' % p.get('地点', '未提及'))
    L.append('| 人物 | %s |' % p.get('人物', '未提及'))
    L.append('| 主体 | %s |' % p.get('主体', '未提及'))
    L.append('| **事件** | **%s** |' % p.get('事件', '未提及'))
    L.append('| 关键事项 | %s |' % p.get('关键事项', '未提及'))
    L.append('| 与我方关联 | %s |' % p.get('与我方关联', '未提及'))
    L.append('| 评分理由 | %s |' % '；'.join(i['_why']))
    L.append('| **建议动作** | **%s** |' % act)
    L.append('| 建议主责 | %s |' % own)
    L.append('')
L.append('---\n')
L.append('## 二、A 档：近期情报（建议 30 天内跟进）\n')
for n, i in enumerate([x for x in rows if 7 <= x['_s'] < 10][:40], 1):
    p_ = i['要点']
    act = next((a for pat, a, _ in ACTION if re.search(pat, i['标题'])), '情报归档：纳入季度行业分析')
    own = next((o for pat, _, o in ACTION if re.search(pat, i['标题'])), '市场部')
    L.append('### A%d. [%d分] %s' % (n, i['_s'], i['标题'][:100]))
    L.append('- **%s** ｜ %s' % (i.get('日期', '—'), i['来源']))
    L.append('- 事件：%s' % str(p_.get('事件', ''))[:90])
    L.append('- 关键事项：%s' % str(p_.get('关键事项', ''))[:180])
    L.append('- 关联：%s' % str(p_.get('与我方关联', ''))[:120])
    L.append('- 建议动作（%s）：%s' % (own, act))
    L.append('- 原文：%s\n' % i['链接'])
L.append('---\n')
L.append('## 三、B 档：存量索引（%d 条，供检索）\n' % sum(1 for x in rows if 4 <= x['_s'] < 7))
L.append('| 分 | 日期 | 主体 | 标题 | 命中理由 |')
L.append('|---|---|---|---|---|')
for i in [x for x in rows if 4 <= x['_s'] < 7][:200]:
    L.append('| %d | %s | %s | %s | %s |' % (
        i['_s'], (i.get('日期') or '—')[:10], i['主体'][:14], i['标题'][:56], '；'.join(i['_why'])[:40]))
L.append('')
open(os.path.join(RUNS, DAY + '_高价值精选.md'), 'w', encoding='utf-8').write('\n'.join(L))
print('✅ 高价值精选已生成')
print('   S %d ｜ A %d ｜ B %d ｜ 合计 %d' % (
    sum(1 for i in rows if i['_s'] >= 10), sum(1 for i in rows if 7 <= i['_s'] < 10),
    sum(1 for i in rows if 4 <= i['_s'] < 7), len(rows)))
print()
print('=== S 档 TOP 12（分数｜主体｜日期｜标题）===')
for i in [x for x in rows if x['_s'] >= 10][:12]:
    print('  %2d分 ｜ %-14s ｜ %s ｜ %s' % (i['_s'], i['主体'][:14], (i.get('日期') or '')[:10], i['标题'][:60]))
