"""通过统一 Hybrid Backend 执行可复现的参数扫描。

``ParameterScan`` 按声明顺序展开参数点。每个 child 会保存自己的绑定值、seed、
结果和状态；aggregate result 则汇总 worker 数和资源规划信息。
"""

from __future__ import annotations

import json

from cascaqit import Circuit, HybridProgram, LocalBackend
from cascaqit.parameters import ParameterScan


def main() -> None:
    """运行三个旋转角度，并按 scan 顺序检查 child result。"""
    circuit = Circuit(1, program_id="lesson.hybrid.sweep.digital")
    theta = circuit.parameter("theta", lower_bound=-1.0, upper_bound=1.0)
    circuit.ry(theta, 0)
    program = (
        HybridProgram("lesson.hybrid.sweep").digital("rotate", circuit).measure_all()
    )
    scan = ParameterScan.explicit(
        scan_id="lesson.hybrid.sweep.points",
        points=tuple({"theta": value} for value in (-0.5, 0.0, 0.5)),
    )
    job = LocalBackend(seed=103).run(
        program, sweep=scan, shots=16, failure_policy="continue_on_error"
    )
    result = job.result()

    if job.status().state != "completed" or any(
        item.state != "completed" or item.result is None for item in result.items
    ):
        raise RuntimeError("The parameter sweep did not complete every point.")

    payload = {
        "track": "hybrid_researcher",
        "level": "applied",
        "lesson": "parameter_sweep",
        "facts": {
            "job_state": job.status().state,
            "item_states": [item.state for item in result.items],
            "theta_values": [item.bind_set.values["theta"] for item in result.items],
            "counts_totals": [
                sum((item.result.counts if item.result else {}).values())
                for item in result.items
            ],
            "probabilities": [
                item.result.probabilities for item in result.items if item.result
            ],
            "selected_workers": result.metadata["scan_resource_plan"][
                "selected_workers"
            ],
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()
