#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""cleanup_originals_views.py（v2：按边界切片，不手打原文）

按用户既定规矩：**孤儿代码移入 Archive 而不是删除**；数据文件也归档不删。
  · search_app.py 的 _ORIG_VIEWS_DB / _orig_vconn / _orig_views_get / _orig_views_inc
    已无调用方 → 原文切片抽存到 Archive/search_app_orig_views_orphan_20260924.py，再从主文件移除
  · _ORIG_EXTRA_CSS 里无人使用的 .vc{...} 规则 → 一并移除
  · /root/originals_views.db → Archive/originals_views.db.20260924（不删）
保留 _orig_digits / _orig_ext_url / _orig_search_link（外链与选中即搜仍在用）。
"""
import ast
import io
import os
import shutil
import sys

P = "/root/gov_crawler/search_app.py"
ARC = "/root/gov_crawler/Archive"
BAK = os.path.join(ARC, "search_app.py.bak_20260924_cleanup")
ORPHAN = os.path.join(ARC, "search_app_orig_views_orphan_20260924.py")
DBF = "/root/originals_views.db"
DB_ARC = os.path.join(ARC, "originals_views.db.20260924")

src = io.open(P, encoding="utf-8").read()
orig = src
edits = []


def repl(name, old, new, expect=1):
    global src
    n = src.count(old)
    if n != expect:
        edits.append((name, "❌ 命中 %d 次（期望 %d）" % (n, expect)))
        return ''
    src = src.replace(old, new)
    edits.append((name, "✅"))
    return new


# ── 1. 注释改写 + 删 _ORIG_VIEWS_DB 赋值 ─────────────────────────────
repl("1 删 _ORIG_VIEWS_DB",
     "_ORIG_VIEWS_DB = '/root/originals_views.db'\n",
     "# 2026-09-24 晚：原「正文访问计数」相关函数（_orig_vconn / _orig_views_get /\n"
     "# _orig_views_inc，及常量 _ORIG_VIEWS_DB）此后已无任何调用方 —— 用户把访问次数\n"
     "# 改建到 crawler 列表页并复用库内既有的 project_visits。按「孤儿代码移入 Archive」\n"
     "# 规则，这些函数已抽存到 Archive/search_app_orig_views_orphan_20260924.py，\n"
     "# 数据文件 /root/originals_views.db 亦已归档为 Archive/originals_views.db.20260924。\n")

# ── 2. 按函数边界切出孤儿块（用原文，不手打）────────────────────────
A = "def _orig_vconn():"
B = "def _orig_search_link(text, cls=''):"
if src.count(A) == 1 and src.count(B) == 1:
    i = src.index(A)
    j = src.index(B)
    block = src[i:j]
    if ("def _orig_views_get" in block) and ("def _orig_views_inc" in block) and j > i:
        src = src[:i] + src[j:]
        edits.append(("2 切出孤儿函数块", "✅ %d 字符" % len(block)))
    else:
        block = ''
        edits.append(("2 切出孤儿函数块", "❌ 切片内容不符"))
else:
    block = ''
    edits.append(("2 切出孤儿函数块", "❌ 边界不唯一 A=%d B=%d" % (src.count(A), src.count(B))))

# ── 3. 删已无人使用的 .vc{} 规则 ───────────────────────────────────
repl("3 删 .vc CSS",
     """    '.vc{display:inline-flex;align-items:center;font-size:11px;color:#5f6368;'
    'background:#f1f3f4;border-radius:9px;padding:1px 7px}'
""",
     "")

print("=" * 88)
for n, r in edits:
    print("  %-20s %s" % (n, r))
print("=" * 88)
if [n for n, r in edits if not r.startswith("✅")]:
    print("❌ 有步骤失败，未改动任何内容")
    sys.exit(1)

try:
    ast.parse(src)
except SyntaxError as e:
    io.open("/tmp/search_app_cand_cleanup.py", "w", encoding="utf-8").write(src)
    print("❌ 语法错误，未落盘：%s（待检 /tmp/search_app_cand_cleanup.py）" % e)
    sys.exit(1)

os.makedirs(ARC, exist_ok=True)
if os.path.exists(BAK):
    print("（备份已存在，保留首次版本）")
else:
    shutil.copy2(P, BAK)

# 归档孤儿代码：原文原样搬走，保住可回溯性
io.open(ORPHAN, "w", encoding="utf-8").write(
    '#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n'
    '"""归档：search_app.py 中已无调用方的「originals 正文访问计数」函数。\n\n'
    '移除时间：2026-09-24\n'
    '移除原因：用户决定把「正文访问次数」从 /originals/ 改建到 crawler 列表页，并复用\n'
    '          库内既有的 project_visits（session.db，project_type=\'crawler\'），\n'
    '          因此这套独立计数器（originals_views.db）失去调用方。\n'
    '数据文件：同目录 originals_views.db.20260924（归档时含 3 条记录）。\n'
    '恢复方法：把下面内容贴回 search_app.py 的 originals 增强区块，\n'
    '          并把数据文件移回 /root/originals_views.db 即可。\n"""\n'
    'import sqlite3\n\n'
    "_ORIG_VIEWS_DB = '/root/originals_views.db'\n\n\n" + block)

if os.path.exists(DBF):
    shutil.move(DBF, DB_ARC)
    db_note = "✅ -> " + DB_ARC
else:
    db_note = "— 不存在，跳过"

io.open(P, "w", encoding="utf-8").write(src)
print("✅ 已写入  备份 %s" % BAK)
print("   行数 %d → %d" % (orig.count("\n") + 1, src.count("\n") + 1))
print("   归档代码 %s (%d 字节)" % (ORPHAN, os.path.getsize(ORPHAN)))
print("   归档数据 %s" % db_note)
