cmake_minimum_required(VERSION 3.20)
if(DEFINED ENV{IDF_PATH} AND NOT DRYER_HOST)
    include($ENV{IDF_PATH}/tools/cmake/project.cmake)
    set(PROJECT_VER "0.2.1")
    project(dryer_controller)
else()
    project(dryer_controller LANGUAGES C CXX)
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    add_library(dryer_core core/controller.cpp)
    target_include_directories(dryer_core PUBLIC core)
    if(MINGW)
        target_link_options(dryer_core PUBLIC -static)
    endif()
    if(MSVC)
        target_compile_options(dryer_core PRIVATE /W4 /WX)
    else()
        target_compile_options(dryer_core PRIVATE -Wall -Wextra -Werror)
    endif()
    if(EMSCRIPTEN)
        add_executable(dryer_sim sim/bridge.cpp)
        target_link_libraries(dryer_sim PRIVATE dryer_core)
        target_link_options(dryer_sim PRIVATE --no-entry -sMODULARIZE=1 -sEXPORT_NAME=createDryer
            -sENVIRONMENT=web,node -sALLOW_MEMORY_GROWTH=1
            "-sEXPORTED_FUNCTIONS=['_dc_reset','_dc_tick','_dc_command','_dc_stage','_dc_config','_dc_get','_dc_fault']"
            "-sEXPORTED_RUNTIME_METHODS=['ccall']")
        if(DRYER_TOUCH)
            set(LVGL "${CMAKE_CURRENT_SOURCE_DIR}/managed_components/lvgl__lvgl" CACHE PATH "LVGL sources")
            file(GLOB_RECURSE LVGL_SOURCES CONFIGURE_DEPENDS "${LVGL}/src/*.c")
            add_library(touch_lvgl STATIC ${LVGL_SOURCES})
            target_include_directories(touch_lvgl PUBLIC sim "${LVGL}" "${LVGL}/src")
            target_compile_definitions(touch_lvgl PUBLIC LV_CONF_INCLUDE_SIMPLE)
            target_compile_options(touch_lvgl PUBLIC -sUSE_SDL=2)
            target_compile_options(touch_lvgl PRIVATE -w)
            add_executable(dryer_touch sim/touch_main.cpp sim/bridge.cpp main/touch_ui.cpp)
            target_include_directories(dryer_touch PRIVATE main core)
            target_link_libraries(dryer_touch PRIVATE dryer_core touch_lvgl)
            target_link_options(dryer_touch PRIVATE -sUSE_SDL=2 -sALLOW_MEMORY_GROWTH=1
                -sENVIRONMENT=web -sMODULARIZE=1 -sEXPORT_NAME=createTouch
                "-sEXPORTED_FUNCTIONS=['_main','_touch_page','_touch_dump','_touch_input','_touch_value','_touch_scroll','_dc_fault']"
                "-sEXPORTED_RUNTIME_METHODS=['ccall']")
        endif()
    else()
        enable_testing()
        add_executable(core_tests tests/core_tests.cpp)
        target_link_libraries(core_tests PRIVATE dryer_core)
        add_test(NAME controller COMMAND core_tests)
        add_executable(sensor_tests tests/sensor_tests.cpp main/sensor.cpp)
        target_include_directories(sensor_tests PRIVATE tests/stubs main core)
        target_link_libraries(sensor_tests PRIVATE dryer_core)
        add_test(NAME sensor-adapters COMMAND sensor_tests)
        add_executable(touch_calibration_tests tests/touch_calibration_tests.cpp)
        target_link_libraries(touch_calibration_tests PRIVATE dryer_core)
        add_test(NAME touch-calibration COMMAND touch_calibration_tests)
        add_executable(dryer_sim sim/native.cpp sim/bridge.cpp)
        target_link_libraries(dryer_sim PRIVATE dryer_core)
    endif()
endif()
