#!/usr/bin/env python3
"""揭阳大南海-公示公告"""
import requests, re, sqlite3, time
from datetime import datetime, timedelta
import os

SEARCH_DB = os.getenv("SEARCH_DB", "/root/search.db")
NAME = "揭阳大南海-公示公告"
BASE = "http://www.jieyang.gov.cn/szfjg/jysdnhshgyq/zwgk/gsgg"
CUTOFF = (datetime.now() - timedelta(days=3*365)).strftime("%Y-%m-%d")
H = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}

def fetch(url):
    for retry in range(2):
        try:
            r = requests.get(url, headers=H, timeout=30)
            if r.status_code == 200: r.encoding = "utf-8"; return r.text
        except: time.sleep(2)
    return None

def parse_list(html):
    items = []
    for li in re.findall(r'<li>(.*?)</li>', html, re.DOTALL):
        m = re.search(r'href="(http[^"]*content/post_\d+\.html)"[^>]*>(.*?)</a>', li)
        if not m: continue
        url = m.group(1)
        title = re.sub(r'<[^>]+>', '', m.group(2)).strip()
        sm = re.search(r'<span[^>]*class="span_time"[^>]*>(\d{4}-\d{2}-\d{2})', li)
        date = sm.group(1) if sm else ''
        if title: items.append({"url": url, "title": title, "date": date})
    return items

def extract(html):
    t = re.sub(r'\s*[-_|].*$', '', (re.search(r'<title>(.*?)<', html) or [None,""])[1]).strip()
    d = (re.findall(r'发布时间[：:]\s*(\d{4}-\d{2}-\d{2})', html) or [""])[0]
    if not d: d = (re.findall(r'(\d{4}-\d{2}-\d{2})', html) or [""])[0]
    c = ""
    m = re.search(r'<div[^>]*class="[^"]*article_content[^"]*"[^>]*>(.*?)</div>\s*<div', html, re.DOTALL)
    if not m: m = re.search(r'<div[^>]*class="[^"]*article_content[^"]*"[^>]*>(.*?)</div>', html, re.DOTALL)
    if m:
        c = m.group(1).strip()
        c = re.sub(r'<(script|style)[^>]*>.*?</\1>', '', c, flags=re.DOTALL|re.I)
        c = re.sub(r'\s*(style|class|align|lang|dir)="[^"]*"', '', c)
        c = re.sub(r'\n\s*\n+', '\n', c)
    return t, d, c

def run(max_pages=5):
    print(f"\n{'='*50}\n🚀 {NAME}\n{'='*50}")
    conn = sqlite3.connect(SEARCH_DB, timeout=60)
    items = []
    for pg in range(1, max_pages+1):
        url = f"{BASE}/index.html" if pg==1 else f"{BASE}/index_{pg}.html"
        html = fetch(url)
        if not html: print(f"  ⚠️ 第{pg}页取不到"); break
        more = parse_list(html)
        if not more: print(f"  → 第{pg}页无条目"); break
        print(f"📋 第{pg}页: {len(more)} 条")
        items.extend(more)
        time.sleep(0.5)
    print(f"\n📊 共 {len(items)} 条")
    new=skip=no_body=0
    for i,item in enumerate(items,1):
        if item["date"] and item["date"]<CUTOFF: skip+=1; continue
        html=fetch(item["url"])
        if not html: print(f"  ⚠️ 详情取不到: {item['title'][:30]}"); skip+=1; continue
        title,date,content=extract(html)
        if not title: title=item["title"]
        if not date: date=item["date"]
        text_len=len(re.sub(r'<[^>]+>','',content).strip()) if content else 0
        if text_len<10: no_body+=1; continue
        try:
            dr=0
            try: dr=int(datetime.strptime(date,"%Y-%m-%d").timestamp())
            except: dr=int(time.time())
            conn.execute("INSERT OR IGNORE INTO gov_raw(site_name,source_url,page_url,title,publish_date,content,summary,date_rank,category) VALUES(?,?,?,?,?,?,?,?,?)",
                (NAME,item["url"],item["url"],title,date,content,title,dr,"政府公告"))
            if conn.total_changes: new+=1
            else: skip+=1
        except Exception as e: print(f"  ❌ DB: {e}"); skip+=1
        if i%10==0: conn.commit(); print(f"  ...{i}/{len(items)}")
        time.sleep(0.3)
    conn.commit()
    try:
        conn.execute("DELETE FROM gov_search WHERE site_name=?",(NAME,))
        conn.execute("INSERT INTO gov_search(rowid,title,site_name,summary) SELECT rowid,title,site_name,summary FROM gov_raw WHERE site_name=?",(NAME,))
        conn.commit()
    except Exception as e: print(f"⚠️ FTS: {e}")
    conn.close()
    print(f"\n✅ {NAME}: 新增{new}, 空正文{no_body}, 跳过{skip}")

if __name__=="__main__":
    import sys; mp=int(sys.argv[1]) if len(sys.argv)>1 else 5; run(mp)
