# find PyPA build
execute_process(COMMAND ${Python_EXECUTABLE} -c "import build"
  RESULT_VARIABLE PYTHON_HAVE_PYPABUILD)

if(NOT PYTHON_HAVE_PYPABUILD EQUAL 0)
  message(WARNING
    "Prefer python module PyPA build; run python -m pip install build")
endif()

# figure the python major.minor version string
execute_process(COMMAND ${Python_EXECUTABLE} -c
  "import sys; print('.'.join(map(str,sys.version_info[:2])),end='')"
  OUTPUT_VARIABLE PYTHON_MAJMIN)
execute_process(COMMAND ${Python_EXECUTABLE} -c
  "import sys; print(sys.version_info[0],end='')"
  OUTPUT_VARIABLE PYTHON_MAJOR)

# list all python modules and files that create the package
set(DEPS
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/schemereader/__init__.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/schemereader/readcnf.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/schemereader/readmod.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/schemereader/readscheme.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/actions/changedco.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/actions/changemodule.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/actions/__init__.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/actions/inserttext.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/actions/policyaction.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/conditions/hasmodule.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/conditions/findpattern.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/conditions/usesdco.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/conditions/homedco.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/conditions/homedepend.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/conditions/__init__.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/conditions/policycondition.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/conditions/conditionand.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/conditions/conditionor.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/conditions/conditionnot.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/__init__.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/commobjects.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/githandler.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/machinemapping.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/matchreference.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/modules.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/param.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/policy.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/policylist.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/verboseprint.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/xmlutil.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/codegen/MemberSummary.py
  ${CMAKE_CURRENT_SOURCE_DIR}/duecautils/codegen/__init__.py
  ${CMAKE_CURRENT_SOURCE_DIR}/README.md
  ${CMAKE_CURRENT_SOURCE_DIR}/pyproject.toml
)

# add the target
set(DUVERSION 0.9)
add_custom_target(
  duecautils ALL
  DEPENDS
  dist/duecautils-${DUVERSION}.tar.gz
  dist/duecautils-${DUVERSION}-py${PYTHON_MAJOR}-none-any.whl
)

# find an installation folder for the Python packages; we know
# pyparsing is installed, since we need it for dco objects
if(NOT PYSITEDIR)
  execute_process(
    COMMAND ${Python_EXECUTABLE} -c
    "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
    OUTPUT_VARIABLE PYSITEDIR
    OUTPUT_STRIP_TRAILING_WHITESPACE)
  message(STATUS "Calculated python package install as ${PYSITEDIR}")
endif()

set(PYMOD_INSTALL_TYPE bdist_wheel)

# create folder for install
install(DIRECTORY DESTINATION ${PYSITEDIR})

# install the python package note that "DESTDIR" and
# "CMAKE_INSTALL_PREFIX" need to be kept intact, to allow substitution
# at the install stage
# this code gets executed by the build system (ninja, Makefile or the like)
install(CODE "execute_process(COMMAND bash -c \"${Python_EXECUTABLE} -m pip install --isolated --no-index --no-deps --target \$ENV{DESTDIR}/${PYSITEDIR} --find-links=${CMAKE_CURRENT_BINARY_DIR}/dist --upgrade duecautils\")")


if(PYTHON_HAVE_PYPABUILD EQUAL 0)
  # simple build with PyPA build, following PEP-517, PEP-518, using
  # setup.cfg, pyproject.toml
  message(NOTICE "Creating distutils package from pyproject.toml")

  # apparently works on Fedora, but totally fails on Ubuntu/debian,
  # because the vendor adaptations to pip insist on appending "local"
  # after the prefix.
  add_custom_command(
    OUTPUT
    dist/duecautils-${DUVERSION}.tar.gz
    dist/duecautils-${DUVERSION}-py${PYTHON_MAJOR}-none-any.whl

    BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/timestamp
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}

    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/dist
    COMMAND ${Python_EXECUTABLE} -m build --no-isolation --outdir ${CMAKE_CURRENT_BINARY_DIR}/dist
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/timestamp
    DEPENDS ${DEPS}
  )

else()
  message(NOTICE "Creating distutils package with setup.py")
  configure_file(setup.py.in setup.py @ONLY)
  add_custom_command(
    OUTPUT
    dist/duecautils-${DUVERSION}.tar.gz
    dist/duecautils-${DUVERSION}-py${PYTHON_MAJOR}-none-any.whl
    BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/timestamp

    COMMAND ${CMAKE_COMMAND} -E create_symlink
    ${CMAKE_CURRENT_SOURCE_DIR}/README.md
    ${CMAKE_CURRENT_BINARY_DIR}/README.md

    COMMAND ${CMAKE_COMMAND} -E create_symlink
    ${CMAKE_CURRENT_SOURCE_DIR}/duecautils
    ${CMAKE_CURRENT_BINARY_DIR}/duecautils

    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/dist
    COMMAND ${Python_EXECUTABLE} setup.py bdist_wheel
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/timestamp

    DEPENDS ${DEPS} ${CMAKE_CURRENT_BINARY_DIR}/setup.py
  )

endif()