set(incs)
set(srcs)

list(APPEND incs
    "$ENV{ARMINO_PATH}/../../../../apps/$ENV{APP_NAME}/include"
)

list(APPEND incs
    include
    src/test
    src/misc
    src/test/test_lvgl
    src/test/test_ringbuffer
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/adc
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/bluetooth
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/display
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/flash
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/gpio
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/hci
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/i2c
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/init/include
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/media
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/network
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/pinmux
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/pwm
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/rtc/include
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/security
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/spi/include
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/system
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/timer
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/uart
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/utilities/include
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/wakeup
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/watchdog
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/wifi
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/tal_compatible
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/lvgl
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/wired
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/ipc
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/vad
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/asr
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/asr/bat_asr
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/asr/wanson_asr
    $ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/asr/libtutuClear
)

if ("${CONFIG_CPU_INDEX}" STREQUAL "0")
    list(APPEND srcs
        src/driver/tkl_wakeup.c
        src/misc/ty_vad_app.c
    )
endif()

if (CONFIG_SYS_CPU1)
    list(APPEND srcs
#        src/test/test_lvgl/tuya_lvgl_demo.c
#        src/test/test_lvgl/stress/lvgl_event_handle.c
#        src/test/test_lvgl/stress/lvgl_stress_demo.c
#        src/test/test_lvgl/widgets/lv_demo_widgets.c
#        src/test/test_lvgl/widgets/assets/img_lvgl_logo.c
#        src/test/test_lvgl/widgets/assets/img_clothes.c
    )
endif()

if (NOT "${CONFIG_CPU_INDEX}" STREQUAL "2")
    list(APPEND srcs
        src/misc/tkl_asr.c
        src/driver/tkl_display.c
        src/driver/tkl_video_enc.c
        src/driver/tkl_video_in.c
        src/driver/tkl_audio.c
        src/driver/tkl_flash.c
        src/driver/tkl_rtc.c
        src/driver/tkl_spi.c
        src/driver/tkl_gpio.c
        src/driver/tkl_i2c.c
        src/driver/tkl_timer.c
        src/driver/tkl_ipc.c
        src/system/tkl_memory.c
        src/system/tkl_mutex.c
        src/system/tkl_network.c
        src/system/tkl_ota.c
        src/system/tkl_output.c
        src/system/tkl_queue.c
        src/system/tkl_semaphore.c
        src/system/tkl_sleep.c
        src/system/tkl_system.c
        src/system/tkl_thread.c
        src/system/tkl_lvgl.c
        src/system/tkl_fs.c
        src/driver/tkl_pinmux.c
        src/misc/bk_adapter.c
        src/misc/qflash.c
        src/misc/sflash.c
        src/misc/fs_init.c
        src/misc/tuya_tkl_ipc.c
        src/driver/tkl_lwip.c
        src/driver/tkl_adc.c
        src/driver/tkl_hci.c
        src/driver/tkl_pwm.c
        src/driver/tkl_uart.c
        src/driver/tkl_watchdog.c
        src/driver/tkl_wifi.c
        src/driver/encrypt.c
        src/driver/tkl_wired.c
        include/init/src/tkl_init_system.c
        include/init/src/tkl_init_common.c
        include/init/src/tkl_init_network.c
        include/init/src/tkl_init_wifi.c
        include/init/src/tkl_init_wired.c
        include/utilities/src/tuya_hashmap.c
        include/utilities/src/tuya_ringbuf.c
        include/utilities/src/tuya_smartpointer.c
        include/utilities/src/tuya_queue.c
        include/utilities/src/tuya_mem_heap.c
        include/utilities/src/tuya_list.c
        include/utilities/src/tuya_tools.c
    )
endif()

if (CONFIG_TUYA_TEST_CLI)
list(APPEND srcs
    src/test/cli_tuya_test.c
    src/test/test_adc.c
    src/test/test_audio.c
    src/test/test_gpio.c
    src/test/test_lcd.c
    src/test/test_pwm.c
    src/test/test_wifi.c
    src/test/test_startup_frame.c
    src/test/test_media.c
    src/test/test_qspi.c
    src/test/test_littlefs.c
    src/test/test_mp3.c
    src/test/test_timer.c
    src/test/test_usb.c
    src/test/test_lp.c
    src/test/test_sdcard.c
    src/test/test_ringbuffer/rb.c
    )
endif() # CONFIG_TUYA_TEST_CLI

#自动查找头文件路径函数
macro(FIND_INCLUDE_DIR result curdir)                                               ## 定义函数,2个参数:存放结果result；指定路径curdir；
    file(GLOB_RECURSE children "${curdir}/*.h")                                     ## 遍历获取{curdir}中*.hpp和*.h文件列表
    set(dirlist "")                                                                 ## 定义dirlist中间变量，并初始化
    foreach(child ${children})                                                      ## for循环
        string(REGEX REPLACE "(.*)/.*" "\\1" DIR_NAME ${child})                     ## 字符串替换,用/前的字符替换/*h
        if((IS_DIRECTORY ${DIR_NAME}) AND (NOT (${DIR_NAME} IN_LIST dirlist)))      ## 判断是否为路径
            list(APPEND dirlist ${DIR_NAME})                                        ## 将合法的路径加入dirlist变量中
        endif()                                                                     ## 结束判断
    endforeach()                                                                    ## 结束for循环
    set(${result} ${dirlist})                                                       ## dirlist结果放入result变量中
    #message(STATUS "result=${dirlist}")                                            ## 打印*.hpp和*.h的文件列表
endmacro()

function(FIND_INCLUDE_DIR_WITH_IGNORE result curdir)
    # 初始化输出目录列表
    set(dirs "")

    # 递归查找所有子目录
    file(GLOB_RECURSE allFiles "${curdir}/*")

    # 通过循环所有文件来构建目录列表
    foreach(file ${allFiles})
        get_filename_component(dirPath ${file} DIRECTORY)
        # 如果这个目录还没有在列表中，就加入它
        if(NOT "${dirPath}" IN_LIST dirs)
            list(APPEND dirs ${dirPath})
        endif()
    endforeach()

    # 移除重复的目录，以防万一
    list(REMOVE_DUPLICATES dirs)

    # 处理ignoreDirs参数
    set(ignoreDirs ${ARGN})
    set(filteredDirs "")

    # 遍历所有目录并过滤掉忽略的目录及其子目录
    foreach(dir ${dirs})
        set(shouldIgnore FALSE)
        foreach(ignoreDir ${ignoreDirs})
            # 如果目录是忽略目录或其子目录，则标记为忽略
            if("${dir}" MATCHES "^${ignoreDir}")
                set(shouldIgnore TRUE)
            endif()
        endforeach()
        # 如果目录没有被忽略，则加入到最终的目录列表
        if(NOT shouldIgnore)
            list(APPEND filteredDirs ${dir})
        endif()
    endforeach()

    # 设置函数的返回值
    set(${result} ${filteredDirs} PARENT_SCOPE)
endfunction()

#查找include目录下的所有*.h头文件
FIND_INCLUDE_DIR_WITH_IGNORE("INCLUDE_DIR_LIST_SDK" "$ENV{TUYA_PROJECT_DIR}/include")
list(APPEND incs "${INCLUDE_DIR_LIST_SDK}"  "$ENV{TUYA_PROJECT_DIR}/include/components/lib_tflm")

# add mbedtls dir
set(ext_include_path $ENV{TUYA_PROJECT_DIR}/include)
execute_process(
    COMMAND sh -c "find ${ext_include_path} -name lib_tls -type d"
    OUTPUT_VARIABLE OUTPUT_VAR
    OUTPUT_STRIP_TRAILING_WHITESPACE
    )
#message("Output from shell command: ${OUTPUT_VAR}")
list(APPEND incs "${OUTPUT_VAR}/include")

#message(STATUS "============================================")
#message(STATUS "${INCLUDE_DIR_LIST_SDK}")
#message(STATUS "============================================")

#查找adapter目录下的所有*.h头文件
#FIND_INCLUDE_DIR("INCLUDE_DIR_LIST_KERNEL" "$ENV{TUYA_PROJECT_DIR}/adapter")
#list(APPEND incs "${INCLUDE_DIR_LIST_KERNEL}")

#if (CONFIG_TUYA_APP_SOURCES)
#    #查找apps/${app_name}目录下的所有*.h头文件,并路径列表保存到 INCLUDE_DIR_LIST 变量中
#    FIND_INCLUDE_DIR("INCLUDE_DIR_LIST_APP" "$ENV{TUYA_PROJECT_DIR}/apps/$ENV{TUYA_APP_NAME}")
#    list(APPEND incs "${INCLUDE_DIR_LIST_APP}")
#    #查找apps/${app_name}目录下的所有*.c源文件
#    file(GLOB_RECURSE app_ext_srcs "$ENV{TUYA_PROJECT_DIR}/apps/$ENV{TUYA_APP_NAME}/*.c")
#endif() # CONFIG_TUYA_APP_SOURCES

#if (CONFIG_TUYA_COMPONENTS)
#    #查找组件目录下的所有*.h头文件,并路径列表保存到 INCLUDE_DIR_LIST 变量中
#    FIND_INCLUDE_DIR("INCLUDE_DIR_LIST_COMP" "$ENV{TUYA_PROJECT_DIR}/application_components")
#    list(APPEND incs "${INCLUDE_DIR_LIST_COMP}")
#    #查找组件目录下的所有*.c源文件
#    file(GLOB_RECURSE comp_ext_srcs "$ENV{TUYA_PROJECT_DIR}/application_components/*.c")
#endif() # CONFIG_TUYA_COMPONENTS

#list(APPEND srcs ${app_ext_srcs} ${comp_ext_srcs})

set(lwip_select $ENV{TUYA_LWIP_STACK_USED})
if (lwip_select STREQUAL "lwip_bk")
    message(STATUS "--------------- bk lwip ---------------")
    armino_component_register(SRCS "${srcs}" INCLUDE_DIRS "${incs}" REQUIRES bk_common bk_log multimedia bk_usb bk_draw_blend media_service lvgl bk_vfs bk_cli lwip_intf_v2_1)
else ()
    message(STATUS "--------------- tuya lwip ---------------")
    armino_component_register(SRCS "${srcs}" INCLUDE_DIRS "${incs}" REQUIRES bk_common bk_log multimedia bk_usb bk_draw_blend media_service lvgl bk_vfs bk_cli)
endif()

add_prebuilt_library(lib$ENV{TUYA_APP_NAME}.a "$ENV{TUYA_PROJECT_DIR}/libs/lib$ENV{TUYA_APP_NAME}.a")
target_link_libraries(${COMPONENT_LIB} INTERFACE -Wl,--whole-archive lib$ENV{TUYA_APP_NAME}.a -Wl,--no-whole-archive)

add_prebuilt_library(libtuyaapp_drivers.a "$ENV{TUYA_PROJECT_DIR}/libs/libtuyaapp_drivers.a")
target_link_libraries(${COMPONENT_LIB} INTERFACE libtuyaapp_drivers.a)

add_prebuilt_library(libtuyaapp_components.a "$ENV{TUYA_PROJECT_DIR}/libs/libtuyaapp_components.a")
target_link_libraries(${COMPONENT_LIB} INTERFACE libtuyaapp_components.a)

# add_prebuilt_library(libtuyaos_adapter.a "$ENV{TUYA_PROJECT_DIR}/libs/libtuyaos_adapter.a")
# target_link_libraries(${COMPONENT_LIB} INTERFACE libtuyaos_adapter.a)

add_prebuilt_library(libtuyaos.a "$ENV{TUYA_PROJECT_DIR}/libs/libtuyaos.a")
target_link_libraries(${COMPONENT_LIB} INTERFACE libtuyaos.a)

add_prebuilt_library(libvad.a "$ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/vad/lib/libvad.a")
target_link_libraries(${COMPONENT_LIB} INTERFACE libvad.a)

add_prebuilt_library(libasrfst.a "$ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/asr/wanson_asr/libasrfst.a")
target_link_libraries(${COMPONENT_LIB} INTERFACE libasrfst.a)


add_prebuilt_library(libtutuClear.a "$ENV{ARMINO_PATH}/../../tuyaos/tuyaos_adapter/include/asr/libtutuClear/libtutuClear.a")
target_link_libraries(${COMPONENT_LIB} INTERFACE libtutuClear.a)