import sys
from pathlib import Path
from typing import List

import skbuild

"""
Install python wrapper of Virtual Fluids
install via python:
    python setup.py install
    set CMAKE Flags via -DBUILD_VF_GPU:BOOL=ON
    CMAKE flags have to be separated by -- 
    example: python setup.py install -- -DBUILD_VF_CPU:BOOL=ON
or install via pip:
    pip install .
    for pip>21:
        set CMAKE Flags via --config-settings "-DBUILD_VF_GPU=ON"
        example: pip install . --config-settings="-DBUILD_VF_GPU=ON"
        each option has to be passed in individually i.e --config-settings="-DOPT1=ON" --config-settings="-DOPT2=OFF"
    for pip <21:
        set CMAKE Flags via --global-option ="-DBUILD_VF_GPU=ON"
        example: pip install . --global-option="-DBUILD_VF_GPU=ON"
"""

package_name = "pyfluids"
target = "python_bindings"
src_dir = "pythonbindings"
stub_package = package_name+"-stubs"

stub_dir = Path(src_dir)/stub_package


def add_subfiles(dir_path: Path, suffix: str, root_dir: Path) -> List[str]:
    files = []
    for f in dir_path.iterdir():
        if f.is_dir():
            files.extend(add_subfiles(f, suffix, root_dir))
        if f.is_file():
            if f.suffix != suffix:
                continue
            files.append(str(f.relative_to(root_dir)))
    return files

def add_directory(dir_path: Path, suffix: str):
    return add_subfiles(dir_path, suffix, dir_path)

stub_files = add_directory(stub_dir, ".pyi")

# hack to get config-args for installation with pip>21
cmake_args = []
if "config_args" in locals():
    cmake_args.extend([f"{k}={v}" for k, v in locals()["config_args"].items()])

cmake_args += [
        f"-DPython3_ROOT_DIR={Path(sys.prefix)}",
        "-DBUILD_VF_PYTHON_BINDINGS=ON",
        "-DBUILD_SHARED_LIBS=OFF",
        "-DBUILD_VF_DOUBLE_ACCURACY=OFF",
        "-DBUILD_VF_UNIT_TESTS:BOOL=OFF",
        "-DBUILD_WARNINGS_AS_ERRORS=OFF",
    ]

skbuild.setup(
    name=package_name,
    packages=[package_name, "pymuparser", "pyfluids-stubs"],
    package_dir={"": src_dir},
    cmake_args=cmake_args,
    cmake_install_target=target,
    package_data={  "pyfluids": ["py.typed"],
                    "pyfluids-stubs": stub_files},
    include_package_data=True,
)