from typing import Any, Final, final

class ComplexEnum:
    @final
    class EmptyStruct(ComplexEnum):
        __match_args__: Final = ()
        def __new__(cls, /) -> ComplexEnum.EmptyStruct: ...

    @final
    class Float(ComplexEnum):
        __match_args__: Final = ("f",)
        def __new__(cls, /, f: float) -> ComplexEnum.Float: ...
        @property
        def f(self, /) -> float: ...

    @final
    class Int(ComplexEnum):
        """
        A struct variant
        """

        __match_args__: Final = ("i",)
        def __new__(cls, /, i: int) -> ComplexEnum.Int: ...
        @property
        def i(self, /) -> int:
            """
            An integer
            """

    @final
    class MultiFieldStruct(ComplexEnum):
        __match_args__: Final = ("a", "b", "c")
        def __new__(
            cls, /, a: int, b: float, c: bool
        ) -> ComplexEnum.MultiFieldStruct: ...
        @property
        def a(self, /) -> int: ...
        @property
        def b(self, /) -> float: ...
        @property
        def c(self, /) -> bool: ...

    @final
    class Str(ComplexEnum):
        __match_args__: Final = ("s",)
        def __new__(cls, /, s: str) -> ComplexEnum.Str: ...
        @property
        def s(self, /) -> str: ...

    @final
    class VariantWithDefault(ComplexEnum):
        __match_args__: Final = ("a", "b")
        def __new__(
            cls, /, a: int = 42, b: str | None = None
        ) -> ComplexEnum.VariantWithDefault: ...
        @property
        def a(self, /) -> int: ...
        @property
        def b(self, /) -> str | None: ...

class MixedComplexEnum:
    @final
    class Empty(MixedComplexEnum):
        __match_args__: Final = ()
        def __getitem__(self, key: int, /) -> Any: ...
        def __len__(self, /) -> int: ...
        def __new__(cls, /) -> MixedComplexEnum.Empty: ...

    @final
    class Nothing(MixedComplexEnum):
        __match_args__: Final = ()
        def __new__(cls, /) -> MixedComplexEnum.Nothing: ...

@final
class SimpleEnum:
    Friday: Final[SimpleEnum]
    Monday: Final[SimpleEnum]
    Saturday: Final[SimpleEnum]
    Sunday: Final[SimpleEnum]
    """
    A variant
    """
    Thursday: Final[SimpleEnum]
    Tuesday: Final[SimpleEnum]
    Wednesday: Final[SimpleEnum]
    def __eq__(self, value: object, /) -> bool: ...
    def __int__(self, /) -> int: ...
    def __ne__(self, value: object, /) -> bool: ...
    def __repr__(self, /) -> str: ...

@final
class SimpleEnumWithoutDerive:
    A: Final[SimpleEnumWithoutDerive]
    B: Final[SimpleEnumWithoutDerive]
    def __int__(self, /) -> int: ...
    def __repr__(self, /) -> str: ...

class SimpleTupleEnum:
    @final
    class Int(SimpleTupleEnum):
        __match_args__: Final = ("_0",)
        @property
        def _0(self, /) -> int: ...
        def __getitem__(self, key: int, /) -> Any: ...
        def __len__(self, /) -> int: ...
        def __new__(cls, /, _0: int) -> SimpleTupleEnum.Int: ...

    @final
    class Str(SimpleTupleEnum):
        __match_args__: Final = ("_0",)
        @property
        def _0(self, /) -> str: ...
        def __getitem__(self, key: int, /) -> Any: ...
        def __len__(self, /) -> int: ...
        def __new__(cls, /, _0: str) -> SimpleTupleEnum.Str: ...

class TupleEnum:
    @final
    class EmptyTuple(TupleEnum):
        __match_args__: Final = ()
        def __getitem__(self, key: int, /) -> Any: ...
        def __len__(self, /) -> int: ...
        def __new__(cls, /) -> TupleEnum.EmptyTuple: ...

    @final
    class Full(TupleEnum):
        __match_args__: Final = ("_0", "_1", "_2")
        @property
        def _0(self, /) -> int: ...
        @property
        def _1(self, /) -> float: ...
        @property
        def _2(self, /) -> bool: ...
        def __getitem__(self, key: int, /) -> Any: ...
        def __len__(self, /) -> int: ...
        def __new__(cls, /, _0: int, _1: float, _2: bool) -> TupleEnum.Full: ...

    @final
    class FullWithDefault(TupleEnum):
        """
        A tuple variant
        """

        __match_args__: Final = ("_0", "_1", "_2")
        @property
        def _0(self, /) -> int: ...
        @property
        def _1(self, /) -> float: ...
        @property
        def _2(self, /) -> bool: ...
        def __getitem__(self, key: int, /) -> Any: ...
        def __len__(self, /) -> int: ...
        def __new__(
            cls, /, _0: int = 1, _1: float = 1.0, _2: bool = True
        ) -> TupleEnum.FullWithDefault: ...

def do_complex_stuff(thing: ComplexEnum) -> ComplexEnum: ...
def do_mixed_complex_stuff(thing: MixedComplexEnum) -> MixedComplexEnum: ...
def do_simple_stuff(thing: SimpleEnum) -> SimpleEnum: ...
def do_tuple_stuff(thing: TupleEnum) -> TupleEnum: ...
