"""Compose reusable subcircuits and verify an inverse round trip.

``compose`` maps reusable declarations into a destination circuit. ``inverse``
and ``repeat`` produce new circuits with explicit gate order, so transformations
can be inspected and tested before execution.
"""

from __future__ import annotations

import json

from cascaqit import Circuit


def main() -> None:
    """Build a reusable rotation and cancel it with its inverse."""
    rotation = Circuit(("data",), program_id="lesson.digital.subcircuit")
    theta = rotation.parameter("theta", lower_bound=-1.0, upper_bound=1.0)
    rotation.rx(theta, "data").rz(theta / 2, "data")

    declaration = Circuit(("data",), program_id="lesson.digital.compose")
    declaration.compose(rotation).compose(rotation.inverse())
    bound = declaration.repeat(2).bind({"theta": 0.4})
    result = bound.run(shots=0, return_probabilities=True)

    payload = {
        "track": "digital_developer",
        "level": "applied",
        "lesson": "circuit_composition",
        "facts": {
            "gate_count": len(bound.operations),
            "gate_names": [
                operation.definition.name for operation in bound.operations
            ],
            "parameter_names": [item.name for item in bound.parameters],
            "round_trip_probability_0": round((result.probabilities or {})["0"], 12),
            "source_unchanged": not rotation.is_bound,
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()
