#!/usr/bin/env python3
# Copyright (c)  2020  Xiaomi Corporation (author: Fangjun Kuang)
#                2022  Binbin Zhang(binbzha@qq.com)

import glob
import os
import shutil
import sys

import setuptools
from setuptools.command.build_ext import build_ext


def cmake_extension(name, *args, **kwargs) -> setuptools.Extension:
    kwargs["language"] = "c++"
    sources = []
    return setuptools.Extension(name, sources, *args, **kwargs)


class BuildExtension(build_ext):
    def build_extension(self, ext: setuptools.extension.Extension):
        os.makedirs(self.build_temp, exist_ok=True)
        os.makedirs(self.build_lib, exist_ok=True)

        cmake_args = os.environ.get("WENET_CMAKE_ARGS",
                                    "-DCMAKE_BUILD_TYPE=Release")
        if "PYTHON_EXECUTABLE" not in cmake_args:
            print(f"Setting PYTHON_EXECUTABLE to {sys.executable}")
            cmake_args += f" -DPYTHON_EXECUTABLE={sys.executable}"

        src_dir = os.path.dirname(os.path.abspath(__file__))
        os.system(f"cmake {cmake_args} -B {self.build_temp} -S {src_dir}")
        ret = os.system(f"""
            cmake --build {self.build_temp} --target _wenet --config Release
        """)
        if ret != 0:
            raise Exception(
                "\nBuild wenet failed. Please check the error message.\n"
                "You can ask for help by creating an issue on GitHub.\n"
                "\nClick:\n    https://github.com/wenet-e2e/wenet/issues/new\n"
            )

        libs = []
        for ext in ['so', 'pyd']:
            libs.extend(
                glob.glob(f"{self.build_temp}/**/_wenet*.{ext}",
                          recursive=True))
        for ext in ['so', 'dylib', 'dll']:
            libs.extend(
                glob.glob(f"{self.build_temp}/**/*wenet_api.{ext}",
                          recursive=True))

        for lib in libs:
            print(f"Copying {lib} to {self.build_lib}/")
            shutil.copy(f"{lib}", f"{self.build_lib}/")


def read_long_description():
    with open("README.md", encoding="utf8") as f:
        readme = f.read()
    return readme


package_name = "wenetruntime"

setuptools.setup(
    name=package_name,
    version='1.0.12',
    author="Binbin Zhang",
    author_email="binbzha@qq.com",
    package_dir={
        package_name: "py",
    },
    packages=[package_name],
    url="https://github.com/wenet-e2e/wenet",
    long_description=read_long_description(),
    long_description_content_type="text/markdown",
    ext_modules=[cmake_extension("_wenet")],
    cmdclass={"build_ext": BuildExtension},
    zip_safe=False,
    setup_requires=["tqdm"],
    install_requires=["torch", "tqdm"] if "ONNX=ON" not in
        os.environ.get("WENET_CMAKE_ARGS", "") else ["tqdm"],
    classifiers=[
        "Programming Language :: C++",
        "Programming Language :: Python :: 3",
        "Operating System :: OS Independent",
        "Topic :: Scientific/Engineering :: Artificial Intelligence",
    ],
    license="Apache licensed, as found in the LICENSE file",
)
