cmake_minimum_required(VERSION 3.20)
project(settings_navigation LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(REPO "${CMAKE_CURRENT_LIST_DIR}/../..")
if(NOT TARGET lvgl)
    set(LVGL_DIR "" CACHE PATH "LVGL 9.4 source directory")
    set(LV_BUILD_CONF_PATH "${REPO}/tests/map_poi_view/lv_conf.h" CACHE PATH "" FORCE)
    set(CONFIG_LV_BUILD_DEMOS OFF CACHE BOOL "" FORCE)
    set(CONFIG_LV_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
    set(CONFIG_LV_USE_THORVG_INTERNAL OFF CACHE BOOL "" FORCE)
    add_subdirectory(${LVGL_DIR} lvgl)
endif()

# Compile production lifecycle callbacks with a minimal Settings/IME fixture.
# LVGL groups, objects, deletion and input dispatch are not mocked.
set(COMPONENTS "${REPO}/modules/ui_shared/src/ui/screens/settings/settings_page_components.cpp")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${COMPONENTS}")
file(READ "${COMPONENTS}" SOURCE)
function(extract_between START END OUTPUT)
    string(FIND "${SOURCE}" "${START}" FIRST)
    if(FIRST LESS 0)
        message(FATAL_ERROR "Settings lifecycle extraction markers changed")
    endif()
    string(SUBSTRING "${SOURCE}" ${FIRST} -1 TAIL)
    string(FIND "${TAIL}" "${END}" LENGTH)
    if(LENGTH LESS 0)
        message(FATAL_ERROR "Settings lifecycle end marker changed")
    endif()
    string(SUBSTRING "${TAIL}" 0 ${LENGTH} BODY)
    set(${OUTPUT} "${BODY}" PARENT_SCOPE)
endfunction()
extract_between("static void modal_prepare_group(" "static void modal_add_focus_obj(" MODAL)
extract_between("static void settings_back_cb(" "static void bind_dynamic_option_storage_to_items(" BACK)
extract_between("static lv_obj_t* create_modal_root(" "static void on_text_save_clicked(" LAYOUT)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/settings_lifecycle_actual.inc" "${MODAL}\n${BACK}\n${LAYOUT}")
add_executable(settings_navigation test_navigation.cpp)
target_include_directories(settings_navigation PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
target_link_libraries(settings_navigation PRIVATE lvgl)
if(MSVC)
    target_compile_options(settings_navigation PRIVATE /UNDEBUG)
else()
    target_compile_options(settings_navigation PRIVATE -UNDEBUG -Wall -Wextra)
endif()
enable_testing()
add_test(NAME settings_navigation COMMAND settings_navigation)
set_tests_properties(settings_navigation PROPERTIES TIMEOUT 30)
add_executable(settings_item_layout test_item_layout.cpp)
target_include_directories(settings_item_layout PRIVATE "${REPO}/modules/ui_shared/include")
target_link_libraries(settings_item_layout PRIVATE lvgl)
if(MSVC)
    target_compile_options(settings_item_layout PRIVATE /UNDEBUG)
else()
    target_compile_options(settings_item_layout PRIVATE -UNDEBUG -Wall -Wextra)
endif()
add_test(NAME settings_item_layout COMMAND settings_item_layout)
set_tests_properties(settings_item_layout PROPERTIES TIMEOUT 30)
