#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""批量实跑候选脚本，按「它自己怎么说」vs「库实际变没变」分类：

  A 类 静默丢数据：脚本自报 new>0 / Saved 但库内 +0   → FTS 撞车（本 bug），可直接修
  B 类 列表解析失效：脚本自报 found 0 items           → 站点改版/解析器坏，另一类问题
  C 类 真无新内容：脚本自报 0 且库内本就最新           → 正常，非 bug
  D 类 其它/异常

限制：每个脚本最多 90 秒；结果写 /tmp/vclass.tsv。
"""
import re
import sqlite3
import subprocess
import sys

D = "/root/gov_crawler"
CANDS = [l.strip() for l in open("/tmp/cands.txt") if l.strip()]
OUT = "/tmp/vclass.tsv"

c = sqlite3.connect("/root/search.db", timeout=180)
c.execute("PRAGMA busy_timeout=180000")

rows = []
for i, fn in enumerate(CANDS, 1):
    before = c.execute("SELECT COUNT(*), COALESCE(MAX(publish_date),'') FROM gov_raw WHERE script_name=?",
                       (fn,)).fetchone()
    try:
        p = subprocess.run(["python3", fn], cwd=D, capture_output=True, text=True, timeout=90)
        out = ((p.stdout or "") + "\n" + (p.stderr or ""))
        rc = p.returncode
    except subprocess.TimeoutExpired:
        out, rc = "", 124
    after = c.execute("SELECT COUNT(*), COALESCE(MAX(publish_date),'') FROM gov_raw WHERE script_name=?",
                      (fn,)).fetchone()
    delta = after[0] - before[0]

    # 脚本自报的新增数
    claim = 0
    for pat in (r"[\[\(]?DB[\]\)]?\s*new[:：]\s*(\d+)", r"Saved:\s*new=(\d+)",
                r"\bNew[:：]\s*(\d+)", r"新增[：:]\s*(\d+)", r"new=(\d+)"):
        for m in re.finditer(pat, out, re.I):
            try:
                claim = max(claim, int(m.group(1)))
            except Exception:
                pass
    # 列表是否全空
    zero_list = bool(re.search(r"Found 0 items|Total items collected: 0|0 items from \d+ pages|items: 0",
                               out, re.I))

    if rc == 124:
        cls = "D(超时)"
    elif delta > 0:
        cls = "OK(本次补入)"
    elif claim > 0:
        cls = "A(自报%d但库+0 → 静默丢数据)" % claim
    elif zero_list:
        cls = "B(列表解析0条 → 站点改版/解析坏)"
    else:
        cls = "C(自报0且库未变)"
    rows.append((fn, before[0], before[1], delta, claim, cls))
    print("[%3d/%3d] %-42s %s" % (i, len(CANDS), fn, cls), flush=True)

with open(OUT, "w") as f:
    f.write("script\tbefore\tdb_max\tdelta\tclaim\tclass\n")
    for r in rows:
        f.write("\t".join(str(x) for x in r) + "\n")
print()
from collections import Counter
cnt = Counter(r[5].split("(")[0] for r in rows)
print("=== 分类汇总 ===")
for k, v in cnt.most_common():
    print("  %-6s %d 个" % (k, v))
c.close()
