#!/usr/bin/env python3
"""
广安市人民政府 - 环境保护 (guang-an.gov.cn)
API: POST /queryList JSON
"""
import sys, os, re, time, json
from datetime import datetime, timezone, timedelta
import requests
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from crawler_lib import push_to_searchdb

SITE_NAME = "广安市 - 环境保护"
BASE_URL = "https://www.guang-an.gov.cn"
API_URL = f"{BASE_URL}/queryList"
THREE_YEARS_AGO = (datetime.now(timezone.utc) - timedelta(days=365*3)).strftime("%Y-%m-%d")

HEADERS = {
    "User-Agent": "Mozilla/5.0",
    "Content-Type": "application/json"
}
session = requests.Session()
session.headers.update(HEADERS)


def fetch_detail(url):
    resp = session.get(url, timeout=30)
    resp.encoding = "utf-8"
    html = resp.text

    tm = re.search(r'<meta name="ArticleTitle" content="([^"]*)"', html)
    title = tm.group(1).strip() if tm else ""

    dm = re.search(r'<meta name="PubDate" content="([^"]*)"', html)
    date_str = dm.group(1)[:10] if dm else ""

    cm = re.search(r'<div[^>]*id="zoomcon"[^>]*>(.*?)</div>\s*</div>', html, re.DOTALL)
    if cm:
        content = cm.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)
        return title, date_str, content
    return title, date_str, ""


def crawl(incremental=False, limit=None):
    print(f"\n{'='*50}\n🏠 {SITE_NAME}\n{'='*50}")

    # 先拿总数
    params = {"current": 1, "pageSize": 1, "webSiteCode": ["gasrmzfw"],
              "channelCode": ["c104268"], "sort": "pubDate", "order": "desc", "notReturnContent": True}
    resp = session.post(API_URL, json=params, timeout=30)
    data = resp.json()
    total = data["data"]["total"]
    per_page = 20
    total_pages = (total + per_page - 1) // per_page
    print(f"📊 总数: {total}, 页数: {total_pages}")

    max_pages = min(1, total_pages) if incremental else total_pages

    all_list = []

    for pg in range(1, max_pages + 1):
        params = {"current": pg, "pageSize": per_page, "webSiteCode": ["gasrmzfw"],
                  "channelCode": ["c104268"], "sort": "pubDate", "order": "desc", "notReturnContent": True}
        try:
            resp = session.post(API_URL, json=params, timeout=30)
            items = resp.json()["data"]["results"]
        except Exception as e:
            print(f"  ❌ 第{pg}页: {e}")
            continue

        if not items:
            break

        for item in items:
            src = item.get("source", {})
            pub_date = (src.get("pubDate") or "")[:10]
            if pub_date and pub_date < THREE_YEARS_AGO:
                continue

            title = (src.get("title") or "").strip()
            urls_str = src.get("urls", "{}")
            try:
                urls = json.loads(urls_str)
            except:
                urls = {}
            rel_url = urls.get("pc", "")
            if not rel_url:
                continue

            page_url = BASE_URL + rel_url if rel_url.startswith("/") else rel_url
            all_list.append((title, page_url, pub_date))

        print(f"  📄 第{pg}页: {len(items)}条 → 累计{len(all_list)}条")
        if incremental:
            break

        if limit and len(all_list) >= limit:
            all_list = all_list[:limit]
            break

    print(f"\n📊 列表总计: {len(all_list)} 条")

    # 批量抓详情
    parsed = []
    for i, (title, page_url, pub_date) in enumerate(all_list):
        print(f"  [{i+1}/{len(all_list)}] {title[:50]}...", end=" ", flush=True)
        try:
            dt, dd, content = fetch_detail(page_url)
        except Exception as e:
            print(f"❌ {str(e)[:50]}")
            continue

        if not content:
            print("⚠ 无正文")
            continue

        final_title = dt or title
        final_date = dd or pub_date
        summary = re.sub(r'<[^>]+>', ' ', content).strip()[:300]
        summary = re.sub(r'\s+', ' ', summary)

        parsed.append({
            "site_name": SITE_NAME,
            "title": final_title,
            "url": page_url,
            "content": content,
            "pub_date": final_date,
            "summary": summary,
            "tags": SITE_NAME,
        })
        print(f"✅ ({len(content)}字)")

        time.sleep(0.3)

    if parsed:
        push_to_searchdb(parsed, "guangan")
        print(f"\n✅ 完成! 入库 {len(parsed)} 条")
    else:
        print("\n⏭ 无新数据")


if __name__ == "__main__":
    incremental = len(sys.argv) > 1 and sys.argv[1] in ("1", "--incremental")
    limit = None
    for i, a in enumerate(sys.argv):
        if a == "--limit" and i + 1 < len(sys.argv):
            limit = int(sys.argv[i + 1])
    t0 = time.time()
    crawl(incremental=incremental, limit=limit)
    print(f"⏱ 耗时: {time.time() - t0:.1f}s")
