"""Collect explicit per-instance validation telemetry without global mutation.

Run ``python examples/metrics.py`` with only the core package installed. Counters
separate completed API calls from evaluated items; invalid is a normal result.
"""

from __future__ import annotations

import json
from datetime import UTC, datetime
from ipaddress import ip_network

from rpkiparrot import MemoryStore
from rpkiparrot.config import FreshnessPolicy
from rpkiparrot.metrics import MetricsCollector
from rpkiparrot.models import (
    EvaluationContext,
    OriginInput,
    ParsedDataset,
    PayloadKind,
    Vrp,
    VrpRecord,
)
from rpkiparrot.validation import validate_origin


def main() -> None:
    """Evaluate fixed synthetic inputs and sample this collector's immutable report."""
    at = datetime(2026, 10, 1, tzinfo=UTC)
    snapshot = MemoryStore(context=EvaluationContext.offline(at=at)).replace_source(
        "programmatic-example",
        ParsedDataset(
            generated_at=at,
            present=frozenset({PayloadKind.VRP}),
            vrps=(VrpRecord(vrp=Vrp(prefix=ip_network("192.0.2.0/24"), max_length=24, asn=64496)),),
        ),
        freshness=FreshnessPolicy(max_age=3600),
    )
    collector = MetricsCollector(timing=True)
    assert collector.validate_origin(snapshot, "192.0.2.0/24", 64496).status.value == "valid"
    result = collector.validate_origins(
        snapshot,
        [
            OriginInput("192.0.2.0/24", 64496, "valid"),
            OriginInput("192.0.2.0/25", 64496, "invalid-is-normal"),
            OriginInput("bad", 64496, "input-error"),
        ],
    )
    assert result.complete and result.success_count == 2 and result.error_count == 1
    report = collector.get_metrics()
    assert report.counters["validation_total"] == 2
    assert report.counters["validation_item_total"] == 4
    assert report.counters["validation_error_total"] == 1
    assert report.counters["validation_item_error_total"] == 1
    # Direct pure validation has no effect on this or any hidden collector.
    validate_origin(snapshot, "192.0.2.0/24", 64496)
    assert collector.get_metrics().counters == report.counters
    print(
        json.dumps(
            {"counters": dict(report.counters), "durations_seconds": dict(report.durations)},
            sort_keys=True,
        )
    )


if __name__ == "__main__":
    main()
