#!/usr/bin/env python3
"""Build the public Build 31 Beijing water layer from the bundled legacy catalog.

Only source-derived water-body fields are exported. Recommendation scores, candidate
spots, access/management workflow, field readiness and publication state stay in the
Yucaoji business layer.
"""

from __future__ import annotations

import argparse
import json
from collections import Counter
from pathlib import Path


ALLOWED_WATER_BODY_FIELDS = (
    "id",
    "name",
    "kind",
    "latitude",
    "longitude",
    "mappedLengthKM",
    "mappedAreaKM2",
    "sourceWaterKind",
    "classificationConfidence",
    "classificationMethod",
    "nameStatus",
    "dataQualityFlags",
    "areaCalculationMethod",
)


def build(source: Path) -> dict:
    legacy = json.loads(source.read_text())
    water_bodies = [
        {key: item.get(key) for key in ALLOWED_WATER_BODY_FIELDS}
        for item in legacy["waterBodies"]
    ]
    water_bodies.sort(key=lambda item: item["id"])

    methods = Counter(item["classificationMethod"] for item in water_bodies)
    source_summary = legacy["summary"]
    return {
        "schemaVersion": 1,
        "packageID": "river-segment-v1-a8e1715d43fb0a61",
        "sourceBuild": 31,
        "sourceGeneratedAtUTC": legacy["generatedAtUTC"],
        "generatedAt": "2026-08-15T00:00:00+08:00",
        "attribution": legacy["attribution"],
        "licenseURL": "https://opendatacommons.org/licenses/odbl/1-0/",
        "modifications": (
            "Field-allowlisted projection of the Build 31 legacy composite catalog; "
            "candidate spots, recommendation scores, publication/access workflow, "
            "management evidence and field-readiness values are excluded"
        ),
        "summary": {
            "waterBodyCount": len(water_bodies),
            "matchedSatelliteSurfaceCount": source_summary["matchedSatelliteSurfaceCount"],
            "satelliteOnlyCount": methods.get("satellite_only", 0),
            "classificationMethodCounts": dict(sorted(methods.items())),
        },
        "waterBodies": water_bodies,
    }


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--source", type=Path, required=True)
    parser.add_argument("--output", type=Path, required=True)
    args = parser.parse_args()
    payload = json.dumps(build(args.source), ensure_ascii=False, indent=2, sort_keys=True) + "\n"
    args.output.write_text(payload)


if __name__ == "__main__":
    main()
