#!/usr/bin/env python3
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
import glob
import io
import os
import shutil
import subprocess
from os import path
from typing import List

from setuptools import setup, find_packages

cwd = os.path.dirname(os.path.abspath(__file__))

version = "0.0.1"
try:
    if not os.getenv("RELEASE"):
        from datetime import date

        today = date.today()
        day = today.strftime("b%Y%m%d")
        version += day
except Exception:
    pass

requirements = [
    "importlib",
    "numpy",
    "Pillow",
    "mock",
    "torch",
    "pytorch_lightning",
    "opencv-python",
    "parameterized",
]


def d2go_gather_files(dst_module, file_path, extension="*") -> List[str]:
    """
    Return a list of files to include in d2go submodule. Copy over the corresponding files.
    """
    # Use absolute paths while symlinking.
    source_configs_dir = path.join(path.dirname(path.realpath(__file__)), file_path)
    destination = path.join(path.dirname(path.realpath(__file__)), "d2go", dst_module)
    # Symlink the config directory inside package to have a cleaner pip install.

    # Remove stale symlink/directory from a previous build.
    if path.exists(source_configs_dir):
        if path.islink(destination):
            os.unlink(destination)
        elif path.isdir(destination):
            shutil.rmtree(destination)

    if not path.exists(destination):
        try:
            os.symlink(source_configs_dir, destination)
        except OSError:
            # Fall back to copying if symlink fails: ex. on Windows.
            shutil.copytree(source_configs_dir, destination)

    config_paths = glob.glob(os.path.join(file_path + extension), recursive=True)
    return config_paths


def get_model_zoo_configs() -> List[str]:
    """
    Return a list of configs to include in package for model zoo. Copy over these configs inside
    d2go/model_zoo.
    """
    return d2go_gather_files(
        os.path.join("model_zoo", "configs"), "configs", "**/*.yaml"
    )


if __name__ == "__main__":
    setup(
        name="d2go",
        version=version,
        author="Mobile Vision",
        url="https://github.com/facebookresearch/d2go",
        description="D2Go",
        long_description=open("README.md").read(),
        long_description_content_type="text/markdown",
        license="Apache-2.0",
        install_requires=requirements,
        packages=find_packages(exclude=["tools", "tests"]),
        package_data={
            "d2go": [
                "LICENSE",
            ],
            "d2go.model_zoo": get_model_zoo_configs(),
            "d2go.tools": d2go_gather_files("tools", "tools", "**/*.py"),
            "d2go.tests": d2go_gather_files("tests", "tests", "**/*helper.py"),
        },
        entry_points={
            "console_scripts": [
                "d2go.exporter = d2go.tools.exporter:cli",
                "d2go.train_net = d2go.tools.train_net:cli",
            ]
        },
    )
