cmake_minimum_required(VERSION 3.10)
cmake_policy(SET CMP0086 NEW)
cmake_policy(SET CMP0078 NEW)

#execute_process(COMMAND swig -python medpython.i
#  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE})

#This always finds the system's python installtion
#FIND_PACKAGE(PythonLibs)
message("*********************************************")
if("${Python3_INCLUDE_DIRS}" STREQUAL "")
    message(FATAL_ERROR "Could not find PYTHON_INCLUDE_DIR")
endif()
message("*********************************************")

# Numpy:
execute_process(
    COMMAND "${Python3_EXECUTABLE}" -c "import numpy; print(numpy.get_include())"
    OUTPUT_VARIABLE Python3_NumPy_INCLUDE_DIR
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

# 3. Verify it was found
if(NOT EXISTS "${Python3_NumPy_INCLUDE_DIR}")
    message(FATAL_ERROR "NumPy headers not found. Please install numpy.")
endif()

# 4. Add to includes
message(STATUS "NumPy Headers found: ${Python3_NumPy_INCLUDE_DIR}")
INCLUDE_DIRECTORIES(${Python3_NumPy_INCLUDE_DIR})

ADD_CUSTOM_TARGET(apply_directives
                  COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/scripts/make_apply.py" "${CMAKE_CURRENT_SOURCE_DIR}/../../MedPyExport/" "${CMAKE_CURRENT_SOURCE_DIR}/apply_directives.i" 
                  COMMENT "Running make_apply.py" 
                  VERBATIM )


INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
INCLUDE_DIRECTORIES(${Python3_INCLUDE_DIRS})

file(GLOB MedPyHeaders "${CMAKE_CURRENT_SOURCE_DIR}/../../MedPyExport/*.h")

set(GENERATED_SWIG_FILE "${CMAKE_CURRENT_BINARY_DIR}/autogenerated_includes.i")
file(WRITE ${GENERATED_SWIG_FILE} "// Auto-generated by CMake - DO NOT EDIT\n")

foreach(header ${MedPyHeaders})
    # We use get_filename_component to get just "MyHeader.h" 
    # because we already added the folder to INCLUDE_DIRECTORIES above.
    get_filename_component(HEADER_NAME ${header} NAME)
    file(APPEND ${GENERATED_SWIG_FILE} "%include \"${HEADER_NAME}\"\n")
endforeach()
message("Created ${GENERATED_SWIG_FILE} based on ${CMAKE_CURRENT_SOURCE_DIR}")

SET(CMAKE_SWIG_FLAGS "")
SET_SOURCE_FILES_PROPERTIES(medpython.i PROPERTIES CPLUSPLUS ON)
SET_SOURCE_FILES_PROPERTIES(medpython.i PROPERTIES SWIG_FLAGS "")
message("\n*********************************************\n${CMAKE_CXX_FLAGS}\n*********************************************\n")
file(GLOB CppFiles ${CMAKE_CURRENT_SOURCE_DIR}/../../MedPyExport/*.cpp)
file(GLOB HeaderFiles ${CMAKE_CURRENT_SOURCE_DIR}/../../MedPyExport/*.h)



set(SWIG_MODULE_medpython_EXTRA_DEPS MedPython.h MedPython.h ${HeaderFiles} apply_directives pythoncode.i)

set_property(SOURCE medpython.i PROPERTY SWIG_MODULE_NAME medpython)

swig_add_library(medpython LANGUAGE python SOURCES medpython.i ${CppFiles})


if(WIN32)
    TARGET_LINK_LIBRARIES(medpython PRIVATE 
        ${XGBOOST_TARGET} 
        ${LIGHTGBM_TARGET}
        ${MEDIAL_INTERNAL_LIBS} 
        ${Python3_LIBRARIES}
    )

    # 2. Force Whole Archive
    # We append the linker flag specifically for the libraries you want to embed.
    if(XGBOOST_STATIC_FALLBACK)
        target_link_options(medpython PRIVATE "/WHOLEARCHIVE:xgboost.lib")
    endif()
    
    if(LIGHTGBM_STATIC_FALLBACK)
        target_link_options(medpython PRIVATE "/WHOLEARCHIVE:lib_lightgbm.lib")
    endif()

    if(XGBOOST_STATIC_FALLBACK OR LIGHTGBM_STATIC_FALLBACK)
        target_link_options(medpython PRIVATE 
            "/FORCE:MULTIPLE" 
            "/NODEFAULTLIB:libcmt.lib"
        )
    endif()
elseif(APPLE)
    # --- MACOS ---
    target_link_libraries(medpython PRIVATE
        ${MEDIAL_INTERNAL_LIBS}
        ${XGBOOST_TARGET} 
        ${LIGHTGBM_TARGET}
        OpenMP::OpenMP_CXX
    )

    set_target_properties(medpython PROPERTIES 
        LINK_FLAGS "-undefined dynamic_lookup"
    )
else()
    set(LINUX_STATIC_WHOLE_ARCHIVES ${MEDIAL_INTERNAL_LIBS})
    set(LINUX_DYNAMIC_LIBS "")

    if(XGBOOST_STATIC_FALLBACK)
        list(APPEND LINUX_STATIC_WHOLE_ARCHIVES ${XGBOOST_TARGET})
    else()
        list(APPEND LINUX_DYNAMIC_LIBS ${XGBOOST_TARGET})
    endif()

    if(LIGHTGBM_STATIC_FALLBACK)
        list(APPEND LINUX_STATIC_WHOLE_ARCHIVES ${LIGHTGBM_TARGET})
    else()
        list(APPEND LINUX_DYNAMIC_LIBS ${LIGHTGBM_TARGET})
    endif()

    # --- LINUX ---
    target_link_libraries(medpython PRIVATE 
        -Wl,-Bstatic,--whole-archive -Wl,--start-group 
        ${LINUX_STATIC_WHOLE_ARCHIVES} 
        -Wl,--end-group -Wl,-no-whole-archive -Wl,-Bdynamic
        ${LINUX_DYNAMIC_LIBS}
    )
endif()
