# coding: utf-8
# pylint: disable=invalid-name, exec-used
"""Setup lightgbm package."""
from __future__ import absolute_import

import struct
import os
import sys
import getopt
import distutils
import shutil
from distutils import dir_util
from distutils import file_util
from setuptools import find_packages, setup

if __name__ == "__main__":
    build_sdist = sys.argv[1] == 'sdist'
    if (8 * struct.calcsize("P")) != 64:
        raise Exception('Cannot install LightGBM in 32-bit python, please use 64-bit python instead.')
    use_gpu = False
    use_mingw = False
    use_precompile = False
    try:
        opts, args = getopt.getopt(sys.argv[2:], 'mgp', ['mingw', 'gpu', 'precompile'])
        for opt, arg in opts:
            if opt in ('-m', '--mingw'):
                use_mingw = True
            elif opt in ('-g', '--gpu'):
                use_gpu = True
            elif opt in ('-p', '--precompile'):
                use_precompile = True
        sys.argv = sys.argv[0:2]
    except getopt.GetoptError as err:
        pass
    if not use_precompile or build_sdist:
        if not os.path.isfile('./_IS_SOURCE_PACKAGE.txt'):
            if os.path.exists("../include"):
                if os.path.exists("./lightgbm/include"):
                    shutil.rmtree('./lightgbm/include')
                distutils.dir_util.copy_tree("../include", "./lightgbm/include")
            else:
                raise Exception('Cannot copy ../include folder')
            if os.path.exists("../src"):
                if os.path.exists("./lightgbm/src"):
                    shutil.rmtree('./lightgbm/src')
                distutils.dir_util.copy_tree("../src", "./lightgbm/src")
            else:
                raise Exception('Cannot copy ../src folder')
            if use_gpu:
                if os.path.exists("../compute"):
                    if os.path.exists("./lightgbm/compute"):
                        shutil.rmtree('./lightgbm/compute')
                    distutils.dir_util.copy_tree("../compute", "./lightgbm/compute")
                else:
                    raise Exception('Cannot copy ../compute folder')
            distutils.file_util.copy_file("../CMakeLists.txt", "./lightgbm/")
            distutils.file_util.copy_file("../VERSION.txt", "./lightgbm/")
            if build_sdist:
                file_flag = open("./_IS_SOURCE_PACKAGE.txt", 'w')
                file_flag.close()

        if not os.path.exists("build"):
            os.makedirs("build")
        os.chdir("build")

        cmake_cmd = "cmake "
        build_cmd = "make _lightgbm"

        if os.name == "nt":
            if use_mingw:
                cmake_cmd = cmake_cmd + " -G \"MinGW Makefiles\" "
                build_cmd = "mingw32-make.exe _lightgbm"
            else:
                cmake_cmd = cmake_cmd + " -DCMAKE_GENERATOR_PLATFORM=x64 "
                build_cmd = "cmake --build . --target _lightgbm  --config Release"
        if use_gpu:
            cmake_cmd = cmake_cmd + " -DUSE_GPU=ON "
        if not build_sdist:
            print("Start to compile libarary.")
            os.system(cmake_cmd + " ../lightgbm/")
            os.system(build_cmd)
        os.chdir("..")

    data_files = []

    if build_sdist:
        print("remove library when building source distribution")
        if os.path.exists("./lightgbm/Release/"):
            shutil.rmtree('./lightgbm/Release/')
        if os.path.isfile('./lightgbm/lib_lightgbm.so'):
            os.remove('./lightgbm/lib_lightgbm.so')
    else:
        sys.path.insert(0, '.')
        CURRENT_DIR = os.path.dirname(__file__)
        libpath_py = os.path.join(CURRENT_DIR, 'lightgbm/libpath.py')
        libpath = {'__file__': libpath_py}
        exec(compile(open(libpath_py, "rb").read(), libpath_py, 'exec'), libpath, libpath)

        LIB_PATH = [os.path.relpath(path, CURRENT_DIR) for path in libpath['find_lib_path']()]
        print("Install lib_lightgbm from: %s" % LIB_PATH)
        data_files = [('lightgbm', LIB_PATH)]
    version = '2.0.1'
    if os.path.isfile('./lightgbm/VERSION.txt'):
        version = open('./lightgbm/VERSION.txt').read().strip()
    elif os.path.isfile('../VERSION.txt'):
        version = open('../VERSION.txt').read().strip()
    setup(name='lightgbm',
          version=version,
          description='LightGBM Python Package',
          install_requires=[
              'numpy',
              'scipy',
              'scikit-learn'
          ],
          maintainer='Guolin Ke',
          maintainer_email='guolin.ke@microsoft.com',
          zip_safe=False,
          packages=find_packages(),
          include_package_data=True,
          data_files=data_files,
          license='The MIT License(https://github.com/Microsoft/LightGBM/blob/master/LICENSE)',
          url='https://github.com/Microsoft/LightGBM')
    if build_sdist and os.path.isfile('./_IS_SOURCE_PACKAGE.txt'):
        os.remove('./_IS_SOURCE_PACKAGE.txt')
