"""Feature normalizer for the Music DNA Builder.

This module defines :class:`Normalizer`, which applies a
:class:`~features.definition.NormalizationStrategy` to a feature value.

The initial implementation returns all values unchanged.  Mathematical
normalization (minmax, log, zscore) will be implemented in a future
task.
"""

from __future__ import annotations

from features.definition import NormalizationStrategy
from music_dna.exceptions import NormalizationError


class Normalizer:
    """Normalizes feature values based on a normalization strategy.

    The initial implementation applies identity normalization for all
    strategies.  Future versions will implement mathematical
    transformations per strategy.
    """

    NORMALIZATION_VERSION = "1.0.0"

    def normalize(
        self,
        value: float | str | int | bool,
        strategy: NormalizationStrategy,
    ) -> float | str | int | bool:
        """Normalize a feature value using the given strategy.

        Args:
            value: The raw feature value.
            strategy: The normalization strategy to apply.

        Returns:
            The normalized value.  In the initial implementation,
            all strategies return the value unchanged.

        Raises:
            NormalizationError: If the strategy is not recognized.
        """
        if strategy in (
            NormalizationStrategy.IDENTITY,
            NormalizationStrategy.CATEGORICAL,
            NormalizationStrategy.NONE,
            NormalizationStrategy.MINMAX,
            NormalizationStrategy.LOG,
            NormalizationStrategy.ZSCORE,
        ):
            return value

        raise NormalizationError(f"Unsupported normalization strategy: {strategy}")
