#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# fix_crawler_route.py — /crawler(handle_db_list) 也应用 -词 排除
import ast, os, re, shutil
D = '/root/gov_crawler/'
p = D + 'search_app.py'
src = open(p, encoding='utf-8').read()
lines = src.split('\n')

# 1) 定位 handle_db_list 函数体范围
m = re.search(r'^    def handle_db_list\(self, db_type, params\):', src, re.M)
if not m:
    print('WARN 未找到 handle_db_list')
    raise SystemExit(0)
start = src[:m.end()].count('\n')            # 0-based 行号（def 那行）
end = len(lines)
for i in range(start + 1, len(lines)):
    if re.match(r'^    def |^    @|^class ', lines[i]):
        end = i
        break
print('handle_db_list 范围: L%d - L%d' % (start + 1, end))

# 2) 入口归一化：插到 q3 赋值之后
ins_at = None
for i in range(start + 1, min(start + 40, end)):
    if re.match(r"^        q3\s*=", lines[i]):
        ins_at = i
        break
if ins_at is None:
    print('WARN 未找到 q3 赋值行')
else:
    ind = ' ' * 8
    block = [
        '# QC20261008 (/crawler) 入口归一化：-词 只作排除用，不参与检索',
        'try:',
        '    self._orig_q = q',
        '    _qi, _qe = parse_google_query((q or "").strip())',
        '    if _qe and _qi:',
        '        q = " ".join(_qi)',
        'except Exception:',
        '    pass',
    ]
    lines = lines[:ins_at + 1] + [ind + x if x.strip() else x for x in block] + lines[ins_at + 1:]
    print('已插入入口归一化（L%d 之后）' % (ins_at + 1))
    end += len(block)

# 3) 该 handler 内所有 return rows, total, has_more 之前插入渲染前过滤
FILTER = [
    '# QC20261008 (/crawler) 排除词过滤（渲染前，只排标题）',
    'try:',
    '    _ei, _ee = parse_google_query((getattr(self, "_orig_q", None) or q) or "")',
    '    if _ee and rows:',
    '        _bk = len(rows)',
    '        def _ttl(_r):',
    '            try:',
    '                return (_r.get("title") if isinstance(_r, dict) else _r["title"]) or ""',
    '            except Exception:',
    '                return ""',
    '        rows = [_r for _r in rows if not any(_t in _ttl(_r) for _t in _ee)]',
    '        if len(rows) != _bk:',
    '            try:',
    '                total = max(0, int(total or 0) - (_bk - len(rows)))',
    '            except Exception:',
    '                pass',
    'except Exception:',
    '    pass',
]
pat = re.compile(r'^(\s*)return rows, total, has_more\s*$')
idx = [i for i in range(start, end) if pat.match(lines[i])]
print('handler 内返回点:', [i + 1 for i in idx])
new, prev, cnt = [], 0, 0
for i in idx:
    ind = pat.match(lines[i]).group(1)
    new.extend(lines[prev:i])
    new.extend([(ind + x) if x.strip() else x for x in FILTER])
    new.append(lines[i])
    prev = i + 1
    cnt += 1
new.extend(lines[prev:])
src2 = '\n'.join(new)
try:
    ast.parse(src2)
except SyntaxError as e:
    print('语法错，未落盘:', e)
    raise SystemExit(1)
b = D + 'Archive/search_app.py.bak_20261008_crawlerroute'
if not os.path.exists(b):
    shutil.copy2(p, b)
open(p, 'w', encoding='utf-8').write(src2)
print('OK 已在 handle_db_list 插入 %d 处过滤（备份 search_app.py.bak_20261008_crawlerroute）' % cnt)
