"""
Multidict implementation.

HTTP Headers and URL query string require specific data structure:
multidict. It behaves mostly like a dict but it can have
several values for the same key.
"""

import warnings
from pathlib import Path
from typing import TYPE_CHECKING, Any

from ._abc import MultiMapping, MutableMultiMapping
from ._compat import USE_EXTENSIONS

__all__ = (
    "CIMultiDict",
    "CIMultiDictProxy",
    "MultiDict",
    "MultiDictProxy",
    "MultiMapping",
    "MutableMultiMapping",
    "get_include",
    "getversion",
    "istr",
)

__version__ = "7.2.1"


if TYPE_CHECKING or not USE_EXTENSIONS:
    from ._multidict_py import (
        CIMultiDict,
        CIMultiDictProxy,
        MultiDict,
        MultiDictProxy,
        getversion,
        istr,
    )
else:
    from collections.abc import ItemsView, KeysView, ValuesView

    from ._multidict import (
        CIMultiDict,
        CIMultiDictProxy,
        MultiDict,
        MultiDictProxy,
        _ItemsView,
        _KeysView,
        _ValuesView,
        getversion,
        istr,
    )

    MultiMapping.register(MultiDictProxy)
    MutableMultiMapping.register(MultiDict)
    KeysView.register(_KeysView)
    ItemsView.register(_ItemsView)
    ValuesView.register(_ValuesView)


if TYPE_CHECKING:
    upstr = istr
else:

    def __getattr__(name: str) -> Any:
        if name == "upstr":
            warnings.warn(
                "upstr is deprecated, use istr instead",
                DeprecationWarning,
                stacklevel=2,
            )
            return istr
        raise AttributeError(f"module {__name__!r} has no attribute {name!r}")


def __dir__() -> list[str]:
    return [*globals(), "upstr"]


def get_include() -> str:
    """Return the directory containing multidict's C API headers.

    Pass it as an ``-I`` include path when building a C extension
    against ``multidict_capi.h``.
    """
    return str(Path(__file__).absolute().parent)
