#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Attach an authoritative budget (万元) to each curated project, taken from the raw scrape record
(page-provided values), falling back to text extraction in gen_0925.py."""
import json, io, os, re

BASE = "/data/www/files"
projs = json.load(io.open(os.path.join(BASE, "projects_20260925.json"), encoding="utf-8"))
GS = json.load(io.open(os.path.join(BASE, "gansu_raw_0925.json"), encoding="utf-8"))
GZ = json.load(io.open(os.path.join(BASE, "ggzy_raw_0925.json"), encoding="utf-8"))["records"]
CQ = json.load(io.open(os.path.join(BASE, "cq_cd_20260925.json"), encoding="utf-8"))


def num(s):
    if s is None:
        return None
    s = str(s)
    m = re.search(r"([\d,]+(?:\.\d+)?)", s.replace("，", ","))
    if not m:
        return None
    try:
        return float(m.group(1).replace(",", ""))
    except Exception:
        return None


def wan_from_text(t):
    if not t:
        return None
    v = num(t)
    if v is None:
        return None
    if "万" in t:
        return round(v, 2)
    return round(v / 10000.0, 2)


def wan(v):
    """raw value is in 元"""
    if v is None:
        return None
    return round(float(v) / 10000.0, 2)


hits = 0
for p in projs:
    u = p["url"]
    b = None
    if "ccgp-gansu" in u:
        gid = u.split("id=")[-1]
        r = GS.get(gid)
        if r and r.get("budget"):
            b = wan(num(r["budget"]))
    elif "cqggzy" in u or "cdggzy" in u:
        for r in CQ:
            if r.get("url", "").split("?")[0] == u.split("?")[0]:
                b = wan_from_text(r.get("budget"))
                break
    elif "ggzyjy.sc.gov.cn" in u:
        rec = GZ.get(u)
        if rec:
            c = rec.get("content") or ""
            m = re.search(r"预算(?:总)?金额[^0-9]{0,14}([\d,]+(?:\.\d+)?)\s*万元", c)
            if m:
                b = float(m.group(1).replace(",", ""))
            else:
                m = re.search(r"预算(?:总)?金额[^0-9]{0,14}([\d,]+(?:\.\d+)?)\s*元", c)
                if m:
                    b = round(float(m.group(1).replace(",", "")) / 10000.0, 2)
                else:
                    m = re.search(r"中标(?:（成交）|\(成交\))?(?:金额|价)?[^0-9]{0,14}([\d,]+(?:\.\d+)?)\s*万元", c)
                    if m:
                        b = float(m.group(1).replace(",", ""))
                    else:
                        m = re.search(r"中标(?:（成交）|\(成交\))?(?:金额|价)?[：:]?\s*([\d,]+(?:\.\d+)?)\s*元", c)
                        if m:
                            b = round(float(m.group(1).replace(",", "")) / 10000.0, 2)
    if b:
        p["budget"] = b
        p["budget_source"] = "page"
        hits += 1
    else:
        p["budget"] = p.get("budget_hint") or "未披露"
        p["budget_source"] = "hint"

json.dump(projs, io.open(os.path.join(BASE, "projects_20260925.json"), "w", encoding="utf-8"),
          ensure_ascii=False, indent=1)
print("budget attached from page:", hits, "/", len(projs))
for p in projs:
    print("%02d | %-6s | %-9s | %s" % (p["idx"], p["province"], str(p["budget"])[:9], p["title"][:52]))
