cmake_minimum_required(VERSION 3.0.2)
project(mission_adapters VERSION 1.0.0 LANGUAGES CXX)

# ========================================================
# Detect build mode
# ========================================================
if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
  set(BUILDING_WITH_CATKIN TRUE)
  message(STATUS "Building mission_adapters with Catkin")
else()
  set(BUILDING_WITH_CATKIN FALSE)
  message(STATUS "Building mission_adapters with Standalone CMake")
endif()

# ========================================================
# C++ Standard
# ========================================================
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# ========================================================
# Common dependencies
# ========================================================
find_package(PCL REQUIRED)
find_package(OpenMP REQUIRED)
find_package(Boost REQUIRED COMPONENTS system)
find_package(Eigen REQUIRED)

# ========================================================
# Standalone mode
# ========================================================
if (NOT BUILDING_WITH_CATKIN)

  set(CMAKE_POSITION_INDEPENDENT_CODE ON)

  set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)
  set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}")

  # ⚠️ NOTE: Đây KHÔNG phải package thật -> chỉ để placeholder
  set(PACKAGES_DIR
    robot_costmap_2d
    robot_nav_core
    robot_nav_core2
    robot_nav_msgs
    robot_std_msgs
    robot_geometry_msgs
    robot_cpp
    robot_tf3_geometry_msgs
    robot_visualization_msgs
    robot_nav_2d_utils
    data_convert
  )

  find_library(TF3_LIBRARY
    NAMES tf3
    PATHS /usr/lib /usr/local/lib /usr/lib/x86_64-linux-gnu
  )

  if(NOT TF3_LIBRARY)
    message(FATAL_ERROR "❌ tf3 library not found")
  endif()

# ========================================================
# Catkin mode
# ========================================================
else()

  find_package(catkin REQUIRED COMPONENTS
    robot_costmap_2d
    robot_nav_core
    robot_nav_core2
    robot_nav_msgs
    robot_std_msgs
    robot_geometry_msgs
    robot_cpp
    robot_tf3_geometry_msgs
    robot_visualization_msgs
    robot_nav_2d_utils
    data_convert
  )

  find_library(TF3_LIBRARY
    NAMES tf3
    PATHS /usr/lib /usr/local/lib /usr/lib/x86_64-linux-gnu
  )

  if(NOT TF3_LIBRARY)
    message(FATAL_ERROR "❌ tf3 library not found")
  endif()

  catkin_package(
    INCLUDE_DIRS include
    LIBRARIES ${PROJECT_NAME} ${PROJECT_NAME}_utils
    CATKIN_DEPENDS
      robot_costmap_2d
      robot_nav_core
      robot_nav_core2
      robot_nav_msgs
      robot_std_msgs
      robot_geometry_msgs
      robot_cpp
      robot_tf3_geometry_msgs
      robot_visualization_msgs
      robot_nav_2d_utils
      data_convert
    DEPENDS PCL Boost Eigen
  )

  include_directories(
    include
    ${catkin_INCLUDE_DIRS}
    ${PCL_INCLUDE_DIRS}
    ${Boost_INCLUDE_DIRS}
  )

endif()

# ========================================================
# Libraries
# ========================================================

# # utils lib
# add_library(${PROJECT_NAME}_utils SHARED
#   src/angle_utils.cpp
#   src/config.cpp
# )

# main planner lib
add_library(${PROJECT_NAME} SHARED
  src/mission_adapters.cpp
)

# ========================================================
# Catkin linking
# ========================================================
if(BUILDING_WITH_CATKIN)

  # add_dependencies(${PROJECT_NAME}_utils ${catkin_EXPORTED_TARGETS})
  add_dependencies(${PROJECT_NAME} ${catkin_EXPORTED_TARGETS})

  # target_include_directories(${PROJECT_NAME}_utils
  #   PUBLIC
  #     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  #     $<INSTALL_INTERFACE:include>
  # )

  target_include_directories(${PROJECT_NAME}
    PUBLIC
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
      $<INSTALL_INTERFACE:include>
  )

  # target_link_libraries(${PROJECT_NAME}_utils
  #   PUBLIC ${catkin_LIBRARIES}
  #   PRIVATE Boost::system
  #   ${TF3_LIBRARY}
  # )

  target_link_libraries(${PROJECT_NAME}
    # PUBLIC ${PROJECT_NAME}_utils
    PUBLIC ${catkin_LIBRARIES}
    PUBLIC ${PCL_LIBRARIES}
    PRIVATE Boost::system
    ${TF3_LIBRARY}
    OpenMP::OpenMP_CXX
  )

# ========================================================
# Standalone linking
# ========================================================
else()

  # target_include_directories(${PROJECT_NAME}_utils
  #   PUBLIC
  #     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  #     $<INSTALL_INTERFACE:include>
  # )

  target_include_directories(${PROJECT_NAME}
    PUBLIC
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
      $<INSTALL_INTERFACE:include>
  )

  # target_link_libraries(${PROJECT_NAME}_utils
  #   PUBLIC ${PACKAGES_DIR}   # ⚠️ placeholder
  #   PRIVATE Boost::system
  #   ${TF3_LIBRARY}
  # )

  target_link_libraries(${PROJECT_NAME}
    # PUBLIC ${PROJECT_NAME}_utils
    PUBLIC ${PACKAGES_DIR}   # ⚠️ placeholder
    PUBLIC ${PCL_LIBRARIES}
    PRIVATE Boost::system
    ${TF3_LIBRARY}
    OpenMP::OpenMP_CXX
  )

  # set_target_properties(${PROJECT_NAME}_utils PROPERTIES
  #   LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
  #   BUILD_RPATH "${CMAKE_BINARY_DIR}"
  #   INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
  # )

  set_target_properties(${PROJECT_NAME} PROPERTIES
    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
    BUILD_RPATH "${CMAKE_BINARY_DIR}"
    INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
  )

endif()

# ========================================================
# Install
# ========================================================
if(BUILDING_WITH_CATKIN)

  # install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_utils
  #   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  #   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  #   RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
  # )

  install(DIRECTORY include/${PROJECT_NAME}/
    DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
    FILES_MATCHING PATTERN "*.h"
  )

  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml)
    install(FILES plugins.xml
      DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
    )
  endif()

else()

  # install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_utils
  #   EXPORT ${PROJECT_NAME}-targets
  #   ARCHIVE DESTINATION lib
  #   LIBRARY DESTINATION lib
  #   RUNTIME DESTINATION bin
  # )

  install(EXPORT ${PROJECT_NAME}-targets
    FILE ${PROJECT_NAME}-targets.cmake
    NAMESPACE ${PROJECT_NAME}::
    DESTINATION lib/cmake/${PROJECT_NAME}
  )

  install(DIRECTORY include/${PROJECT_NAME}/
    DESTINATION include
    FILES_MATCHING PATTERN "*.h"
  )

  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml)
    install(FILES plugins.xml
      DESTINATION share/${PROJECT_NAME}
    )
  endif()

endif()
