"""Run fresh, alternating wheel processes pinned to one logical CPU.

Requires PYODIDE_ROOT, SYMBOLICA_WASM_WHEEL and SYMBOLICA_NATIVE_PYTHON.
"""
import argparse
import hashlib
import json
import os
from pathlib import Path
import statistics
import subprocess


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--output", type=Path, required=True)
    parser.add_argument("--runs", type=int, default=3)
    parser.add_argument("--cpu", type=int, default=6)
    args = parser.parse_args()
    args.output.mkdir(parents=True, exist_ok=False)
    directory = Path(__file__).resolve().parent
    commands = {
        "native": [os.environ["SYMBOLICA_NATIVE_PYTHON"], str(directory / "wasm_vs_native.py")],
        "wasm": ["node", str(directory / "wasm_vs_native.mjs")],
    }
    records = {key: [] for key in commands}
    for run in range(args.runs):
        for backend in (["native", "wasm"] if run % 2 == 0 else ["wasm", "native"]):
            print(f"Run {run + 1}/{args.runs}: {backend}", flush=True)
            command = ["taskset", "-c", str(args.cpu), *commands[backend]]
            completed = subprocess.run(command, cwd="/tmp", text=True, capture_output=True)
            (args.output / f"{backend}-{run + 1}.log").write_text(completed.stdout + completed.stderr)
            completed.check_returncode()
            result = next(json.loads(line) for line in completed.stdout.splitlines() if line.startswith('{"input_sha256"'))
            records[backend].append(result)
            (args.output / f"{backend}-{run + 1}.json").write_text(json.dumps(result, indent=2) + "\n")
    assert len({r["input_sha256"] for rows in records.values() for r in rows}) == 1
    assert len({r["version"] for rows in records.values() for r in rows}) == 1
    summary = {}
    for name in records["native"][0]["results"]:
        medians = {key: [r["results"][name]["median_ns"] for r in rows] for key, rows in records.items()}
        native = statistics.median(medians["native"])
        wasm = statistics.median(medians["wasm"])
        summary[name] = {"native_ns": native, "wasm_ns": wasm, "ratio": wasm / native, "process_medians_ns": medians}
    output = {"cpu": args.cpu, "runs": args.runs,
              "node": subprocess.check_output(["node", "--version"], text=True).strip(),
              "wasm_wheel_sha256": hashlib.sha256(Path(os.environ["SYMBOLICA_WASM_WHEEL"]).read_bytes()).hexdigest(),
              "results": summary}
    (args.output / "summary.json").write_text(json.dumps(output, indent=2) + "\n")
    print(json.dumps(output, indent=2))


if __name__ == "__main__":
    main()
