"""Run offline ROV, ASPA, BMP and batches using only supported public APIs."""

from datetime import UTC, datetime
from ipaddress import ip_network

from rpkiparrot import MemoryStore
from rpkiparrot.config import FreshnessPolicy
from rpkiparrot.models import (
    Aspa,
    AspaContext,
    AspaRecord,
    AspaStatus,
    AsPath,
    BmpAssessment,
    BmpContext,
    EvaluationContext,
    NeighborRelationship,
    OriginInput,
    OriginStatus,
    ParsedDataset,
    PayloadKind,
    Vrp,
    VrpRecord,
)
from rpkiparrot.validation import analyze_bmp_path, validate_aspa, validate_origin, validate_origins


def main() -> None:
    """Evaluate complete host-provided assertions without fabricating JSON."""
    generated_at = datetime(2026, 10, 1, tzinfo=UTC)
    store = MemoryStore(
        context=EvaluationContext.offline(at=datetime(2026, 10, 1, 0, 30, tzinfo=UTC)),
    )
    dataset = ParsedDataset(
        # Presence is explicit even when a particular collection is empty.
        present=frozenset({PayloadKind.VRP, PayloadKind.ASPA}),
        generated_at=generated_at,
        vrps=(VrpRecord(vrp=Vrp(prefix=ip_network("192.0.2.0/24"), max_length=24, asn=64496)),),
        aspas=(
            AspaRecord(aspa=Aspa(customer=64496, providers=frozenset({64497}))),
            AspaRecord(aspa=Aspa(customer=64497, providers=frozenset({64498}))),
        ),
    )
    snapshot = store.replace_source(
        "host-assertions", dataset, freshness=FreshnessPolicy(max_age=3600)
    )
    origin = validate_origin(snapshot, "192.0.2.0/24", 64496, explain=True)
    assert origin.status is OriginStatus.VALID
    path = AsPath.sequence((64498, 64497, 64496))
    context = AspaContext(
        local_asn=64499,
        neighbor_asn=64498,
        relationship=NeighborRelationship.CUSTOMER,
    )
    aspa = validate_aspa(snapshot, path, context=context, explain=True)
    assert aspa.status is AspaStatus.VALID
    bmp = analyze_bmp_path(
        snapshot,
        path,
        context=BmpContext(
            observation_stage="pre_policy",
            path_reconstructed=True,
            path_direction="neighbor_to_origin",
            local_asn=64499,
            neighbor_asn=64498,
            relationship=NeighborRelationship.CUSTOMER,
        ),
    )
    assert bmp.assessment is BmpAssessment.NO_INVALID_EVIDENCE
    batch = validate_origins(
        snapshot,
        [
            OriginInput("192.0.2.0/24", 64496, "valid"),
            OriginInput("192.0.2.0/25", 64496, "invalid"),
            OriginInput("198.51.100.0/24", 64496, "notfound"),
            OriginInput("192.0.2.1/24", 64496, "bad-network"),
        ],
    )
    assert batch.complete and batch.success_count == 3 and batch.error_count == 1
    print(f"ROV={origin.status.value}; ASPA={aspa.status.value}; BMP={bmp.assessment.value}")
    print(f"Batch: {batch.success_count} evaluated, {batch.error_count} input error")


if __name__ == "__main__":
    main()
