#!/usr/bin/env python3
"""Standalone Carbon Continuity reference recomputation (Python stdlib only)."""

from __future__ import annotations

import argparse
import json
from pathlib import Path


def step(p: dict, living: float, durable: float) -> tuple[float, float]:
    return p["a"] * living + p["r"] * durable, p["p"] * living + p["d"] * durable


def trajectory(p: dict, cycles: int, caps: dict) -> list[tuple[float, float]]:
    states = [tuple(p["initial"])]
    for _ in range(cycles):
        living, durable = step(p, *states[-1])
        states.append((min(caps["living"], living), min(caps["durable"], durable)))
    return states


def policy_output(p: dict, cycles: int, discount: float, caps: dict) -> dict:
    states = trajectory(p, cycles, caps)
    weights = [discount ** cycle for cycle in range(cycles + 1)]
    cci = sum(weight * sum(state) for weight, state in zip(weights, states)) / (
        sum(weights) * (caps["living"] + caps["durable"])
    )
    rc = p["r"] * p["p"] / ((1.0 - p["a"]) * (1.0 - p["d"]))
    return {
        "carbon_continuity_number_6dp": f"{rc:.6f}",
        "cci_20_3dp": f"{cci:.3f}",
        "cci_20_6dp": f"{cci:.6f}",
        "trajectory_living_durable_5dp": [[f"{l:.5f}", f"{d:.5f}"] for l, d in states],
    }


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("--inputs", type=Path, required=True)
    parser.add_argument("--output", type=Path, required=True)
    args = parser.parse_args()
    inputs = json.loads(args.inputs.read_text(encoding="utf-8"))
    witness = inputs["strict_witness"]
    living, durable = witness["r"], 1.0 - witness["a"]
    next_living, next_durable = step(witness, living, durable)
    policies = {
        name: policy_output(values, inputs["cycles"], inputs["discount"], inputs["capacity"])
        for name, values in sorted(inputs["policies"].items())
    }
    output = {
        "schema_version": "VRS-RECOMPUTE-1",
        "publication_doi": inputs["publication_binding"]["doi"],
        "published_figure": inputs["publication_binding"]["figure"],
        "policies": policies,
        "strict_witness": {
            "living_3dp": f"{living:.3f}",
            "durable_3dp": f"{durable:.3f}",
            "next_living_3dp": f"{next_living:.3f}",
            "next_durable_3dp": f"{next_durable:.3f}",
            "threshold_relation": "STRICT_ABOVE",
        },
        "published_order_reproduced": (
            float(policies["continuity_focused"]["cci_20_6dp"])
            > float(policies["stock_focused"]["cci_20_6dp"])
        ),
        "scope": "illustrative deterministic model output; not empirical calibration",
    }
    args.output.write_text(json.dumps(output, indent=2, sort_keys=True) + "\n", encoding="utf-8")
    print(json.dumps({"status": "PASS", "output": str(args.output)}, sort_keys=True))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
