#!/usr/bin/env python
# coding=utf-8

import importlib
from sacred.utils import modules_exist
from sacred.utils import get_package_version, parse_version


def optional_import(*package_names):
    try:
        packages = [importlib.import_module(pn) for pn in package_names]
        return True, packages[0]
    except ImportError:
        return False, None


def get_tensorflow():
    # Ensures backward and forward compatibility with TensorFlow 1 and 2.
    if get_package_version("tensorflow") < parse_version("1.13.1"):
        import warnings

        warnings.warn(
            "Use of TensorFlow 1.12 and older is deprecated. "
            "Use Tensorflow 1.13 or newer instead.",
            DeprecationWarning,
        )
        import tensorflow as tf
    else:
        import tensorflow.compat.v1 as tf
    return tf


# Get libc in a cross-platform way and use it to also flush the c stdio buffers
# credit to J.F. Sebastians SO answer from here:
# http://stackoverflow.com/a/22434262/1388435
try:
    import ctypes
    from ctypes.util import find_library
except ImportError:
    libc = None
else:
    try:
        libc = ctypes.cdll.msvcrt  # Windows
    except OSError:
        libc = ctypes.cdll.LoadLibrary(find_library("c"))


has_numpy, np = optional_import("numpy")
has_yaml, yaml = optional_import("yaml")
has_pandas, pandas = optional_import("pandas")

has_sqlalchemy = modules_exist("sqlalchemy")
has_mako = modules_exist("mako")
has_tinydb = modules_exist("tinydb", "tinydb_serialization", "hashfs")
has_tensorflow = modules_exist("tensorflow")
