"""Declare and bind a typed Digital rotation parameter.

Parameters remain symbolic while a circuit is reusable. ``bind`` creates a
new executable circuit, checks missing or unknown values, and preserves the
original declaration for another experiment.
"""

from __future__ import annotations

import json

from cascaqit import Circuit


def main() -> None:
    """Bind one angle and compare declaration with executable circuit."""
    declaration = Circuit(1, program_id="lesson.digital.parameter")
    theta = declaration.parameter("theta", lower_bound=-3.2, upper_bound=3.2)
    declaration.ry(theta, 0).measure_all()

    # Binding returns a separate circuit; the declaration stays symbolic.
    bound = declaration.bind({"theta": 0.5})
    result = bound.run(shots=0, seed=202, return_probabilities=True)

    payload = {
        "track": "digital_developer",
        "level": "foundation",
        "lesson": "parameter_binding",
        "facts": {
            "declaration_is_bound": declaration.is_bound,
            "bound_is_bound": bound.is_bound,
            "parameter_names": [item.name for item in bound.parameters],
            "bound_angle": bound.operations[0].arguments["theta"],
            "probability_sum": round(sum((result.probabilities or {}).values()), 12),
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()
