"""
compat
======

Cross-compatible functions for different versions of Python.

Other items:
* platform checker
"""
import platform
import struct
import sys
import warnings

PY35 = sys.version_info[:2] == (3, 5)
PY36 = sys.version_info >= (3, 6)
PY37 = sys.version_info >= (3, 7)
PY38 = sys.version_info >= (3, 8)
PYPY = platform.python_implementation() == "PyPy"


# ----------------------------------------------------------------------------
# functions largely based / taken from the six module

# Much of the code in this module comes from Benjamin Peterson's six library.
# The license for this library can be found in LICENSES/SIX and the code can be
# found at https://bitbucket.org/gutworth/six


def set_function_name(f, name, cls):
    """
    Bind the name/qualname attributes of the function
    """
    f.__name__ = name
    f.__qualname__ = "{klass}.{name}".format(klass=cls.__name__, name=name)
    f.__module__ = cls.__module__
    return f


def raise_with_traceback(exc, traceback=Ellipsis):
    """
    Raise exception with existing traceback.
    If traceback is not passed, uses sys.exc_info() to get traceback.
    """
    if traceback == Ellipsis:
        _, _, traceback = sys.exc_info()
    raise exc.with_traceback(traceback)


# https://github.com/pandas-dev/pandas/pull/9123
def is_platform_little_endian():
    """ am I little endian """
    return sys.byteorder == "little"


def is_platform_windows():
    return sys.platform == "win32" or sys.platform == "cygwin"


def is_platform_linux():
    return sys.platform == "linux2"


def is_platform_mac():
    return sys.platform == "darwin"


def is_platform_32bit():
    return struct.calcsize("P") * 8 < 64


def _import_lzma():
    """Attempts to import lzma, warning the user when lzma is not available.
    """
    try:
        import lzma

        return lzma
    except ImportError:
        msg = (
            "Could not import the lzma module. "
            "Your installed Python is incomplete. "
            "Attempting to use lzma compression will result in a RuntimeError."
        )
        warnings.warn(msg)


def _get_lzma_file(lzma):
    """Returns the lzma method LZMAFile when the module was correctly imported.
    Otherwise, raises a RuntimeError.
    """
    if lzma is None:
        raise RuntimeError(
            "lzma module not available. "
            "A Python re-install with the proper "
            "dependencies might be required to solve this issue."
        )
    return lzma.LZMAFile
