#!/usr/bin/env python3
"""
赣州高新区 - 通知公告 (gzgxq.ganzhou.gov.cn)
https://gzgxq.ganzhou.gov.cn/gzgxq/tzgg/list.shtml
UCAP CMS, 详情: /gzgxq/tzgg/202606/uuid.shtml
正文: UCAPCONTENT, 标题: ArticleTitle meta, 日期: PubDate meta
"""
import sys, os, re, time
from datetime import datetime, timezone, timedelta
import requests, urllib3
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://gzgxq.ganzhou.gov.cn"
MAX_PAGES = 5
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}

def fetch(url):
    try:
        r = requests.get(url, headers=HEADERS, timeout=20, verify=False)
        r.encoding = 'utf-8'
        return r.text
    except Exception as e:
        print(f"❌ {e}")
        return None

def parse_list(html):
    items = []
    # <span>YYYY-MM-DD</span><a href="/gzgxq/tzgg/202606/uuid.shtml" title="..." target="_blank">标题</a>
    pattern = r'<span>(\d{4}-\d{2}-\d{2})</span><a[^>]*href="(/gzgxq/tzgg/\d{6}/[a-f0-9]+\.shtml)"[^>]*>([^<]+)</a>'
    for m in re.finditer(pattern, html, re.DOTALL):
        date_str = m.group(1)
        href = m.group(2)
        title = m.group(3).strip()
        if not title or len(title) < 5:
            continue
        if 'list.shtml' in href or 'javascript' in href:
            continue
        items.append((title, BASE_URL + href, date_str))
    return items

def fetch_detail(url):
    html = fetch(url)
    if not html:
        return None, None, None
    result = {}
    # 标题: ArticleTitle meta
    m = re.search(r'<meta[^>]*name="ArticleTitle"[^>]*content="([^"]+)"', html)
    if m:
        result["title"] = m.group(1)
    if not result.get("title"):
        m = re.search(r'<title>(.*?)</title>', html)
        if m:
            t = m.group(1).split("|")[0].strip()
            if t:
                result["title"] = t
    # 日期: PubDate meta
    m = re.search(r'<meta[^>]*name="PubDate"[^>]*content="(\d{4}-\d{1,2}-\d{1,2})', html)
    if m:
        result["publish_date"] = m.group(1)
    # 正文: UCAPCONTENT
    m = re.search(r'<UCAPCONTENT>(.*?)</UCAPCONTENT>', html, re.DOTALL)
    if m:
        content = m.group(1).strip()
        if len(content) > 50:
            result["content"] = content
    if not result.get("content"):
        # 兜底: article-content
        for cls in ['article-content', 'content', 'main', 'text']:
            m = re.search(r'<(div|section)[^>]*class="' + cls + r'[^"]*"[^>]*>(.*?)</\1>', html, re.DOTALL)
            if m and len(m.group(2)) > 100:
                content = m.group(2).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)
                result["content"] = content
                break
    return result.get("title"), result.get("content"), result.get("publish_date")

def main():
    print(f"\n{'='*50}\n🏠 {SITE_NAME}\n{'='*50}")
    all_list = []
    for page in range(1, MAX_PAGES + 1):
        url = f"https://gzgxq.ganzhou.gov.cn/gzgxq/tzgg/list.shtml" if page == 1 else f"https://gzgxq.ganzhou.gov.cn/gzgxq/tzgg/list_{page}.shtml"
        print(f"\n📄 第 {page} 页...", end=" ", flush=True)
        html = fetch(url)
        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)} 条")

    all_items, seen = [], set()
    for i, (title, url, list_date) in enumerate(all_list):
        if url in seen:
            continue
        seen.add(url)
        print(f"  [{i+1}/{len(all_list)}] {title[:55]}...", end=" ", flush=True)
        dt, content, date = fetch_detail(url)
        if dt:
            title = dt
        pub_date = date or list_date
        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": pub_date,
            "summary": summary,
            "tags": SITE_NAME,
        })
        print("✅")
        time.sleep(0.3)

    if all_items:
        push_to_searchdb(all_items, "gzgxq_tzgg")
    print(f"\n✅ 完成! 共 {len(all_items)} 条")

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