"""
A facade for either :mod:`unittest.mock` or its `rolling backport`__, if it is
installed, with a preference for the latter as it may well have newer functionality
and bugfixes.

The facade also contains any bugfixes that are critical to the operation of
functionality provided by testfixtures.

__ https://mock.readthedocs.io
"""
import sys

backport_version: tuple[int, int, int] | None

try:
    from mock import *
    from mock.mock import _Call, _Sentinel
    from mock.mock import call as mock_call
    from mock import version_info as backport_version
except ImportError:
    backport_version = None
    class MockCall:
        pass
    mock_call = MockCall()  # type: ignore[assignment]
    from unittest.mock import *  # type: ignore[assignment]
    from unittest.mock import _Call, _Sentinel  # type: ignore[assignment]


has_backport = backport_version is not None

# Explicit re-export list for mypy's no_implicit_reexport
__all__ = [
    'Mock', 'MagicMock', 'patch', 'sentinel', 'DEFAULT', 'ANY', 'call',
    'create_autospec', 'AsyncMock', 'ThreadingMock', 'FILTER_DIR',
    'NonCallableMock', 'NonCallableMagicMock', 'mock_open', 'PropertyMock', 'seal',
    '_Call', '_Sentinel', 'mock_call', 'backport_version', 'has_backport', 'parent_name',
]

if not (
        (has_backport and backport_version[:3] > (2, 0, 0)) or  # type: ignore[index]
        (sys.version_info < (3, 0, 0) and not has_backport) or
        (3, 6, 7) < sys.version_info[:3] < (3, 7, 0) or
        sys.version_info[:3] > (3, 7, 1)
):  # pragma: no cover
    raise ImportError('Please upgrade Python (you have {}) or Mock Backport (You have {})'.format(
        sys.version_info, backport_version
    ))
parent_name = '_mock_parent'
