import sys
import logging
import os

from ._config import get_config, set_config, config_context

logger = logging.getLogger(__name__)


# PEP0440 compatible formatted version, see:
# https://www.python.org/dev/peps/pep-0440/
#
# Generic release markers:
#   X.Y
#   X.Y.Z   # For bugfix releases
#
# Admissible pre-release markers:
#   X.YaN   # Alpha release
#   X.YbN   # Beta release
#   X.YrcN  # Release Candidate
#   X.Y     # Final release
#
# Dev branch marker is: 'X.Y.dev' or 'X.Y.devN' where N is an integer.
# 'X.Y.dev0' is the canonical version of 'X.Y.dev'
#
# __version__ = "0.10.0"


# On OSX, we can get a runtime error due to multiple OpenMP libraries loaded
# simultaneously. This can happen for instance when calling BLAS inside a
# prange. Setting the following environment variable allows multiple OpenMP
# libraries to be loaded. It should not degrade performances since we manually
# take care of potential over-subcription performance issues, in sections of
# the code where nested OpenMP loops can happen, by dynamically reconfiguring
# the inner OpenMP runtime to temporarily disable it while under the scope of
# the outer OpenMP parallel section.
os.environ.setdefault("KMP_DUPLICATE_LIB_OK", "True")

# Workaround issue discovered in intel-openmp 2019.5:
# https://github.com/ContinuumIO/anaconda-issues/issues/11294
os.environ.setdefault("KMP_INIT_AT_FORK", "FALSE")

try:
    # This variable is injected in the __builtins__ by the build
    # process. It is used to enable importing subpackages of mlsauce when
    # the binaries are not built
    # mypy error: Cannot determine type of '__MLSAUCE_SETUP__'
    __MLSAUCE_SETUP__  # type: ignore
except NameError:
    __MLSAUCE_SETUP__ = False

if __MLSAUCE_SETUP__:
    sys.stderr.write("Partial import of mlsauce during the build process.\n")
    # We are not importing the rest of scikit-learn during the build
    # process, as it may not be compiled yet

else:
    from .adaopt import AdaOpt
    from .booster import LSBoostClassifier, LSBoostRegressor
    from .datasets import download
    from .elasticnet import ElasticNetRegressor
    from .lasso import LassoRegressor
    from .ridge import RidgeRegressor
    from .shapley import ShapExplainer
    from .stump import StumpClassifier    

    # from .encoders import corrtarget_encoder

    __all__ = [
        "AdaOpt",
        "LSBoostClassifier",
        "StumpClassifier",
        "ElasticNetRegressor",
        "LassoRegressor",
        "LSBoostRegressor",
        "RidgeRegressor",
        "ShapExplainer",
        # Other imports
        # "corrtarget_encoder",
        "download",
        # Non-modules:
        "get_config",
        "set_config",
        "config_context",
    ]


def setup_module(module):
    """Fixture for the tests to assure globally controllable seeding of RNGs"""
    import os
    import numpy as np
    import random

    # Check if a random seed exists in the environment, if not create one.
    _random_seed = os.environ.get("MLSAUCE_SEED", None)
    if _random_seed is None:
        _random_seed = np.random.uniform() * np.iinfo(np.int32).max
    _random_seed = int(_random_seed)
    print("I: Seeding RNGs with %r" % _random_seed)
    np.random.seed(_random_seed)
    random.seed(_random_seed)
