"""让 Digital 和 Analog block 共用一个规范参数。

参数名、类型、单位、边界和默认值共同组成 schema。两类 block 中的相位定义一致时，
``HybridProgram`` 可以一次完成绑定，不需要按模式分别转换参数。
"""

from __future__ import annotations

import json
from typing import cast

from cascaqit import (
    AHSProgram,
    AtomRegister,
    Circuit,
    HybridProgram,
    LocalBackend,
    Waveform,
)


def main() -> None:
    """声明、合并、绑定并执行一个跨 block 参数。"""
    digital = Circuit(1, program_id="lesson.hybrid.parameters.digital")
    digital_phase = digital.parameter(
        "phase", default=0.2, lower_bound=-1.0, upper_bound=1.0
    )
    digital.h(0).rz(digital_phase, 0)

    analog = AHSProgram(
        AtomRegister.line(count=1, spacing=5.0),
        program_id="lesson.hybrid.parameters.analog",
    )
    analog_phase = analog.parameter(
        "phase", unit="rad", default=0.2, lower_bound=-1.0, upper_bound=1.0
    )
    analog.drive(
        rabi=Waveform.constant(0.4, duration=0.1),
        detuning=Waveform.constant(0.0, duration=0.1),
        phase=analog_phase,
    )

    program = (
        HybridProgram("lesson.hybrid.parameters")
        .digital("prepare", digital)
        .analog("evolve", analog)
        .measure_all()
    )
    manager = program.parameters
    bound = program.bind({"phase": 0.35})
    result = LocalBackend(analog_time_steps=4).run(bound, shots=16, seed=102).result()

    digital_ir = cast(Circuit, bound.payload("prepare")).to_ir()
    analog_ir = cast(AHSProgram, bound.payload("evolve")).measure().to_ir()

    payload = {
        "track": "hybrid_researcher",
        "level": "foundation",
        "lesson": "canonical_parameters",
        "facts": {
            "schema_names": [item.name for item in manager.schema.parameters],
            "target_count": len(manager.targets),
            "digital_phase": digital_ir.circuit.operations[1].arguments["theta"],
            "analog_phase": analog_ir.hamiltonian.phase,
            "probabilities": result.probabilities,
            "counts_total": sum(result.counts.values()),
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()
