#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""refresh_para_rows.py —— 修复受损行（重抓 + UPDATE，绝不 DELETE）

遵守重爬三铁律：
  ① 先建备份表 bak_para_20260924
  ② 绝不 DELETE + 重跑
  ③ 用 UPDATE content WHERE page_url=? 回写
"""
import importlib.util
import json
import re
import sqlite3
import sys

BAK = "bak_para_20260924"
TARGETS = [
    # (script, page_url)
    ("/root/gov_crawler/crawl_yingquan_gggs.py", "https://www.yingquan.gov.cn/Content/show/1343340.html"),
    ("/root/gov_crawler/crawl_yingquan_gggs.py", "https://www.yingquan.gov.cn/Content/show/1343448.html"),
]
# 上面第二个先占位；真正目标从库内按判据筛出来
SITE = "颍泉区人民政府-公告公示"

db = sqlite3.connect("/root/search.db", timeout=60)
db.execute("PRAGMA busy_timeout=60000")
db.execute("PRAGMA journal_mode=WAL")

# ① 备份
n_exist = db.execute("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=?", (BAK,)).fetchone()[0]
if not n_exist:
    db.execute("CREATE TABLE %s AS SELECT id, page_url, title, content, attachments, has_table "
               "FROM gov_raw WHERE site_name=?" % BAK, (SITE,))
    db.commit()
    print("① 已建备份表 %s（%d 行）" % (BAK, db.execute("SELECT COUNT(*) FROM %s" % BAK).fetchone()[0]))
else:
    print("① 备份表已存在，跳过")

# 找受损行
rows = []
for rid, url, title, c in db.execute("SELECT id, page_url, title, content FROM gov_raw WHERE site_name=?", (SITE,)):
    c = c or ""
    segs = [x for x in c.split("\n\n") if x.strip()]
    n_p = len(re.findall(r"<p[ >]", c, re.I))
    if len(segs) >= 3 and n_p < len(segs) * 0.7:
        rows.append((rid, url, title, len(segs), n_p))
print("\n② 待修复 %d 行" % len(rows))

spec = importlib.util.spec_from_file_location("m", "/root/gov_crawler/crawl_yingquan_gggs.py")
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)

for rid, url, title, segs_old, np_old in rows:
    h = m.fetch(url)
    if not h:
        print("  ❌ fetch 失败 %s" % url)
        continue
    r = m.parse_detail(h, url)
    t, d, body, extra = r[0], r[1], r[2], (r[3] if len(r) > 3 else [])
    content, has_table, atts = m.html_to_text(body, url)
    known = set(u for u, _ in atts)
    for u, nm in extra:
        if u in known:
            continue
        known.add(u)
        atts.append((u, nm))
        content += '\n\n<p><a href="%s" target="_blank">%s</a></p>' % (u, nm)
    segs_new = [x for x in content.split("\n\n") if x.strip()]
    np_new = len(re.findall(r"<p[ >]", content, re.I))
    db.execute("UPDATE gov_raw SET content=?, attachments=?, has_table=? WHERE page_url=?",
               (content, json.dumps([{"title": t2, "url": u} for u, t2 in atts], ensure_ascii=False) if atts else "",
                has_table, url))
    db.commit()
    print("  ✅ %s" % (title or "")[:44])
    print("     段 %d→%d | <p> %d→%d | 长度 %d→%d" % (
        segs_old, len(segs_new), np_old, np_new, 0, len(content)))
db.close()
print("\n③ 完成（UPDATE 回写，未删任何行）")
