"""Keep validation and discretization as independent compiler stages.

Validation checks semantic and visible Target constraints. Discretization then
quantizes supported fields under an explicit policy and records original value,
target value, error, unit, and object path without claiming hardware preflight.
"""

from __future__ import annotations

import json

from cascaqit import AHSProgram, AtomRegister, MockNeutralAtomTarget, Waveform


def main() -> None:
    """Validate and discretize one waveform against a public mock target."""
    target = MockNeutralAtomTarget.v0_1()
    program = (
        AHSProgram(
            AtomRegister.line(count=1, spacing=5.0),
            program_id="lesson.compiler.discretization",
        )
        .drive(
            rabi=Waveform.constant(0.8004, duration=0.2004),
            detuning=Waveform.constant(-0.3004, duration=0.2004),
            phase=0.0,
        )
        .measure()
    )
    validated = program.validate(target, shots=16)
    discretized, report = validated.discretize(target, policy="nearest")

    payload = {
        "track": "compiler_engineer",
        "level": "advanced",
        "lesson": "validation_discretization",
        "facts": {
            "validation_errors": [
                item.code for item in validated.diagnostics if item.severity == "error"
            ],
            "policy": report.policy,
            "changed": report.original_program_hash != report.discretized_program_hash,
            "field_changes": [item.to_dict() for item in report.field_reports],
            "field_paths": [item.path for item in report.field_reports],
            "lifecycle": discretized.program_ir.lifecycle_state,
            "hardware_preflight_performed": False,
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()
