#!/home/ubuntu/project/we-mp-rss-main/venv/bin/python3
"""热点雷达 — 纯脚本 (no_agent=true)
检测最近 3h 不同公众号是否在同追一个热点。有热点输出告警，无热点静默。

用法: python3 hot_radar.py [hours=3]
"""

import sqlite3, json, sys, os, re
from datetime import datetime, timezone, timedelta
from collections import defaultdict

HOURS = int(sys.argv[1]) if len(sys.argv) > 1 else 3
DB_PATH = "/home/ubuntu/project/we-mp-rss-data/db.db"
SENT_PATH = os.path.expanduser("~/project/state/hot_radar_sent.json")
beijing = timezone(timedelta(hours=8))
now = datetime.now(beijing)
cutoff_ts = int((now - timedelta(hours=HOURS)).timestamp())

# ── 1. 查询最近文章 ──
try:
    db = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True)
    db.row_factory = sqlite3.Row
    rows = db.execute("""
        SELECT a.id, a.title, a.url, a.publish_time, f.mp_name
        FROM articles a JOIN feeds f ON a.mp_id = f.id
        WHERE a.publish_time > ?
        ORDER BY a.publish_time DESC
    """, (cutoff_ts,)).fetchall()
    db.close()
except Exception as e:
    print(f"DB_ERROR: {e}")
    sys.exit(1)

if len(rows) < 2:
    sys.exit(0)  # 不足2篇 → 静默

articles = [dict(r) for r in rows]

# ── 2. 加载已推送记录 ──
sent_ids = set()
try:
    with open(SENT_PATH) as f:
        sent_data = json.load(f)
        sent_ids = set(sent_data.get("sent_ids", []))
except Exception:
    sent_data = {"sent_ids": []}

# ── 3. 主题词库匹配 ──
TOPIC_PATTERNS = {
    "分数线|投档|录取分|省控线": "分数线/投档",
    "排名|排行|登顶|第.*名": "院校排名",
    "职业本科|本科.*扩容|升格": "职业本科政策",
    "真题|试卷|备考|复习|教材|刷题": "备考干货",
    "报名|报考|自行.*报|应届生.*材料": "报名指南",
    "计算机.*等级|技能.*课程|证书.*报名|证书.*要求|护士.*证": "证书考试",
    "录取.*通知书|寄出": "录取通知书",
    "中考|分数.*公布|成绩.*公布": "中考放榜",
    "英语|语文|数学.*复习|名词|句式|语法": "语数英技巧",
    "停招|招生.*名单|不在名单": "中职招生变化",
    "暑假|暑期": "暑期规划",
    "上岸|逆袭|考上|升本": "升学逆袭",
    "宿舍|校区|投入.*使用|新.*校": "高校硬件",
    "新生.*开学|报到": "新生入学",
    "学费|公办.*民办|费用": "学费择校",
    "专业.*介绍|专业.*就业": "专业解读",
}

def get_topic(title):
    """返回文章的主题标签"""
    for pattern, tag in TOPIC_PATTERNS.items():
        if re.search(pattern, title):
            return tag
    return None

# 为每篇文章打标签
for a in articles:
    a["_topic"] = get_topic(a["title"])

# ── 4. 跨源对比（按主题标签） ──
source_articles = defaultdict(list)
for a in articles:
    if a["_topic"]:  # 只参与有主题标签的文章
        source_articles[a["mp_name"]].append(a)

sources = list(source_articles.keys())
if len(sources) < 2:
    sys.exit(0)

# 按主题分组
topic_groups = defaultdict(lambda: defaultdict(list))
for a in articles:
    if a["_topic"]:
        topic_groups[a["_topic"]][a["mp_name"]].append(a)

hot_topics = []
seen_pairs = set()

for topic, src_map in topic_groups.items():
    src_list = list(src_map.keys())
    if len(src_list) < 2:
        continue  # 只有一个源覆盖 → 不算热点
    for i, src_a in enumerate(src_list):
        for src_b in src_list[i+1:]:
            for a in src_map[src_a]:
                if a["id"] in sent_ids:
                    continue
                for b in src_map[src_b]:
                    if b["id"] in sent_ids:
                        continue
                    pair_key = tuple(sorted([a["id"], b["id"]]))
                    if pair_key not in seen_pairs:
                        seen_pairs.add(pair_key)
                        hot_topics.append({
                            "topic": topic,
                            "articles": [a, b],
                        })

if not hot_topics:
    sys.exit(0)  # 无热点 → 静默

# ── 5. 输出告警 ──
pt = lambda ts: datetime.fromtimestamp(ts, beijing).strftime("%m-%d %H:%M")
new_sent = set()

lines = ["## 🚨 热点预警", ""]
for i, topic in enumerate(hot_topics[:3], 1):
    lines.append(f"**热点{i}：{topic['topic']}**  ")
    lines.append(f"> 不同公众号同步追踪")
    for a in topic["articles"]:
        lines.append(f"> [{a['mp_name']}] [{a['title'][:50]}]({a['url']})")
        new_sent.add(a["id"])
    lines.append("")

lines.append(f"> 🤖 自动检测 · {now.strftime('%m-%d %H:%M')}")

# ── 6. 更新已推送记录 ──
sent_ids.update(new_sent)
sent_data["sent_ids"] = list(sent_ids)
os.makedirs(os.path.dirname(SENT_PATH), exist_ok=True)
with open(SENT_PATH, "w") as f:
    json.dump(sent_data, f)

print("\n".join(lines))
