"""Offline SDK quickstart using the supplied checkout's synthetic fixture.

Requires comuvia 0.1.0 (pip install comuvia==0.1.0, or the package on PYTHONPATH).
Only --output is written. Use a fresh output directory for each run.
"""
import argparse
import json
from pathlib import Path

import comuvia
from comuvia import RecordStore


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--fixtures", required=True, type=Path, help="Path to fixtures/synthetic")
    parser.add_argument("--output", required=True, type=Path, help="New output directory outside the SDK checkout")
    args = parser.parse_args()
    if args.output.exists():
        raise SystemExit("Choose a new output directory; this example never overwrites a run.")
    fixture = args.fixtures / "structured-binary"
    names = ("q-port-calder-teu-2027-01", "fc-lantern-port-calder-teu-2027-01",
             "res-port-calder-bulletin-2027-01-first", "out-port-calder-teu-2027-01")
    records = [comuvia.load_record((fixture / "records" / f"{name}.json").read_bytes()) for name in names]
    bulletin = (fixture / "source" / "port-calder-bulletin-2027-01.csv").read_bytes()
    assert comuvia.verify(records[2], content=bulletin).content_identity == "match"

    store_path = args.output / "store"
    RecordStore.create(store_path)
    with RecordStore(store_path, writer=True) as writer:
        for record in records:
            writer.append(record)
        report = comuvia.evaluate(writer.records())
        (result,) = report.results
        assert result.status == "scored" and f"{result.loss:.2f}" == "0.09"
        (evaluation,) = comuvia.evaluation_records(
            report, writer.records(), evaluated_at="2027-02-17T00:00:00Z",
            recorded_by="evaluator:offline-quickstart", recorded_at="2027-02-17T00:00:00Z",
        )
        writer.append(evaluation)

    reader = RecordStore(store_path)
    assert reader.verify().ok
    reproduction = comuvia.reproduce(evaluation, reader.records())
    assert reproduction.result == "match"
    print(json.dumps({"package_version": comuvia.__version__, "data_origin": "synthetic",
                      "records_stored": len(reader.records()), "counts": report.counts,
                      "loss": result.loss, "display_loss": f"{result.loss:.2f}",
                      "store_identity_ok": reader.verify().ok,
                      "reproduction": reproduction.result}, indent=2))


if __name__ == "__main__":
    main()
