#------------------------------------------------------------------------
# -*- mode: cmake -*-
#------------------------------------------------------------------------
#
# LDASTools frameCPP SWIG - Test suite
#
# Copyright (C) 2024 California Institute of Technology
#
#------------------------------------------------------------------------

cmake_minimum_required(VERSION 3.12...4.0)

# Test to verify SWIG type definitions match C++ implementation
add_executable(test_type_compatibility test_type_compatibility.cc)

# Use LDAS Tools boost detection macros (auto-included via FindAxLDASTools)
# Boost 1.69 is minimum requirement, platform-aware detection
cx_boost_base(1.69 VERBOSE)
cx_boost_filesystem(VERBOSE)
cx_boost_system(VERBOSE)

# Use either autotools-style variables or modern CMake targets
set(BOOST_TARGETS ${BOOST_FILESYSTEM_LIB} ${BOOST_SYSTEM_LIB})

# Debug: Print available libraries and paths
message(STATUS "LDASTOOLS_LIBRARIES: ${LDASTOOLS_LIBRARIES}")
message(STATUS "LDASTOOLS_LIBRARY_DIRS: ${LDASTOOLS_LIBRARY_DIRS}")
message(STATUS "LDASTOOLS_LDFLAGS: ${LDASTOOLS_LDFLAGS}")
message(STATUS "LDASTOOLS_LINK_LIBRARIES: ${LDASTOOLS_LINK_LIBRARIES}")

# Debug boost variables
message(STATUS "BOOST_FILESYSTEM_LIB: ${BOOST_FILESYSTEM_LIB}")
message(STATUS "BOOST_SYSTEM_LIB: ${BOOST_SYSTEM_LIB}")
message(STATUS "BOOST_TARGETS: ${BOOST_TARGETS}")
message(STATUS "BOOST_LDFLAGS: ${BOOST_LDFLAGS}")
message(STATUS "BOOST_LIBRARIES: ${BOOST_LIBRARIES}")
message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}")
message(STATUS "Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}")

# Try different boost linking approaches
set(BOOST_LIBS_TO_USE "")

# Check if modern Boost targets are available
if(TARGET Boost::filesystem AND TARGET Boost::system)
    message(STATUS "Using modern Boost targets")
    set(BOOST_LIBS_TO_USE Boost::filesystem Boost::system)
elseif(BOOST_TARGETS)
    message(STATUS "Using cx_boost variables: ${BOOST_TARGETS}")
    set(BOOST_LIBS_TO_USE ${BOOST_TARGETS})
elseif(BOOST_LIBRARIES)
    message(STATUS "Using BOOST_LIBRARIES: ${BOOST_LIBRARIES}")
    set(BOOST_LIBS_TO_USE ${BOOST_LIBRARIES})
else()
    message(STATUS "Falling back to explicit boost library names")
    set(BOOST_LIBS_TO_USE boost_filesystem boost_system)
endif()

# Add boost library directories if available
if(Boost_LIBRARY_DIRS)
    target_link_directories(test_type_compatibility PRIVATE ${Boost_LIBRARY_DIRS})
endif()

# Use pkg-config style linking which includes library paths
if(LDASTOOLS_LDFLAGS)
    # Add all linker flags from pkg-config (includes -L paths and -l libraries)
    target_link_options(test_type_compatibility PRIVATE ${LDASTOOLS_LDFLAGS})
    # Still need to add boost libraries separately
    target_link_libraries(test_type_compatibility ${BOOST_LIBS_TO_USE})
else()
    # Fallback: manually add library directories and libraries
    if(LDASTOOLS_LIBRARY_DIRS)
        target_link_directories(test_type_compatibility PRIVATE ${LDASTOOLS_LIBRARY_DIRS})
    endif()
    
    # Extract non-boost libraries from LDASTOOLS_LIBRARIES
    set(FRAMECPP_LIBS "")
    foreach(lib ${LDASTOOLS_LIBRARIES})
        if(NOT ${lib} MATCHES "boost_")
            list(APPEND FRAMECPP_LIBS ${lib})
        endif()
    endforeach()
    
    target_link_libraries(test_type_compatibility ${FRAMECPP_LIBS} ${BOOST_LIBS_TO_USE})
endif()

# Make sure the test can find the headers
target_include_directories(test_type_compatibility PRIVATE 
  ${CMAKE_SOURCE_DIR}/common
  ${LDASTOOLS_INCLUDE_DIRS}
)

# Add compile definition to enable type checking
target_compile_definitions(test_type_compatibility PRIVATE FRAMECPP_SWIG_TYPE_CHECKING)

# Register the test with CTest
add_test(NAME type_compatibility_test COMMAND test_type_compatibility)

# Set test properties
set_tests_properties(type_compatibility_test PROPERTIES
  TIMEOUT 30
  LABELS "unit;compatibility"
)