cmake_minimum_required(VERSION 3.16)
project(cognitive_agent_can_read_trans LANGUAGES CXX)

find_package(Python3 REQUIRED COMPONENTS Interpreter)

set(CAN_PROTOCOL_SOURCE
    "${CMAKE_CURRENT_SOURCE_DIR}/../../config/can_protocol/semantic_protocol.json")
set(CAN_PROTOCOL_GENERATOR
    "${CMAKE_CURRENT_SOURCE_DIR}/../generate_can_semantic_protocol.py")
set(CAN_PROTOCOL_CPP
    "${CMAKE_CURRENT_SOURCE_DIR}/generated/can_semantic_protocol.hpp")
set(CAN_PROTOCOL_PYTHON
    "${CMAKE_CURRENT_SOURCE_DIR}/../../src/cognitive_agent/generated/can_semantic_protocol.py")

add_custom_command(
    OUTPUT "${CAN_PROTOCOL_CPP}" "${CAN_PROTOCOL_PYTHON}"
    COMMAND "${Python3_EXECUTABLE}" "${CAN_PROTOCOL_GENERATOR}"
    DEPENDS "${CAN_PROTOCOL_SOURCE}" "${CAN_PROTOCOL_GENERATOR}"
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../.."
    COMMENT "Generating shared CAN semantic protocol views"
    VERBATIM
)
add_custom_target(generate_can_semantic_protocol
    DEPENDS "${CAN_PROTOCOL_CPP}" "${CAN_PROTOCOL_PYTHON}")

set(CANFD_ROOT "/home/orin/project511/project-code/canfd" CACHE PATH
    "Directory containing can_read_trans.cpp, zcan.h and libusbcanfd.so")

foreach(required_file can_read_trans.cpp zcan.h libusbcanfd.so)
    if(NOT EXISTS "${CANFD_ROOT}/${required_file}")
        message(FATAL_ERROR "Missing ${CANFD_ROOT}/${required_file}")
    endif()
endforeach()

add_executable(can_read_trans main.cpp)
add_dependencies(can_read_trans generate_can_semantic_protocol)
target_compile_features(can_read_trans PRIVATE cxx_std_17)
# The vendor zcan.h intentionally contains an anonymous packed structure.
# Keep useful warnings without treating that SDK ABI declaration as our error.
target_compile_options(can_read_trans PRIVATE -Wall -Wextra)
target_compile_definitions(can_read_trans PRIVATE
    CANFD_LEGACY_SOURCE="${CANFD_ROOT}/can_read_trans.cpp"
    CANFD_PROJECT_DIR="${CANFD_ROOT}"
)
target_include_directories(can_read_trans PRIVATE "${CANFD_ROOT}")
target_link_libraries(can_read_trans PRIVATE
    "${CANFD_ROOT}/libusbcanfd.so"
    pthread
)
set_target_properties(can_read_trans PROPERTIES
    BUILD_RPATH "${CANFD_ROOT}"
    INSTALL_RPATH "${CANFD_ROOT}"
)

enable_testing()
add_test(NAME can_read_trans_self_test COMMAND can_read_trans self-test)
add_test(NAME can_read_trans_console_help COMMAND can_read_trans console --help)
set_tests_properties(can_read_trans_console_help PROPERTIES
    PASS_REGULAR_EXPRESSION "console.*--execute"
)
