from __future__ import annotations

from typing import Literal


class LoggerBufferConfig:
    """
    Configuration for log buffering behavior.
    """

    # Define class-level constant for valid log levels
    VALID_LOG_LEVELS: list[str] = ["DEBUG", "INFO", "WARNING"]
    LOG_LEVEL_BUFFER_VALUES = Literal["DEBUG", "INFO", "WARNING"]

    def __init__(
        self,
        max_bytes: int = 20480,
        buffer_at_verbosity: LOG_LEVEL_BUFFER_VALUES = "DEBUG",
        flush_on_error_log: bool = True,
    ):
        """
        Initialize logger buffer configuration.

        Parameters
        ----------
        max_bytes : int, optional
            Maximum size of the buffer in bytes
        buffer_at_verbosity : str, optional
            Minimum log level to buffer
        flush_on_error_log : bool, optional
            Whether to flush the buffer when an error occurs
        """
        self._validate_inputs(max_bytes, buffer_at_verbosity, flush_on_error_log)

        self._max_bytes = max_bytes
        self._buffer_at_verbosity = buffer_at_verbosity.upper()
        self._flush_on_error_log = flush_on_error_log

    def _validate_inputs(
        self,
        max_bytes: int,
        buffer_at_verbosity: str,
        flush_on_error_log: bool,
    ) -> None:
        """
        Validate configuration inputs.

        Parameters
        ----------
        Same as __init__ method parameters
        """
        if not isinstance(max_bytes, int) or max_bytes <= 0:
            raise ValueError("Max size must be a positive integer")

        if not isinstance(buffer_at_verbosity, str):
            raise ValueError("Log level must be a string")

        # Validate log level
        if buffer_at_verbosity.upper() not in self.VALID_LOG_LEVELS:
            raise ValueError(f"Invalid log level. Must be one of {self.VALID_LOG_LEVELS}")

        if not isinstance(flush_on_error_log, bool):
            raise ValueError("flush_on_error must be a boolean")

    @property
    def max_bytes(self) -> int:
        """Maximum buffer size in bytes."""
        return self._max_bytes

    @property
    def buffer_at_verbosity(self) -> str:
        """Minimum log level to buffer."""
        return self._buffer_at_verbosity

    @property
    def flush_on_error_log(self) -> bool:
        """Flag to flush buffer on error."""
        return self._flush_on_error_log