"""Analyzer registry for the analysis framework.

This module defines :class:`AnalyzerRegistry`, which manages analyzer
registration and lookup.  Registration rejects duplicate names.
"""

from __future__ import annotations

from analyzer.analyzer import Analyzer
from analyzer.exceptions import AnalyzerRegistrationError


class AnalyzerRegistry:
    """Registry for :class:`Analyzer` instances.

    Maintains analyzers in registration order.  Duplicate names are
    rejected.
    """

    def __init__(self) -> None:
        """Initialize an empty registry."""
        self._analyzers: dict[str, Analyzer] = {}

    def register(self, analyzer: Analyzer) -> None:
        """Register an analyzer.

        Args:
            analyzer: The analyzer to register.

        Raises:
            AnalyzerRegistrationError: If an analyzer with the same
                name is already registered.
        """
        if analyzer.name in self._analyzers:
            raise AnalyzerRegistrationError(
                f"Analyzer '{analyzer.name}' is already registered"
            )
        self._analyzers[analyzer.name] = analyzer

    def unregister(self, name: str) -> None:
        """Remove an analyzer from the registry.

        Args:
            name: The name of the analyzer to remove.

        Raises:
            KeyError: If no analyzer with the given name is registered.
        """
        if name not in self._analyzers:
            raise KeyError(f"Analyzer '{name}' is not registered")
        del self._analyzers[name]

    def list_analyzers(self) -> list[Analyzer]:
        """Return all registered analyzers in registration order.

        Returns:
            A list of :class:`Analyzer` instances.
        """
        return list(self._analyzers.values())

    def get(self, name: str) -> Analyzer:
        """Look up an analyzer by name.

        Args:
            name: The analyzer name to search for.

        Returns:
            The :class:`Analyzer` with the given name.

        Raises:
            KeyError: If no analyzer with the given name is registered.
        """
        if name not in self._analyzers:
            raise KeyError(f"Analyzer '{name}' is not registered")
        return self._analyzers[name]
