cmake_minimum_required(VERSION 3.10)
project(HTNRepair)

set(CMAKE_CXX_STANDARD 17)

enable_testing()

# We'll store main binary in bin/
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# Then for tests, we override the output directory to bin/tests
set(TEST_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tests)

# Library
add_library(htn_repair_lib
  src/model.cpp
  src/method.cpp
  src/primitive_task.cpp
  src/logger.cpp
  src/action.cpp
  src/parser.cpp
  src/membership_search.cpp
  src/pruner.cpp
  src/llm.cpp
)
target_include_directories(htn_repair_lib PUBLIC include)

# Main executable -> in bin/
add_executable(htn_repair_main src/main.cpp)
target_link_libraries(htn_repair_main htn_repair_lib)
set_target_properties(htn_repair_main PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# Test executables -> in tests/
add_executable(htn_edge_case_tests tests/test_edge_cases.cpp)
target_link_libraries(htn_edge_case_tests htn_repair_lib)
set_target_properties(htn_edge_case_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIR})

add_executable(htn_integration_tests tests/test_integration_main.cpp)
target_link_libraries(htn_integration_tests htn_repair_lib)
set_target_properties(htn_integration_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIR})

add_executable(htn_repair_tests tests/test_main.cpp)
target_link_libraries(htn_repair_tests htn_repair_lib)
set_target_properties(htn_repair_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIR})

add_executable(htn_membership_search_tests tests/test_membership_search.cpp)
target_link_libraries(htn_membership_search_tests htn_repair_lib)
set_target_properties(htn_membership_search_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIR})

add_executable(htn_repair_parser_tests tests/test_parser.cpp)
target_link_libraries(htn_repair_parser_tests htn_repair_lib)
set_target_properties(htn_repair_parser_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIR})

add_executable(htn_pruned_file_verification_tests tests/test_pruned_file_verification.cpp)
target_link_libraries(htn_pruned_file_verification_tests htn_repair_lib)
set_target_properties(htn_pruned_file_verification_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIR})

add_executable(htn_llm_tests tests/test_llm.cpp)
target_link_libraries(htn_llm_tests htn_repair_lib)
set_target_properties(htn_llm_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIR})

# Register tests with CTest. Each opens fixtures via paths relative to
# htn_repair/, so WORKING_DIRECTORY is pinned to the source root.
foreach(_t IN ITEMS
    htn_edge_case_tests
    htn_integration_tests
    htn_repair_tests
    htn_membership_search_tests
    htn_repair_parser_tests
    htn_pruned_file_verification_tests
    htn_llm_tests)
  add_test(NAME ${_t} COMMAND ${_t} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
endforeach()