#!/usr/bin/env python3
"""Generate deterministic, synthetic AFR examples, not measurements or a simulation.

Repository: python scripts/build-afr-method-examples.py --output public/data/methods/afr-method-examples.json
Standalone download: keep this file beside reliability_stats.py and requirements-research.txt.
Install the requirements, then run this script. No network or device access is performed.
"""
import argparse
import hashlib
import json
import platform
from pathlib import Path

import numpy
import scipy
from reliability_stats import afr_percent, garwood, probability_under_constant_hazard


def build():
    examples = []
    for name, failures, days in [
        ("Zero events, short exposure", 0, 365),
        ("Zero events, 100 times more exposure", 0, 36500),
        ("One event, sparse exposure", 1, 100),
        ("Large-count numerical regression", 1000, 36500000),
    ]:
        lo, hi = garwood(failures)
        scale = 36500 / days
        examples.append({
            "label": name, "failures": failures, "drive_days": days,
            "afr_percent": afr_percent(failures, days),
            "afr_lower95_percent": lo * scale, "afr_upper95_percent": hi * scale,
        })
    return {
        "schema_version": "1.0",
        "title": "AFR worked examples",
        "data_origin": "synthetic educational inputs, not observed drive data",
        "published_on": "2026-10-10",
        "method": {
            "days_per_year": 365, "confidence_level": 0.95,
            "interval": "Equal-tailed Garwood Poisson count interval scaled by 36500 / drive_days",
            "assumptions": "Poisson count model conditional on exposure; not a validation of fleet independence or stationarity.",
            "probability_conversion": "1 - exp(-annual_rate), only under a constant individual hazard",
        },
        "environment": {"python": platform.python_version(), "numpy": numpy.__version__, "scipy": scipy.__version__},
        "code_sha256": {
            name: hashlib.sha256(Path(__file__).with_name(name).read_bytes()).hexdigest()
            for name in ["reliability_stats.py", "build-afr-method-examples.py"]
        },
        "examples": examples,
        "constant_hazard_comparisons": [
            {"annual_rate_percent": rate, "one_year_probability_percent": 100 * probability_under_constant_hazard(rate / 100)}
            for rate in [1, 10, 100, 365]
        ],
        "sources": [
            "https://www.itl.nist.gov/div898/handbook/apr/section4/apr451.htm",
            "https://www.itl.nist.gov/div898/handbook/apr/section1/apr161.htm",
            "https://www.backblaze.com/blog/10-stories-from-10-years-of-drive-stats-data/",
        ],
    }


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--output", type=Path, default=Path("afr-method-examples.json"))
    args = parser.parse_args()
    args.output.parent.mkdir(parents=True, exist_ok=True)
    args.output.write_text(json.dumps(build(), indent=2, allow_nan=False) + "\n")
    print(args.output)
