# -*- cmake -*-

set(PYTHONINTERP_FOUND)

if (DEFINED ENV{PYTHON})
  # Allow python executable to be explicitly set
  set(python "$ENV{PYTHON}")
  set(PYTHONINTERP_FOUND ON)
elseif (WINDOWS)
  # On Windows, explicitly avoid Cygwin Python.

  # if the user has their own version of Python installed, prefer that
  foreach(hive HKEY_CURRENT_USER HKEY_LOCAL_MACHINE)
    # prefer more recent Python versions to older ones, if multiple versions
    # are installed
    foreach(pyver 3.13 3.12 3.11 3.10 3.9 3.8 3.7)
      list(APPEND regpaths "[${hive}\\SOFTWARE\\Python\\PythonCore\\${pyver}\\InstallPath]")
    endforeach()
  endforeach()

  # TODO: This logic has the disadvantage that if you have multiple versions
  # of Python installed, the selected path won't necessarily be the newest -
  # e.g. this GLOB will prefer Python310 to Python311. But since pymaybe is
  # checked AFTER the registry entries, this will only surface as a problem if
  # no installed Python appears in the registry.
  file(GLOB pymaybe
    "$ENV{PROGRAMFILES}/Python*"
##  "$ENV{PROGRAMFILES(X86)}/Python*"
    # The Windows environment variable is in fact as shown above, but CMake
    # disallows querying an environment variable containing parentheses -
    # thanks, Windows. Fudge by just appending " (x86)" to $PROGRAMFILES and
    # hoping for the best.
    "$ENV{PROGRAMFILES} (x86)/Python*"
    "c:/Python*")

  find_program(python
    NAMES python3.exe python.exe
    NO_DEFAULT_PATH # added so that cmake does not find cygwin python
    PATHS
    ${regpaths}
    ${pymaybe}
    )
  find_package(Python3 COMPONENTS Interpreter)
else()
  find_program(python python3)

  if (python)
    set(PYTHONINTERP_FOUND ON)
  endif (python)
endif (DEFINED ENV{PYTHON})

if (NOT python)
  message(FATAL_ERROR "No Python interpreter found")
endif (NOT python)

set(PYTHON_EXECUTABLE "${python}" CACHE FILEPATH "Python interpreter for builds")
mark_as_advanced(PYTHON_EXECUTABLE)
