"""让 Digital-Analog-Digital 三个 block 在同一个量子态上连续运行。

程序只使用公开 API 构建两类 payload，再交给 ``HybridProgram`` 组合。运行后请查看
block-state chain：前一个 block 的输出 hash 应成为下一个 block 的输入 hash。
固定 seed 和小规模 workload 使示例可离线复现。
"""

from __future__ import annotations

import json

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


def main() -> None:
    """构建、执行并检查一个最小共享状态实验。"""
    # H 门准备的叠加态会传给后续 Analog 演化。
    prepare = Circuit(1, program_id="lesson.hybrid.beginner.prepare").h(0)

    # 全局驱动随时间线性变化，方向始终沿 X。
    evolve = AHSProgram(
        AtomRegister.line(count=1, spacing=5.0),
        program_id="lesson.hybrid.beginner.evolve",
    ).drive(
        rabi=Waveform.linear(0.2, 0.6, duration=0.1),
        detuning=Waveform.constant(0.0, duration=0.1),
        phase=0.0,
    )

    # 最后一个 H 门改变读出基；测量放在整个程序末尾。
    program = (
        HybridProgram("lesson.hybrid.beginner")
        .digital("prepare", prepare)
        .analog("evolve", evolve)
        .digital("readout", Circuit(1).h(0))
        .measure_all()
    )
    result = LocalBackend(analog_time_steps=4).run(program, shots=16, seed=101).result()
    transitions = result.state_transitions()
    reset_program = (
        HybridProgram("lesson.hybrid.reset-control")
        .analog("evolve", evolve)
        .digital("readout", Circuit(1).h(0))
        .measure_all()
    )
    reset_result = (
        LocalBackend(analog_time_steps=4)
        .run(reset_program, shots=16, seed=101)
        .result()
    )

    payload = {
        "track": "hybrid_researcher",
        "level": "beginner",
        "lesson": "first_shared_state",
        "facts": {
            "block_kinds": [item.program_kind for item in transitions],
            "state_continuous": all(
                left.output_state_hash == right.input_state_hash
                for left, right in zip(transitions, transitions[1:])
            ),
            "probabilities": result.probabilities,
            "reset_control_probabilities": reset_result.probabilities,
            "counts_total": sum(result.counts.values()),
            "program_hash_present": len(result.program_hash) == 64,
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()
