#!/usr/bin/env python3
"""
安庆高新技术产业开发区 — 企业环保信息公开
Lonsun CMS, 静态HTML, 单页, --resolve DNS
"""
import requests
import re
import json
import sys
import os
import argparse
from bs4 import BeautifulSoup

sys.path.insert(0, "/root/gov_crawler")
from crawler_lib import push_to_searchdb

SITE_NAME = "安庆高新技术产业开发区"
DOMAIN = "gxq.anqing.gov.cn"
IP = "27.155.113.110"
BASE = "https://gxq.anqing.gov.cn"
LIST_URL = "/aqhb/qyhbxxgk/index.html"
GROUP = "安徽省"
INDUSTRY = "企业环保"

HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}


def safe_get(url):
    """GET with --resolve."""
    s = requests.Session()
    s.headers.update(HEADERS)
    s.headers["Host"] = DOMAIN
    actual_url = url.replace(DOMAIN, IP)
    r = s.get(actual_url, timeout=30, verify=False)
    r.encoding = "utf-8"
    return r


def fetch_list():
    """Fetch all items from list page."""
    url = BASE + LIST_URL
    r = safe_get(url)
    if r.status_code != 200:
        return []
    soup = BeautifulSoup(r.text, "html.parser")
    items = []
    for li in soup.select("ul.doc_list li"):
        a = li.find("a")
        span = li.find("span", class_="date")
        if a:
            href = a.get("href", "")
            title = a.get("title", a.get_text(strip=True))
            date = span.get_text(strip=True) if span else ""
            if href:
                full_url = href if href.startswith("http") else BASE + href
                items.append({"url": full_url, "title": title.strip(), "date": date.strip()})
    return items


def fetch_detail(url):
    """Fetch detail page."""
    r = safe_get(url)
    if r.status_code != 200:
        return None
    soup = BeautifulSoup(r.text, "html.parser")

    # Title from h1 or meta
    title = ""
    h1 = soup.select_one("h1")
    if h1:
        title = h1.get_text(strip=True)
    if not title:
        meta = soup.find("meta", attrs={"name": "ArticleTitle"})
        if meta and meta.get("content"):
            title = meta["content"].strip()

    # Date from meta
    date = ""
    meta_date = soup.find("meta", attrs={"name": "PubDate"})
    if meta_date and meta_date.get("content"):
        raw = meta_date["content"].strip()
        m = re.match(r"(\d{4})-(\d{1,2})-(\d{1,2})", raw)
        if m:
            date = f"{m.group(1)}-{m.group(2).zfill(2)}-{m.group(3).zfill(2)}"

    # Body from ls-article-info.minh500.j-fontContent
    body_text = ""
    for cls in ["ls-article-info.minh500.j-fontContent", "ls-article-info", "j-fontContent"]:
        content = soup.select_one(f"[class*='{cls.split('.')[0]}']")
        if content:
            break
    if content:
        for s in content.find_all("script"):
            s.decompose()
        parts = []
        for p in content.find_all("p"):
            t = p.get_text(strip=True)
            if t:
                parts.append(t)
        body_text = "\n".join(parts)
    
    return {"title": title, "date": date, "body_text": body_text}


def main():
    parser = argparse.ArgumentParser(description="安庆高新区企业环保信息公开爬虫")
    parser.add_argument("--push", action="store_true", default=False)
    args = parser.parse_args()

    import urllib3
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

    print(f"{SITE_NAME} 企业环保信息公开 — 爬取", flush=True)

    items = fetch_list()
    if not items:
        print("无数据", file=sys.stderr)
        return
    print(f"列表: {len(items)} 条", flush=True)

    details = []
    for idx, item in enumerate(items, 1):
        print(f"  [{idx}/{len(items)}] {item['title'][:35]}...", end=" ", flush=True)
        detail = fetch_detail(item["url"])
        if not detail:
            print("❌", flush=True)
            continue
        details.append({
            "site_name": SITE_NAME,
            "source_url": item["url"],
            "url": item["url"],
            "title": detail["title"] or item["title"],
            "pub_date": detail["date"],
            "summary": (detail["body_text"] or "")[:500],
            "content": detail["body_text"] or "",
            "category": GROUP,
            "tags": INDUSTRY,
            "attachments": "",
        })
        print(f"✅ {len(detail['body_text'])}字", flush=True)

    saved, skipped = len(details), len(items) - len(details)
    print(f"\n完成: {saved} 条, {skipped} 条失败", flush=True)

    if args.push and details:
        push_to_searchdb(details, batch_label="anqing_gxq_hb")

    output = {"saved": saved, "skipped": skipped, "total": len(items), "push": args.push}
    print(f"\n---STATS---\n{json.dumps(output)}")


if __name__ == "__main__":
    main()
