#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
湖南省投资项目在线审批监管平台 - 重点民间投资项目名录爬虫
API: POST /public/publicWeb/portal/home/getStoredProjectList (免登录公开 JSON)
页面: http://hntzxm.fgw.hunan.gov.cn/infoPublicitySocial  (venus-portal SPA)
数据形态: 名录型(无详情正文/无发布日期), 字段 = 项目名/企业/代码/地区/行业/投资/规模
唯一键: source_url = BASE/infoPublicitySocial#prj={prjId} (INSERT OR IGNORE 幂等)
日期: 名录无发布日期字段, publish_date 留空 (库内 8172 条无日期先例)
2026-09-03 建 (方案1: 名录入库可搜)
"""
import sys, os, re, time, json

BASE = "http://hntzxm.fgw.hunan.gov.cn"
API = BASE + "/public/publicWeb/portal/home/getStoredProjectList"
SITE_NAME = "湖南省投资项目在线审批监管平台-重点民间投资项目"

_MAX_PG = 8  # total=61/15 → 5页; 名录扩容兜底
for i, a in enumerate(sys.argv):
    if a == '--pages' and i + 1 < len(sys.argv):
        _MAX_PG = int(sys.argv[i + 1])
        break

import requests
from crawler_lib import push_to_searchdb

_PAGE_SIZE = 15
_SEEN = set()


def fetch_page(page, retry=2):
    body = {"pageIndex": page, "pageSize": _PAGE_SIZE,
            "conditions": {"cityRange": "province"}}
    last_err = None
    for attempt in range(retry + 1):
        try:
            r = requests.post(API, json=body, timeout=25,
                              headers={"Content-Type": "application/json"})
            if r.status_code == 200:
                return r.json()
            last_err = f"HTTP {r.status_code}"
        except Exception as e:
            last_err = str(e)
        time.sleep(1.5)
    print(f"  p{page} FAIL ({last_err})")
    return None


def fmt_money(v):
    """700000.0000 -> 700000 万元"""
    try:
        f = float(v)
        return f"{f:,.0f}".replace(",", "")
    except (TypeError, ValueError):
        return str(v or "")


def build_content(rec):
    """名录字段拼接为 <p> 段落 HTML (正文格式规范: 禁markdown链接, 附件用p<a>)"""
    parts = []
    pn = (rec.get("prjName") or "").strip()
    if pn:
        parts.append(f"<p>项目名称：{pn}</p>")
    cn = (rec.get("companyName") or "").strip()
    if cn:
        parts.append(f"<p>建设单位：{cn}</p>")
    pc = (rec.get("projectCode") or "").strip()
    if pc:
        parts.append(f"<p>项目代码：{pc}</p>")
    ln = (rec.get("levelNodeName") or "").strip().strip("/")
    if ln:
        parts.append(f"<p>所在地区：{ln}</p>")
    ind = (rec.get("industry") or "").strip()
    if ind:
        parts.append(f"<p>所属行业：{ind}</p>")
    tm = rec.get("totalMoney")
    if tm not in (None, "", 0, "0", 0.0):
        parts.append(f"<p>总投资：{fmt_money(tm)}万元</p>")
    if rec.get("isNeedFinancing") in (1, "1", True):
        parts.append("<p>融资需求：是</p>")
    if rec.get("isNeedUseLand") in (1, "1", True):
        parts.append("<p>用地需求：是</p>")
    sc = (rec.get("scaleContent") or "").strip()
    if sc:
        parts.append(f"<p>建设内容及规模：{sc}</p>")
    return "\n".join(parts)


def main():
    print(f"=== {SITE_NAME} ===")
    all_recs = []
    for page in range(1, _MAX_PG + 1):
        d = fetch_page(page)
        if not d:
            break
        recs = d.get("records") or []
        if not recs:
            print(f"  p{page} empty, stop")
            break
        new = 0
        for r in recs:
            rid = r.get("prjId") or r.get("id")
            if rid in _SEEN:
                continue
            _SEEN.add(rid)
            all_recs.append(r)
            new += 1
        print(f"  p{page}: +{new} 条 (total={d.get('total')})")
        if len(recs) < _PAGE_SIZE:
            break
        time.sleep(0.4)
    print(f"  去重后合计 {len(all_recs)} 条")

    results = []
    for r in all_recs:
        prj_name = (r.get("prjName") or "").strip()
        if not prj_name:
            continue
        content = build_content(r)
        plain = re.sub(r"<[^>]+>", "", content).replace("\n", "").strip()
        summary = plain[:200] or prj_name[:200]
        rid = r.get("prjId") or r.get("id")
        url = f"{BASE}/infoPublicitySocial#prj={rid}"
        results.append({
            "site_name": SITE_NAME,
            "title": prj_name,
            "url": url,
            "source_url": url,
            "content": content,
            "summary": summary,
            "pub_date": "",
        })
        print(f"  ✅ {prj_name[:40]} ({len(content)}B)")

    if results:
        push_to_searchdb(results, "hntzxm_zmtz")
        print(f"入库 {len(results)} 条")
    print("完成")


if __name__ == "__main__":
    main()
