#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
唐山三友硅业股份有限公司 - 环境信息公开 (gy.sanyougroup.cn) 爬虫
站点: http://gy.sanyougroup.cn/
详情: showcontent.asp?id=N  (N 递增, 环境信息公开列表)
正文容器: td#fontzoom
标题: 正文前大号标题 (22pt 加粗段)
日期: YYYY/M/D 格式
用法: python3 crawl_sanyou_gy_gsgg.py [--start=ID] [--end=ID]
默认: id 303~340 (当前已知范围, 日跑增量向后探测)
"""
import os, sys, re, time, json
import requests
from bs4 import BeautifulSoup

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from crawler_lib import push_to_searchdb

BASE_URL = "http://gy.sanyougroup.cn"
SITE_NAME = "唐山三友硅业-环境信息公开"
CATEGORY = "环境信息公开"
DEFAULT_START = 303
DEFAULT_END = 360

UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
HEADERS = {"User-Agent": UA, "Accept-Language": "zh-CN,zh;q=0.9"}


def parse_args():
    start, end = DEFAULT_START, DEFAULT_END
    for a in sys.argv[1:]:
        if a.startswith("--start="):
            start = int(a.split("=")[1])
        elif a.startswith("--end="):
            end = int(a.split("=")[1])
    return start, end


def clean_title(t):
    t = re.sub(r"\s+", " ", t or "")
    return t.strip()


def fetch(session, url):
    try:
        r = session.get(url, timeout=25)
        if r.status_code != 200:
            return ""
        return r.content.decode("gbk", errors="ignore")
    except Exception:
        return ""


def extract_detail(html, url):
    """返回 (title, pub_date, content)"""
    soup = BeautifulSoup(html, "html.parser")

    # 正文容器
    zoom = soup.find("td", id="fontzoom")
    if not zoom:
        # 尝试其他容器
        for sel in ["#fontzoom", "td#fontzoom", "div#zoom", ".content"]:
            el = soup.select_one(sel)
            if el:
                zoom = el
                break
    if not zoom:
        return "", "", ""

    # 标题: 正文容器第一个 22pt 加粗段 或 <title>
    title = ""
    big = zoom.find("span", attrs={"style": re.compile(r"22pt", re.I)})
    if big:
        title = clean_title(big.get_text())
    if not title:
        for el in zoom.find_all(["p", "div"]):
            b = el.find("b") or el.find("strong")
            txt = clean_title(el.get_text())
            if b and 4 <= len(txt) <= 100:
                title = txt
                break
    if not title:
        t = soup.find("title")
        if t:
            title = clean_title(t.get_text())

    # 日期
    date = ""
    m = re.search(r"(20\d{2})[年/-](\d{1,2})[月/-](\d{1,2})", html)
    if m:
        date = "%s-%02d-%02d" % (m.group(1), int(m.group(2)), int(m.group(3)))

    # 正文: 保留 p/table/img
    parts = []
    for el in zoom.find_all(["p", "table", "img"]):
        if el.name == "p":
            if el.find_parent("table") or el.find("table") or el.find("p"):
                continue
            for a in el.find_all("a", href=True):
                h = a["href"].strip()
                if not h.startswith("http"):
                    a["href"] = "http://gy.sanyougroup.cn/" + h.lstrip("/")
            txt = el.get_text(" ", strip=True)
            txt = re.sub(r"\s+", " ", txt)
            if txt:
                parts.append(f"<p>{txt}</p>")
        elif el.name == "table":
            parts.append(str(el))
        elif el.name == "img":
            src = el.get("src", "")
            if src:
                if not src.startswith("http"):
                    src = "http://gy.sanyougroup.cn/" + src.lstrip("/")
                parts.append(f'<p><img src="{src}"></p>')

    content = "\n".join(parts)
    if not content:
        txt = zoom.get_text(" ", strip=True)
        if txt:
            content = f"<p>{txt}</p>"

    return title, date, content


def main():
    start, end = parse_args()
    print(f"[SANYOU-GY] SITE={SITE_NAME} id {start}~{end}", flush=True)
    session = requests.Session()
    session.headers.update(HEADERS)

    results = []
    for nid in range(start, end + 1):
        url = f"{BASE_URL}/showcontent.asp?id={nid}"
        html = fetch(session, url)
        if not html or len(html) < 1000:
            # 页面不存在或太小: 跳过 (id 空洞)
            continue
        title, date, content = extract_detail(html, url)
        if not title or len(title) < 4:
            continue
        summary = re.sub(r"<[^>]+>", " ", content) if content else title
        summary = re.sub(r"\s+", " ", summary).strip()[:300]
        results.append({
            "site_name": SITE_NAME,
            "source_url": url,
            "url": url,
            "title": title,
            "pub_date": date,
            "content": content,
            "summary": summary,
            "category": CATEGORY,
            "attachments": "",
        })
        print(f"  id={nid}: {title[:50]} | {date}", flush=True)
        time.sleep(0.3)

    print(f"\n共 {len(results)} 条, 入库...", flush=True)
    push_to_searchdb(results, batch_label=SITE_NAME)
    print(f"  DONE. pushed={len(results)}", flush=True)


if __name__ == "__main__":
    main()
