//! Domain model and pluggable provider contract for aeronautical context.
//!
//! This crate defines the provider-neutral types ([`model`]) and the
//! [`ContextProvider`] trait that every context-provider adapter implements
//! (aviationweather.gov, Leidos Flight Service, future European sources).
//! The assembled context serves a human pilot as a briefing and an AI agent
//! as grounded, attributable context.
//!
//! # Capabilities
//!
//! Every provider implements the [`ContextProvider`] identity trait, then
//! one capability trait per kind of context it serves:
//!
//! - [`WeatherBriefingProvider`] — area weather briefings (METAR/TAF/…),
//!   the only capability implemented today.
//! - [`OwnshipStatusProvider`] and [`ControlCommandProvider`] — sibling
//!   capabilities, stubbed pending real sources.
//!
//! Splitting by capability (not by provider) lets a new source — a future
//! European service, or a datalink source like FIS-B — implement only the
//! capabilities it offers, and lets each consumer depend only on the context
//! it needs. The weather data it returns ([`Briefing`], [`Product`],
//! [`model::ProductKind`]) is `#[non_exhaustive]`, so it grows without
//! breaking existing adapters.

pub mod aircraft;
pub mod command;
pub mod compare;
pub mod freshness;
pub mod geo;
pub mod metar;
pub mod model;
pub mod navdata;
pub mod notam;
pub mod ownship;
pub mod provenance;
pub mod provider;
pub mod route_alert;
pub mod route_request;
pub mod secret;
pub mod tfr;
pub mod weather;

pub use aircraft::{AircraftProfile, ProfileError};
pub use command::{CommandAck, ControlCommand, ControlCommandProvider};
pub use compare::{
    Agreement, ComparisonReport, ProductComparison, ProductKey, SourcedValue, compare,
};
pub use freshness::{
    Freshness, METAR_MAX_AGE_MINUTES, classify_cycle, classify_expiry, classify_observation,
    classify_product,
};
pub use metar::{CloudCover, CloudLayer, FlightCategory, MetarObservation};
pub use model::{Area, AreaBriefingRequest, Briefing, GeoPoint, Product, ProductKind, ValidPeriod};
pub use navdata::{
    AIRAC_CYCLE_DAYS, Airspace, AirspaceKind, Airway, AirwayLocation, AirwayPoint, AltitudeDatum,
    AltitudeLimit, ControlledClass, FAA_NASR_CYCLE_DAYS, FAA_NASR_SUBSCRIPTION_URL,
    NavDataAuthority, NavDataCycle, NavDataError, NavDataSnapshot, NavPoint, NavPointKind,
    RestrictiveKind, Runway, RunwayEnd,
};
pub use notam::{
    NotamClassification, NotamFeature, NotamProvider, NotamQuery, NotamReconciliation, NotamRecord,
    NotamScope, NotamSource, NotamType, NotamValidity, ReconciledNotam, reconcile,
};
pub use ownship::{OwnshipStatus, OwnshipStatusProvider};
pub use provenance::{NavdataProvenance, Provenance};
pub use provider::{ContextProvider, ProviderError, ProviderErrorKind};
pub use route_alert::{AlertCategory, RouteAlert, RouteAlertProvider, RouteAlertQuery};
pub use route_request::{FlightRules, RouteBriefingRequest, RouteWaypoint};
pub use secret::{Secret, redact_userinfo};
pub use tfr::{Tfr, TfrKind, TfrProvider};
pub use weather::WeatherBriefingProvider;
