#!/usr/bin/env python3
"""
太和县-回应关切 (taihe.gov.cn)
列表: /OpennessTarget/317/20154/page_N.html (AJAX API)
详情: /OpennessContent/show/{id}.html
正文: div#zoom
CMS: OpennessTarget API
"""
import sys, os, re, time
from datetime import datetime, timezone, timedelta
import requests, urllib3
from bs4 import BeautifulSoup
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from crawler_lib import push_to_searchdb
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

SITE_NAME = "太和县-回应关切"
BASE_URL = "https://www.taihe.gov.cn"
API_URL = "https://www.taihe.gov.cn/OpennessTarget/317/20154/page_{n}.html"
MAX_PAGES = 5
CUTOFF = (datetime.now(timezone.utc) - timedelta(days=365*3)).strftime("%Y-%m-%d")
HEADERS = {"User-Agent": "Mozilla/5.0", "X-Requested-With": "XMLHttpRequest"}

def fetch(url):
    try:
        r = requests.get(url, headers=HEADERS, timeout=20, verify=False)
        r.encoding = 'utf-8'
        return r.text
    except:
        return None

def parse_list(html):
    """<li><a href="..." title="title">title</a><span>date</span></li>"""
    items = []
    for m in re.finditer(r'<li[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*title="([^"]*)"[^>]*>.*?</a>.*?<span[^>]*>(\d{4}-\d{2}-\d{2})', html, re.DOTALL):
        href = m.group(1)
        title = m.group(2).strip()
        date = m.group(3).strip()
        if not href.startswith('http'):
            href = BASE_URL + href
        if title and date:
            items.append((title, href, date))
    return items

def fetch_detail(url):
    html = fetch(url)
    if not html:
        return None, None, None
    soup = BeautifulSoup(html, 'html.parser')
    # 标题
    title = ""
    t = soup.find('title')
    if t: title = re.sub(r'[-_—].*', '', t.get_text()).strip()
    # 正文
    content = ""
    zoom = soup.find(id='zoom')
    if zoom:
        for tag in zoom(['script', 'style']):
            tag.decompose()
        # 清理 style 属性
        for tag in zoom.find_all(style=True):
            del tag['style']
        content = str(zoom).strip()
    # 日期
    date = ""
    m = re.search(r'PubDate["\'][^>]*content=["\']([^"\']+)', html, re.I)
    if m: date = m.group(1)[:10]
    if not date:
        m = re.search(r'(\d{4}-\d{2}-\d{2})\s+\d{2}:\d{2}', html)
        if m: date = m.group(1)
    return title, content, date

def run(args=None):
    incremental = False
    if args and '1' in args:
        incremental = True
    print(f"爬取: {SITE_NAME}")
    results = []
    max_pages = 1 if incremental else MAX_PAGES
    
    for page in range(1, max_pages + 1):
        url = API_URL.format(n=page)
        html = fetch(url)
        if not html or len(html) < 200:
            if page > 1: break
            print(f"  ❌ 无法获取第{page}页")
            continue
        
        items = parse_list(html)
        if not items:
            if page > 1: break
            print(f"  第{page}页: 0 条")
            continue
        print(f"  第{page}页: {len(items)} 条")
        
        for i, (title, url2, date) in enumerate(items):
            print(f"  [{i+1}/{len(items)}] {title[:40]}...", end=" ", flush=True)
            dt, content, d2 = fetch_detail(url2)
            if not content or len(content) < 30:
                print("内容过短")
                continue
            results.append({
                "site_name": SITE_NAME, "title": dt or title,
                "url": url2, "content": content,
                "pub_date": d2 or date,
                "category": "政府公告", "tags": "太和",
            })
            print(f"✅ ({len(content)}字)")
            time.sleep(0.3)
        
        if incremental:
            break
        time.sleep(0.5)
    
    if results:
        print(f"\n  入库 {len(results)} 条")
        push_to_searchdb(results, "taihe_yhjg")
    print("完成")

if __name__ == "__main__":
    run(sys.argv[1] if len(sys.argv)>1 else None)
