# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os
import platform
import setuptools
import sys
import sysconfig
from datetime import date


def get_exe_suffix():
  if platform.system() == "Windows":
    return ".exe"
  else:
    return ""


def get_package_dir(prefix=("bindings", "python")):
  explicit_root = os.environ.get("PYIREE_PYTHON_ROOT")
  if explicit_root:
    return explicit_root

  # Use env variables based on build system type.
  cmake_build_root = os.environ.get("PYIREE_CMAKE_BUILD_ROOT")
  bazel_build_root = os.environ.get("PYIREE_BAZEL_BUILD_ROOT")

  if cmake_build_root and bazel_build_root:
    print("ERROR: Both PYIREE_CMAKE_BUILD_ROOT and PYIREE_BAZEL_BUILD_ROOT"
          " cannot be set at the same time")
    sys.exit(1)

  if cmake_build_root:
    print("Using CMake build root:", cmake_build_root)
    pkg_dir = os.path.join(cmake_build_root, *prefix)
  elif bazel_build_root:
    print("Using Bazel build root:", bazel_build_root)
    if not os.path.isdir(bazel_build_root):
      print("ERROR: Could not find bazel-bin:", bazel_build_root)
      sys.exit(1)
    # Find the path to the runfiles of the built target:
    #   //bindings/python/packaging:all_pyiree_packages
    runfiles_dir = os.path.join(
        bazel_build_root, "packaging", "python",
        "all_pyiree_packages%s.runfiles" % (get_exe_suffix(),))
    if not os.path.isdir(runfiles_dir):
      print("ERROR: Could not find build target 'all_pyiree_packages':",
            runfiles_dir)
      print("Make sure to build target",
            "//packaging/python:all_pyiree_packages")
      sys.exit(1)
    # And finally seek into the corresponding path in the runfiles dir.
    # Aren't bazel paths fun???
    # Note that the "iree_core" path segment corresponds to the workspace name.
    pkg_dir = os.path.join(runfiles_dir, "iree_core", *prefix)
  else:
    print("ERROR: No build directory specified. Set one of these variables:")
    print("  PYIREE_CMAKE_BUILD_ROOT=/path/to/cmake/build")
    sys.exit(1)

  if not os.path.exists(pkg_dir):
    print("ERROR: Package path does not exist:", pkg_dir)
    sys.exit(1)
  return pkg_dir


def get_default_date_version():
  today = date.today()
  return today.strftime("%Y%m%d")


def get_setup_defaults(sub_project, description, package_dir=None):
  if not package_dir:
    package_dir = get_package_dir()
  return {
      "name": "google-iree-%s" % (sub_project,),
      "version": get_default_date_version(),
      "author": "The IREE Team at Google",
      "author_email": "iree-discuss@googlegroups.com",
      "description": description,
      "long_description": description,
      "long_description_content_type": "text/plain",
      "url": "https://github.com/google/iree",
      "package_dir": {
          "": package_dir,
      },
      "classifiers": [
          "Programming Language :: Python :: 3",
          "License :: OSI Approved :: Apache License",
          "Operating System :: OS Independent",
          "Development Status :: 3 - Alpha",
      ],
      "python_requires": ">=3.6",
  }


def setup(**kwargs):
  # See: https://stackoverflow.com/q/45150304
  try:
    from wheel.bdist_wheel import bdist_wheel as _bdist_wheel

    class bdist_wheel(_bdist_wheel):

      def finalize_options(self):
        _bdist_wheel.finalize_options(self)
        self.root_is_pure = False
  except ImportError:
    bdist_wheel = None

  # Need to include platform specific extensions binaries:
  #  Windows: .pyd
  #  macOS: .dylib
  #  Other: .so
  # Unfortunately, bazel is imprecise and scatters .so files around, so
  # need to be specific.
  package_data = {
      "": ["*%s" % (sysconfig.get_config_var("EXT_SUFFIX"),)],
  }
  setuptools.setup(
      package_data=package_data,
      cmdclass={"bdist_wheel": bdist_wheel},
      **kwargs)
