"""把带类型的 Hybrid 程序编译为确定的依赖图和本地执行计划。

Graph 给出 block 的依赖顺序，plan 给出本地执行所需的 payload 与资源。
两者都只是描述性产物，便于在 Backend 启动前检查顺序和诊断信息。
"""

from __future__ import annotations

import json

from cascaqit import AHSProgram, AtomRegister, Circuit, HybridProgram, Waveform


def main() -> None:
    """构建 typed 程序并检查它的编译产物。"""
    digital = Circuit(1, program_id="lesson.compiler.graph.digital").h(0)
    analog = AHSProgram(
        AtomRegister.line(count=1, spacing=5.0),
        program_id="lesson.compiler.graph.analog",
    ).drive(
        rabi=Waveform.constant(0.3, duration=0.1),
        detuning=Waveform.constant(0.0, duration=0.1),
        phase=0.0,
    )
    program = (
        HybridProgram("lesson.compiler.graph")
        .digital("prepare", digital)
        .analog("evolve", analog)
        .measure_all()
    )
    compiled = program.compile()
    if compiled.graph is None or compiled.plan is None:
        raise RuntimeError([item.to_dict() for item in compiled.diagnostics])

    binding = program.execution_builder(shots=8, seed=7).build()
    if binding.bundle is None:
        raise RuntimeError([item.to_dict() for item in binding.diagnostics])

    payload = {
        "track": "compiler_engineer",
        "level": "foundation",
        "lesson": "hybrid_graph_plan",
        "facts": {
            "topological_order": list(compiled.graph.topological_order),
            "dependency_types": sorted(
                {edge.dependency_type for edge in compiled.graph.edges}
            ),
            "plan_steps": [step.kernel_kind for step in compiled.plan.steps],
            "bundle_ready": binding.bundle.execution_ready,
            "payload_kinds": [item.payload_kind for item in binding.bundle.payloads],
            "execution_ready": compiled.plan.execution_ready,
            "diagnostic_codes": [item.code for item in compiled.diagnostics],
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()
