"""Define enum backports from the standard library."""
from __future__ import annotations

from enum import Enum
from typing import Any, TypeVar

_StrEnumSelfT = TypeVar("_StrEnumSelfT", bound="StrEnum")


class StrEnum(str, Enum):
    """Define a partial backport of Python 3.11's StrEnum."""

    def __new__(
        cls: type[_StrEnumSelfT], value: str, *args: Any, **kwargs: Any
    ) -> _StrEnumSelfT:
        """Create a new StrEnum instance.

        Args:
            value: The enum value.
            args: Additional args.
            kwargs: Additional kwargs.

        Returns:
            The enum.

        Raises:
            TypeError: Raised when an enumerated value isn't a string.
        """
        if not isinstance(value, str):
            raise TypeError(f"{value!r} is not a string")
        return super().__new__(cls, value, *args, **kwargs)

    def __str__(self) -> str:
        """Return self.value.

        Returns:
            The string value.
        """
        return str(self.value)

    @staticmethod
    def _generate_next_value_(
        name: str,
        start: int,
        count: int,
        last_values: list[Any],
    ) -> Any:
        """Make `auto()` explicitly unsupported.

        We may revisit this when it's very clear that Python 3.11's `StrEnum.auto()`
        behavior will no longer change.

        Args:
            name: The name of the enum.
            start: The starting index.
            count: The total number of enumerated values.
            last_values: Previously enumerated values.

        Raises:
            TypeError: Always raised.
        """
        raise TypeError("auto() is not supported by this implementation")
