"""使用导入程序前，检查受限 OpenQASM 转换。"""

from __future__ import annotations

import json

from cascaqit.digital import DigitalProgramIR
from cascaqit.interop import (
    ProgramExportRequest,
    ProgramImportRequest,
    export_program,
    import_program,
    prove_openqasm3_round_trip,
)
from cascaqit.simulators import compare_digital_program_semantics


def main() -> None:
    """检查有效转换、往返结果和不支持的重置操作。"""
    source = """
    OPENQASM 3;
    qubit[2] q;
    bit[2] c;
    ry(0.4) q[0];
    cx q[0], q[1];
    x q[1];
    measure q[0] -> c[0];
    measure q[1] -> c[1];
    """
    imported = import_program(
        ProgramImportRequest(source_format="openqasm3", source=source)
    )
    if (
        not isinstance(imported.program, DigitalProgramIR)
        or imported.unsupported_features
    ):
        raise RuntimeError("受支持的源码没有生成数字程序。")
    exported = export_program(
        ProgramExportRequest(program=imported.program, target_format="openqasm3")
    )
    if not isinstance(exported.payload, str):
        raise RuntimeError("导出没有生成 OpenQASM 源码。")
    restored = import_program(
        ProgramImportRequest(source_format="openqasm3", source=exported.payload)
    )
    if not isinstance(restored.program, DigitalProgramIR):
        raise RuntimeError("导出的源码无法重新导入。")
    structure = prove_openqasm3_round_trip(imported.program)
    probabilities = compare_digital_program_semantics(
        imported.program, restored.program
    )
    blocked = import_program(
        ProgramImportRequest(
            source_format="openqasm3", source=source.replace("x q[1];", "reset q[1];")
        )
    )
    if (
        structure.status != "passed"
        or probabilities.status != "equivalent"
        or blocked.program is not None
    ):
        raise RuntimeError("转换检查结果与支持范围不一致。")
    print(
        json.dumps(
            {
                "exported_source": exported.payload,
                "round_trip_status": structure.status,
                "matched_fields": list(structure.matched_fields),
                "probability_status": probabilities.status,
                "maximum_probability_delta": probabilities.max_probability_delta,
                "blocked_reset": blocked.program is None,
                "reset_diagnostics": [item.code for item in blocked.diagnostics],
            },
            sort_keys=True,
        )
    )


if __name__ == "__main__":
    main()
