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 
        _lightgbm_static 
        ${MEDIAL_INTERNAL_LIBS} 
        ${Python3_LIBRARIES} 
        ${Boost_LIBRARIES} 
        Boost::disable_autolinking
    )

    # 2. Force Whole Archive
    # We append the linker flag specifically for the libraries you want to embed.
    set_target_properties(medpython PROPERTIES 
        LINK_FLAGS "/WHOLEARCHIVE:xgboost /WHOLEARCHIVE:_lightgbm_static"
    )
elseif(APPLE)
    # --- MACOS ---
    target_link_libraries(medpython PRIVATE
        ${MEDIAL_INTERNAL_LIBS}
        ${Boost_LIBRARIES}
        xgboost
        _lightgbm_static
        OpenMP::OpenMP_CXX
    )

    set_target_properties(medpython PROPERTIES 
        LINK_FLAGS "-undefined dynamic_lookup"
    )
else()
    # --- LINUX ---
     if (USE_BOOST_SHARED_LIBS)
        target_link_libraries(medpython PRIVATE -Wl,-Bstatic,--whole-archive -Wl,--start-group ${MEDIAL_INTERNAL_LIBS} xgboost _lightgbm_static -Wl,--end-group -Wl,-no-whole-archive -Wl,-Bdynamic ${Boost_LIBRARIES})
    else()
        target_link_libraries(medpython PRIVATE -Wl,-Bstatic,--whole-archive -Wl,--start-group ${MEDIAL_INTERNAL_LIBS} ${Boost_LIBRARIES} xgboost _lightgbm_static -Wl,--end-group -Wl,-no-whole-archive -Wl,-Bdynamic)
    endif()
endif()
