#!/usr/bin/env python3
"""泰国政府采购数据取数脚本 —— 在你自己的网络环境下运行。

本机（服务器）访问 data.go.th 整个域被硬性 403 拦截，所以这个脚本需要你在
能正常访问泰国政府网站的机器上跑一次，然后把输出文件发回。

用法：
    python3 th_fetch_local.py <API_KEY> [年份(佛历,默认2569)]

脚本会依次尝试几种官方调用形式，打印每种的状态码和返回片段，
任何一次拿到数据就保存为同目录下的 cgdcontract.json。
"""
import json, sys, urllib.request, urllib.error, urllib.parse, ssl

KEY = sys.argv[1] if len(sys.argv) > 1 else ""
YEAR = sys.argv[2] if len(sys.argv) > 2 else "2569"
if not KEY:
    sys.exit("用法: python3 th_fetch_local.py <API_KEY> [年份]")

CTX = ssl.create_default_context()
CTX.check_hostname = False
CTX.verify_mode = ssl.CERT_NONE

UA = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
      "(KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36")

CANDIDATES = [
    # (说明, URL, 额外 header)
    ("A govspending 官方 + user_token",
     f"https://govspending.data.go.th/api/service/cgdcontract?user_token={KEY}&year={YEAR}", {}),
    ("B govspending 官方 + api-key header",
     f"https://govspending.data.go.th/api/service/cgdcontract?year={YEAR}", {"api-key": KEY}),
    ("C govspending 文档页",
     "https://govspending.data.go.th/api/documentation", {"api-key": KEY}),
    ("D opend + serviceCode",
     f"https://opend.data.go.th/govspending/cgdcontract?serviceCode=CGDCONTRACT&year={YEAR}",
     {"api-key": KEY}),
    ("E opend + api/govspending",
     f"https://opend.data.go.th/api/govspending/cgdcontract?serviceCode=CGDCONTRACT&year={YEAR}"
     f"&api-key={KEY}", {"api-key": KEY}),
    ("F opend get-ckan datastore_search",
     f"https://opend.data.go.th/get-ckan/datastore_search?resource_id=cgdcontract&limit=5",
     {"api-key": KEY}),
]


def get(url, headers):
    req = urllib.request.Request(url, headers={"User-Agent": UA, "Accept": "application/json", **headers})
    try:
        with urllib.request.urlopen(req, timeout=40, context=CTX) as r:
            return r.status, r.read().decode("utf-8", "replace")
    except urllib.error.HTTPError as e:
        return e.code, e.read().decode("utf-8", "replace")
    except Exception as e:
        return -1, f"{type(e).__name__}: {e}"


hits = []
for name, url, hdr in CANDIDATES:
    code, body = get(url, hdr)
    head = " ".join(body[:180].split())
    print(f"[{name}]\n    {url.split('?')[0]}\n    -> {code}  {head}\n")
    if code == 200 and body.strip()[:1] in "[{":
        hits.append((name, body))

if hits:
    name, body = hits[0]
    with open("cgdcontract.json", "w", encoding="utf-8") as f:
        f.write(body)
    print(f"已保存 cgdcontract.json（来源：{name}，{len(body)} 字节）")
    print("把这个文件发回给我即可。")
else:
    print("以上形式都没拿到数据。请把上面的完整输出发我，我据此判断正确的调用形式。")
