from __future__ import annotations

import argparse
import json
import math
from pathlib import Path


EXCLUDED_FIELDS = {"nif", "mai", "morada", "habilitacoes"}


def percentile(values: list[int], percentile_value: float) -> int:
    if not values:
        return 0
    ordered = sorted(values)
    index = max(0, math.ceil(percentile_value * len(ordered)) - 1)
    return ordered[index]


def summarize(records: list[dict]) -> dict:
    useful = [record for record in records if record.get("field") not in EXCLUDED_FIELDS]
    durations = [int(record["duration_ms"]) for record in records if record.get("duration_ms") is not None]
    verdicts = {"correct": 0, "wrong": 0, "empty": 0, "no_data": 0}
    by_field: dict[str, dict[str, int]] = {}
    for record in useful:
        verdict = str(record.get("verdict", "no_data"))
        if verdict not in verdicts:
            raise ValueError(f"Veredicto desconhecido: {verdict}")
        verdicts[verdict] += 1
        field = str(record.get("field", ""))
        by_field.setdefault(field, {key: 0 for key in verdicts})[verdict] += 1
    return {
        "totals": verdicts,
        "by_field": by_field,
        "timing": {
            "samples": len(durations),
            "mean_ms": round(sum(durations) / len(durations)) if durations else 0,
            "p95_ms": percentile(durations, 0.95),
        },
    }


def main() -> None:
    parser = argparse.ArgumentParser(description="Resume um JSONL de benchmark sem imprimir dados pessoais")
    parser.add_argument("jsonl", type=Path)
    args = parser.parse_args()
    records = [json.loads(line) for line in args.jsonl.read_text(encoding="utf-8").splitlines() if line.strip()]
    print(json.dumps(summarize(records), ensure_ascii=False, indent=2, sort_keys=True))


if __name__ == "__main__":
    main()

