from __future__ import annotations

import typing as t

from .extension import SQLAlchemy

__version__ = "3.0.3"

__all__ = [
    "SQLAlchemy",
]

_deprecated_map = {
    "Model": ".model.Model",
    "DefaultMeta": ".model.DefaultMeta",
    "Pagination": ".pagination.Pagination",
    "BaseQuery": ".query.Query",
    "get_debug_queries": ".record_queries.get_recorded_queries",
    "SignallingSession": ".session.Session",
    "before_models_committed": ".track_modifications.before_models_committed",
    "models_committed": ".track_modifications.models_committed",
}


def __getattr__(name: str) -> t.Any:
    import importlib
    import warnings

    if name in _deprecated_map:
        path = _deprecated_map[name]
        import_path, _, new_name = path.rpartition(".")
        action = "moved and renamed"

        if new_name == name:
            action = "moved"

        warnings.warn(
            f"'{name}' has been {action} to '{path[1:]}'. The top-level import is"
            " deprecated and will be removed in Flask-SQLAlchemy 3.1.",
            DeprecationWarning,
            stacklevel=2,
        )
        mod = importlib.import_module(import_path, __name__)
        return getattr(mod, new_name)

    raise AttributeError(name)
