#!/usr/bin/env python3
"""
金皇环保 (fjest.com) - 公示信息
https://www.fjest.com/news/10034.html
列表: 分页 ?current=N
详情: /newsInfo/{id}.html
"""
import sys, os, re, time, json, sqlite3
sys.path.insert(0, '/root/gov_crawler')
from crawler_lib import fetch_page, clean_html
import os

SITE_NAME = "金皇环保公示信息"
LIST_URL = "https://www.fjest.com/news/10034.html"
BASE = "https://www.fjest.com"
MAX_PAGES = 5
SEARCH_DB = os.getenv("SEARCH_DB", "/root/search.db")

def insert_to_db(items, label="fjest"):
    """直接写入服务器 /root/search.db（不走 SSH）"""
    if not items:
        print("  ⏭ 无数据")
        return
    db = sqlite3.connect(SEARCH_DB, timeout=60)
    db.execute("PRAGMA journal_mode=WAL")
    db.execute("PRAGMA synchronous=NORMAL")
    ok, skip = 0, 0
    for item in items:
        try:
            db.execute("""INSERT OR IGNORE INTO gov_raw
                (site_name, source_url, page_url, title, publish_date,
                 summary, content, status, category, tags)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", (
                item.get("site_name","")[:200],
                item.get("url",""),
                item.get("url",""),
                (item.get("title") or "")[:500],
                (item.get("pub_date") or "")[:10],
                (item.get("summary") or "")[:500],
                item.get("content",""),
                "active",
                "",
                (item.get("tags") or "")[:100],
            ))
            if db.total_changes > 0:
                ok += 1
            else:
                skip += 1
        except:
            skip += 1
    db.commit()
    # FTS
    db.execute("INSERT INTO gov_search(rowid, title, site_name, summary) SELECT r.id, r.title, r.site_name, r.summary FROM gov_raw r WHERE r.id NOT IN (SELECT rowid FROM gov_search) AND r.site_name=?", (SITE_NAME,))
    db.commit()
    db.close()
    print(f"  💾 入库: 新增{ok}, 跳过{skip}, FTS已同步")

def parse_list(html):
    """提取列表页的 (title, url, date_str)"""
    items = []
    pattern = re.compile(r'<a\s+class="download-list-item[^"]*"[^>]*href="(/newsInfo/\d+\.html)"', re.DOTALL)
    for m in pattern.finditer(html):
        href = BASE + m.group(1)
        link_end = html.find('</a>', m.end())
        link_html = html[m.start():link_end] if link_end > 0 else html[m.start():m.start()+500]
        tm = re.search(r'<h3>(.*?)</h3>', link_html, re.DOTALL)
        title = re.sub(r'<[^>]+>', '', tm.group(1)).strip() if tm else ''
        dm = re.search(r'<b>(\d+)</b>\s*<p>(\d{4}-\d{2})</p>', link_html)
        date_str = f"{dm.group(2)}-{int(dm.group(1)):02d}" if dm else ''
        if title:
            items.append((title, href, date_str))
    return items

def fetch_detail(url):
    """获取详情页的标题、正文、日期"""
    html = fetch_page(url, encoding='utf-8')
    if not html:
        return None, None, None
    title = ""
    m = re.search(r'<h1[^>]*class="title"[^>]*>(.*?)</h1>', html, re.DOTALL)
    if m:
        title = re.sub(r'<[^>]+>', '', m.group(1)).strip()
    pub_date = ""
    m = re.search(r'发布时间：(\d{4}-\d{2}-\d{2})', html)
    if m:
        pub_date = m.group(1)
    content = ""
    m = re.search(r'<div\s+class="news-detail-con"[^>]*>(.*?)</div>', html, re.DOTALL)
    if m:
        content = m.group(1).strip()
        content = re.sub(r'<script[^>]*>.*?</script>', '', content, flags=re.DOTALL|re.I)
        content = re.sub(r'<style[^>]*>.*?</style>', '', content, flags=re.DOTALL|re.I)
        content = re.sub(r'\s*style="[^"]*"', '', content)
        content = clean_html(content)
    return title or None, content or None, pub_date or None

def main():
    print(f"\n{'='*50}\n🏠 {SITE_NAME}\n{'='*50}")
    # 1. 爬列表页
    all_list = []
    for page in range(1, MAX_PAGES + 1):
        url = LIST_URL if page == 1 else f"{LIST_URL}?current={page}"
        print(f"\n📄 第 {page} 页 ({url})...", end=" ", flush=True)
        html = fetch_page(url, encoding='utf-8')
        if not html:
            print("❌ 请求失败")
            break
        items = parse_list(html)
        if not items:
            print("0 条")
            break
        print(f"✅ {len(items)} 条")
        all_list.extend(items)
    print(f"\n📊 列表总计: {len(all_list)} 条")
    if not all_list:
        print("⚠️ 无数据")
        return
    # 2. 爬详情
    all_items, seen = [], set()
    for i, (title, url, date_str) in enumerate(all_list, 1):
        if url in seen:
            continue
        seen.add(url)
        print(f"  [{i}/{len(all_list)}] {title[:50]}...", end=" ", flush=True)
        dt, content, pub_date = fetch_detail(url)
        if dt:
            title = dt
        if pub_date:
            date_str = pub_date
        if date_str and date_str < "2023-01-01":
            print(f"⏭ {date_str}")
            continue
        summary = re.sub(r'<[^>]+>', ' ', content or '').strip()[:300]
        summary = re.sub(r'\s+', ' ', summary)
        all_items.append({
            "site_name": SITE_NAME, "title": title, "url": url,
            "content": content or "", "pub_date": date_str or "",
            "summary": summary, "tags": SITE_NAME,
        })
        print(f"✅ {date_str}")
        time.sleep(0.3)
    # 3. 写入本地 search.db
    if all_items:
        insert_to_db(all_items, "fjest")
    print(f"\n✅ 完成! 共 {len(all_items)} 条")

if __name__ == "__main__":
    t0 = time.time()
    main()
    print(f"⏱ 耗时: {time.time()-t0:.1f}s")
