"""C3 cross-domain matcher — Public API (AZ-344).

Per ``cross_domain_matcher_protocol.md`` v1.0.0 the public surface
consists of:

- :class:`CrossDomainMatcher` Protocol (two methods).
- DTOs re-exported from :mod:`gps_denied_onboard._types.matcher`
  (the L1 home for cross-component DTOs):
  :class:`MatchResult`, :class:`MatcherHealth`. The internal
  per-candidate sub-DTO :class:`CandidateMatchSet` is intentionally
  re-exported too because C3.5 reads
  ``MatchResult.per_candidate[i]`` directly.
- Error family rooted at :class:`MatcherError`; two documented
  subtypes (:class:`MatcherBackboneError`,
  :class:`InsufficientInliersError`).
- Config block :class:`C3MatcherConfig` (registered on import).

Internals — :class:`RollingHealthWindow` and the concrete strategy
modules (``disk_lightglue``, ``aliked_lightglue``, ``xfeat``) —
are intentionally NOT re-exported: consumers see only the
Protocol; concrete strategies are imported lazily by
:mod:`gps_denied_onboard.runtime_root.matcher_factory` (Risk-2
mitigation).
"""

from gps_denied_onboard._types.matcher import (
    CandidateMatchSet,
    MatchResult,
    MatcherHealth,
)
from gps_denied_onboard.components.c3_matcher.config import C3MatcherConfig
from gps_denied_onboard.components.c3_matcher.errors import (
    InsufficientInliersError,
    MatcherBackboneError,
    MatcherError,
)
from gps_denied_onboard.components.c3_matcher.interface import CrossDomainMatcher
from gps_denied_onboard.config.schema import register_component_block

register_component_block("c3_matcher", C3MatcherConfig)

__all__ = [
    "C3MatcherConfig",
    "CandidateMatchSet",
    "CrossDomainMatcher",
    "InsufficientInliersError",
    "MatchResult",
    "MatcherBackboneError",
    "MatcherError",
    "MatcherHealth",
]
