"""Library information."""
from __future__ import absolute_import

import os
import pathlib
import sys


def find_lib_path(name=None, search_path=None, optional=False):
    """Find dynamic library files.

    Parameters
    ----------
    name : list of str
        List of names to be found.

    Returns
    -------
    lib_path : list(string)
        List of all found path to the libraries
    """
    # See https://github.com/dmlc/tvm/issues/281 for some background.

    # NB: This will either be the source directory (if DGL is run
    # inplace) or the install directory (if DGL is installed).
    # An installed DGL's curr_path will look something like:
    #   $PREFIX/lib/python3.6/site-packages/dgl/_ffi
    ffi_dir = os.path.dirname(os.path.abspath(os.path.expanduser(__file__)))
    source_dir = os.path.join(ffi_dir, "..", "..", "..")
    install_lib_dir = os.path.join(ffi_dir, "..", "..", "..", "..")

    dll_path = []

    if os.environ.get("DGL_LIBRARY_PATH", None):
        dll_path.append(os.environ["DGL_LIBRARY_PATH"])

    if sys.platform.startswith("linux") and os.environ.get(
        "LD_LIBRARY_PATH", None
    ):
        dll_path.extend(
            [p.strip() for p in os.environ["LD_LIBRARY_PATH"].split(":")]
        )
    elif sys.platform.startswith("darwin") and os.environ.get(
        "DYLD_LIBRARY_PATH", None
    ):
        dll_path.extend(
            [p.strip() for p in os.environ["DYLD_LIBRARY_PATH"].split(":")]
        )

    # Pip lib directory
    dll_path.append(os.path.join(ffi_dir, ".."))
    # Default cmake build directory
    dll_path.append(os.path.join(source_dir, "build"))
    dll_path.append(os.path.join(source_dir, "build", "Release"))
    # Default make build directory
    dll_path.append(os.path.join(source_dir, "lib"))

    dll_path.append(install_lib_dir)

    if search_path is not None:
        if isinstance(search_path, (list, tuple, set)):
            dll_path = dll_path + list(search_path)
        elif isinstance(search_path, str):
            dll_path.append(search_path)
        else:
            raise ValueError(
                "type(search_path)={} is invalid".format(type(search_path))
            )
    dll_path = [
        str(x.absolute()) if isinstance(x, pathlib.Path) else os.path.abspath(x)
        for x in dll_path
    ]

    if name is None:
        if sys.platform.startswith("win32"):
            name = ["libdgl.dll", "dgl.dll"]
        elif sys.platform.startswith("darwin"):
            name = "libdgl.dylib"
        else:
            name = "libdgl.so"

    if isinstance(name, str):
        name = [name]

    lib_dll_path = []
    for n in name:
        lib_dll_path += [os.path.join(p, n) for p in dll_path]

    lib_found = [p for p in lib_dll_path if os.path.isfile(p)]

    if not lib_found:
        message = (
            "Cannot find the files.\n"
            + "List of candidates:\n"
            + str("\n".join(lib_dll_path))
        )
        if not optional:
            raise RuntimeError(message)
        return None

    return lib_found


# current version
# We use the version of the incoming release for code
# that is under development.
# The following line is set by dgl/python/update_version.py
__version__ = "1.1.1"
