"""Rotate one qubit, read the samples and save a report from the same result."""

from __future__ import annotations

import argparse
import json
from math import pi
from pathlib import Path
from typing import Literal

import cascaqit
from cascaqit import Circuit, visualize


def experiment(output: Path, language: Literal["en", "zh"] = "en") -> dict[str, object]:
    """Keep the raw result beside the HTML so the plot can be checked later."""
    theta, shots, seed = pi / 3, 128, 17
    circuit = Circuit(1).ry(theta, 0).measure_all(key="readout")
    result = circuit.run(shots=shots, seed=seed, return_probabilities=True)
    output.parent.mkdir(parents=True, exist_ok=True)
    visualize(result, program=circuit, output=output, language=language)
    raw = output.with_suffix(".json")
    raw.write_text(json.dumps(result.to_dict(), indent=2) + "\n", encoding="utf-8")
    return {
        "sdk_version": cascaqit.__version__,
        "theta_rad": theta,
        "shots": shots,
        "seed": seed,
        "counts": result.counts,
        "probabilities": result.probabilities,
        "bit_order": result.metadata["bitstring_ordering"]["qubit_order"],
        "diagnostic_codes": [item.code for item in result.diagnostics],
        "report": output.as_posix(),
        "raw_result": raw.as_posix(),
    }


def main() -> None:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        "--output", type=Path, default=Path("artifacts/first-experiment.html")
    )
    parser.add_argument("--language", choices=("en", "zh"), default="en")
    args = parser.parse_args()
    print(json.dumps(experiment(args.output, args.language), sort_keys=True))


if __name__ == "__main__":
    main()
