#!/usr/bin/env python3
"""import_jsonl_raw.py - 直接导入 JSONL 到 gov_raw (保留正文 HTML 原样)

不走 import_jsonl_v2 的 strip_html 剥平逻辑 — 正文 content 保持 <p>/<table> 结构,
search_app 检测到 <p>/<table> 就当 HTML 渲染, 表格样式完整保留。

JSONL 字段: page_url(或 url), title, content, publish_date, site_name, attachments(数组或空)
用法: python3 import_jsonl_raw.py <jsonl_path> [site_name] [script_name]
      script_name 缺省: 优先取 JSONL 内 script_name 字段, 再缺省 'import_jsonl_raw'
"""
import json, sqlite3, sys, os

if len(sys.argv) < 2:
    print("Usage: import_jsonl_raw.py <jsonl_path> [site_name] [script_name]")
    sys.exit(1)

jsonl_path = sys.argv[1]
force_site = sys.argv[2] if len(sys.argv) > 2 else ''
force_script = sys.argv[3] if len(sys.argv) > 3 else ''

db_path = os.getenv("SEARCH_DB", "/root/search.db")
db = sqlite3.connect(db_path)
db.execute("PRAGMA journal_mode=WAL")
db.execute("PRAGMA busy_timeout=300000")
db.execute("PRAGMA synchronous=NORMAL")

# 确保 FTS 触发器存在 (直写 gov_raw 自动同步 gov_search)
db.execute("""CREATE VIRTUAL TABLE IF NOT EXISTS gov_search USING fts5(
    title, site_name, summary, tokenize=trigram
)""")
db.execute("""CREATE TRIGGER IF NOT EXISTS trg_gov_raw_fts_ins AFTER INSERT ON gov_raw BEGIN
  INSERT INTO gov_search(rowid, title, site_name, summary)
  VALUES (new.id, new.title, new.site_name, new.summary);
END""")
db.execute("""CREATE TRIGGER IF NOT EXISTS trg_gov_raw_fts_del AFTER DELETE ON gov_raw BEGIN
  DELETE FROM gov_search WHERE rowid = old.id;
END""")
db.execute("""CREATE TRIGGER IF NOT EXISTS trg_gov_raw_fts_upd AFTER UPDATE ON gov_raw BEGIN
  DELETE FROM gov_search WHERE rowid = old.id;
  INSERT INTO gov_search(rowid, title, site_name, summary)
  VALUES (new.id, new.title, new.site_name, new.summary);
END""")
db.commit()

added = 0
errors = 0
with open(jsonl_path, encoding='utf-8') as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        try:
            item = json.loads(line)
            title = (item.get("title") or "")[:500]
            page_url = (item.get("page_url") or item.get("url") or item.get("source_url") or "")[:1000]
            content = (item.get("content") or "").strip()
            publish_date = (item.get("publish_date") or "")[:20]
            site_name = force_site or (item.get("site_name") or "unknown")[:100]
            script_name = force_script or (item.get("script_name") or "import_jsonl_raw")[:100]
            att = item.get("attachments") or []
            attachments_str = json.dumps(att, ensure_ascii=False) if att else ""
            if not page_url or not title:
                errors += 1
                print(f"  [ERR] missing title/url: {line[:100]}")
                continue
            # 覆盖更新 (先删旧行 → 触发器清 FTS → 再插)
            db.execute("DELETE FROM gov_raw WHERE page_url = ?", (page_url,))
            db.execute(
                "INSERT INTO gov_raw (title, page_url, content, publish_date, site_name, source_url, status, attachments, script_name) VALUES (?, ?, ?, ?, ?, ?, 'synced', ?, ?)",
                (title, page_url, content, publish_date, site_name, page_url, attachments_str, script_name)
            )
            added += 1
        except Exception as e:
            errors += 1
            print(f"  [ERR] {e}: {line[:100]}")
db.commit()
db.close()
print(f"✅ 导入完成: +{added} err{errors}")
