#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""qc_fts_reconcile2.py —— 对「只删 gov_search」的脚本做 raw vs search 对账"""
import json, os, re, sqlite3
D = "/root/gov_crawler/"
wd = json.load(open(D + "qc_out/qc_delete_wide.json", encoding="utf-8"))
scripts = sorted(set(x[0] for x in wd["live"] if "gov_search" in x[2]))
print("有生效 gov_search 删除的脚本: %d 个" % len(scripts))
db = sqlite3.connect("file:/root/search.db?mode=ro", uri=True, timeout=60)
db.execute("PRAGMA busy_timeout=60000")
tot = miss_tot = 0
bad = []
sites = set()
for f in scripts:
    p = D + f
    if not os.path.exists(p): continue
    src = open(p, encoding="utf-8", errors="ignore").read()
    for m in re.finditer(r"SITE_NAME\s*=\s*[\"\'](.+?)[\"\']", src):
        sites.add(m.group(1))
    for m in re.finditer(r"NAME\s*=\s*[\"\'](.+?)[\"\']", src):
        sites.add(m.group(1))
print("涉及站点名 %d 个，开始对账…" % len(sites))
for site in sorted(sites):
    n = db.execute("SELECT COUNT(*) FROM gov_raw WHERE site_name=?", (site,)).fetchone()[0]
    if not n: continue
    miss = db.execute("SELECT COUNT(*) FROM gov_raw g WHERE g.site_name=? AND NOT EXISTS "
                      "(SELECT 1 FROM gov_search s WHERE s.rowid=g.id)", (site,)).fetchone()[0]
    tot += n; miss_tot += miss
    if miss: bad.append((site, n, miss, "%.0f%%" % (100.0 * miss / n)))
print("\n=== 结果 ===")
print("  对账站点 %d 个 | 原始行 %d | FTS 查不到 %d" % (len([s for s in sites]), tot, miss_tot))
print("  受影响站点: %d 个" % len(bad))
bad.sort(key=lambda x: -x[2])
for s, n, m, pct in bad[:20]:
    print("    %-28s raw=%-6d 缺=%-6d (%s)" % (s[:28], n, m, pct))
json.dump(bad, open(D + "qc_out/qc_fts_missing2.json", "w", encoding="utf-8"), ensure_ascii=False, indent=1)
print("\n已写 qc_out/qc_fts_missing2.json")
