cmake_minimum_required(VERSION 3.20)

project(instrument_reader_cpp VERSION 0.1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(OpenCV REQUIRED)

set(INSTRUMENT_READER_SAMPLE_ROOT "" CACHE PATH "Sample data root containing original_crops and generated_scales")
if(NOT INSTRUMENT_READER_SAMPLE_ROOT)
    if(DEFINED ENV{INSTRUMENT_READER_SAMPLE_ROOT})
        set(INSTRUMENT_READER_SAMPLE_ROOT "$ENV{INSTRUMENT_READER_SAMPLE_ROOT}" CACHE PATH "Sample data root containing original_crops and generated_scales" FORCE)
    elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../2/original_crops")
        set(INSTRUMENT_READER_SAMPLE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../2" CACHE PATH "Sample data root containing original_crops and generated_scales" FORCE)
    endif()
endif()

add_library(instrument_reader_core
    src/airspeed_reader.cpp
    src/dispatcher.cpp
    src/instrument_classifier.cpp
    src/lut_mapper.cpp
    src/types.cpp
)

target_include_directories(instrument_reader_core
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
        ${OpenCV_INCLUDE_DIRS}
)

target_link_libraries(instrument_reader_core
    PUBLIC
        ${OpenCV_LIBS}
)

if(MSVC)
    target_compile_options(instrument_reader_core PRIVATE /EHsc /W4 $<$<CONFIG:Release>:/O2>)
else()
    target_compile_options(instrument_reader_core PRIVATE -Wall -Wextra -Wpedantic $<$<CONFIG:Release>:-O3>)
endif()

add_executable(instrument_reader_cli apps/instrument_reader_cli.cpp)
target_link_libraries(instrument_reader_cli PRIVATE instrument_reader_core)

add_executable(airspeed_lut_cli apps/airspeed_lut_cli.cpp)
target_link_libraries(airspeed_lut_cli PRIVATE instrument_reader_core)

add_executable(clion_demo apps/clion_demo.cpp)
target_link_libraries(clion_demo PRIVATE instrument_reader_core)

if(WIN32 AND OpenCV_DIR)
    get_filename_component(INSTRUMENT_READER_OPENCV_BIN "${OpenCV_DIR}/../bin" ABSOLUTE)
    set(INSTRUMENT_READER_RUN_ENV "PATH=${INSTRUMENT_READER_OPENCV_BIN};$ENV{PATH}")
    foreach(target_name instrument_reader_cli airspeed_lut_cli clion_demo)
        set_target_properties(${target_name} PROPERTIES
            VS_DEBUGGER_ENVIRONMENT "${INSTRUMENT_READER_RUN_ENV}"
        )
    endforeach()
else()
    set(INSTRUMENT_READER_RUN_ENV "PATH=$ENV{PATH}")
endif()

set(INSTRUMENT_READER_OUTPUT_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/output" CACHE PATH "Output root for CLion run targets")

if(INSTRUMENT_READER_SAMPLE_ROOT AND EXISTS "${INSTRUMENT_READER_SAMPLE_ROOT}/original_crops")
    set(INSTRUMENT_READER_AIRSPEED_BASE "${INSTRUMENT_READER_SAMPLE_ROOT}/generated_scales/01_airspeed_indicator/_restored_base_no_pointer.png" CACHE FILEPATH "Airspeed no-pointer base/template image")

    add_custom_target(run_demo
        COMMAND ${CMAKE_COMMAND} -E make_directory "${INSTRUMENT_READER_OUTPUT_ROOT}"
        COMMAND ${CMAKE_COMMAND} -E env "${INSTRUMENT_READER_RUN_ENV}"
                $<TARGET_FILE:instrument_reader_cli>
                --input "${INSTRUMENT_READER_SAMPLE_ROOT}/original_crops"
                --input "${INSTRUMENT_READER_SAMPLE_ROOT}/generated_scales/01_airspeed_indicator"
                --airspeed-template "${INSTRUMENT_READER_AIRSPEED_BASE}"
                --airspeed-base "${INSTRUMENT_READER_AIRSPEED_BASE}"
                --airspeed-lut "${CMAKE_CURRENT_SOURCE_DIR}/configs/airspeed_lut_example.json"
                --out-dir "${INSTRUMENT_READER_OUTPUT_ROOT}"
        DEPENDS instrument_reader_cli
        VERBATIM
    )

    add_custom_target(run_demo_no_overlay
        COMMAND ${CMAKE_COMMAND} -E make_directory "${INSTRUMENT_READER_OUTPUT_ROOT}"
        COMMAND ${CMAKE_COMMAND} -E env "${INSTRUMENT_READER_RUN_ENV}"
                $<TARGET_FILE:instrument_reader_cli>
                --input "${INSTRUMENT_READER_SAMPLE_ROOT}/original_crops"
                --input "${INSTRUMENT_READER_SAMPLE_ROOT}/generated_scales/01_airspeed_indicator"
                --airspeed-template "${INSTRUMENT_READER_AIRSPEED_BASE}"
                --airspeed-base "${INSTRUMENT_READER_AIRSPEED_BASE}"
                --airspeed-lut "${CMAKE_CURRENT_SOURCE_DIR}/configs/airspeed_lut_example.json"
                --out-dir "${INSTRUMENT_READER_OUTPUT_ROOT}"
                --no-overlays
        DEPENDS instrument_reader_cli
        VERBATIM
    )
endif()

add_custom_target(run_lut_example
    COMMAND ${CMAKE_COMMAND} -E env "${INSTRUMENT_READER_RUN_ENV}"
            $<TARGET_FILE:airspeed_lut_cli>
            --map "${CMAKE_CURRENT_SOURCE_DIR}/configs/airspeed_lut_example.json"
            --theta 4.5
    DEPENDS airspeed_lut_cli
    VERBATIM
)

install(TARGETS instrument_reader_core instrument_reader_cli airspeed_lut_cli
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
)

install(DIRECTORY include/ DESTINATION include)
