set(incs
	.
	include
	)

set(srcs
	ap_main.c
	app_settings.c
	my_aes.c
	)

# ============================================================================
# Tencent IoT SDK 集成（本 solution 已收敛为 IoT-SDK-only，仅 C 版 TRTC）。
#
# 双态：
#   预编译态 —— 交付包内存在 <pkg>/tc_iot_sdk/lib/libtc_iot_sdk.a 时，
#               直接链接该自包含 .a（不从 src/ 编 SDK），demo 源取包内 ./iot_demo。
#   源码态   —— 仓库内（无预编译 .a），从 src/ 编 tc_iot_sdk，demo 源取 src/demo。
# 两态用 EXISTS 判断自动切换；src/demo 始终是 demo 的唯一权威源（仓库内）。
#
# 重活（include SDK cmake / 模块解析 / add_library / 链接）必须只在完整构建 pass
# 执行，跳过 Armino 的早期 requirements 展开 pass（CMAKE_BUILD_EARLY_EXPANSION），
# 否则该 pass 无法生成 component_requires 而报错。
# ============================================================================
get_filename_component(IOT_SDK_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../../.. ABSOLUTE)

set(TC_IOT_SDK_PREBUILT_LIB "${IOT_SDK_ROOT}/tc_iot_sdk/lib/libtc_iot_sdk.a")
set(TC_IOT_SDK_PREBUILT_INC "${IOT_SDK_ROOT}/tc_iot_sdk/include")
set(TC_IOT_SDK_MODULE_CONFIG "${IOT_SDK_ROOT}/tc_iot_sdk/module_config.cmake")
if (EXISTS "${TC_IOT_SDK_PREBUILT_LIB}")
	set(TC_IOT_SDK_PREBUILT ON)
else()
	set(TC_IOT_SDK_PREBUILT OFF)
endif()

if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/iot_demo/iot_video_demo/iot_demo.c")
	set(DEMO_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/iot_demo")
else()
	set(DEMO_SRC_DIR "${IOT_SDK_ROOT}/src/demo")
endif()

# 板型解析须在 EARLY_EXPANSION 可用（PRIV_REQUIRES 在此 pass 决定）。
# 优先 ENV{IOT_BOARD}；未设时读 select_board.sh 写入的 boards/.active_board；默认 av。
set(IOT_BOARD_NAME "av")
if (DEFINED ENV{IOT_BOARD} AND NOT "$ENV{IOT_BOARD}" STREQUAL "")
	set(IOT_BOARD_NAME "$ENV{IOT_BOARD}")
endif()
set(_IOT_ACTIVE_BOARD_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../boards/.active_board")
if (EXISTS "${_IOT_ACTIVE_BOARD_FILE}")
	file(READ "${_IOT_ACTIVE_BOARD_FILE}" _IOT_ACTIVE_BOARD)
	string(STRIP "${_IOT_ACTIVE_BOARD}" _IOT_ACTIVE_BOARD)
	if (_IOT_ACTIVE_BOARD STREQUAL "ai" OR _IOT_ACTIVE_BOARD STREQUAL "av")
		if (DEFINED ENV{IOT_BOARD} AND NOT "$ENV{IOT_BOARD}" STREQUAL "" AND
			NOT IOT_BOARD_NAME STREQUAL _IOT_ACTIVE_BOARD)
			message(WARNING
				"IOT_BOARD=${IOT_BOARD_NAME} != select_board(.active_board)=${_IOT_ACTIVE_BOARD}; "
				"using IOT_BOARD. Re-run select_board.sh ${IOT_BOARD_NAME} to sync Kconfig.")
		elseif (NOT DEFINED ENV{IOT_BOARD} OR "$ENV{IOT_BOARD}" STREQUAL "")
			set(IOT_BOARD_NAME "${_IOT_ACTIVE_BOARD}")
		endif()
	endif()
endif()
if (NOT IOT_BOARD_NAME STREQUAL "ai" AND NOT IOT_BOARD_NAME STREQUAL "av")
	message(FATAL_ERROR "IOT_BOARD must be ai or av (got '${IOT_BOARD_NAME}')")
endif()

# 模块开关：源码态由 config.cmake 按 env/-D 设到 cache（此处不可预先 set 普通变量，
# 否则普通变量会遮蔽 config.cmake 的 cache，导致 --av/--cs/--aitalk 对 .a 不生效）；
# 预编译态没有 config.cmake，默认全开并由 module_config 覆盖（见下）。
if (NOT CMAKE_BUILD_EARLY_EXPANSION)
	if (TC_IOT_SDK_PREBUILT)
		set(BUILD_IOT_AV 1)
		set(BUILD_IOT_CLOUD_STORAGE 1)
		set(BUILD_IOT_AITALK 1)
		if (EXISTS "${TC_IOT_SDK_MODULE_CONFIG}")
			include(${TC_IOT_SDK_MODULE_CONFIG})
		endif()
		if (BUILD_IOT_AV OR BUILD_IOT_CLOUD_STORAGE)
			set(BUILD_IOT_AV_CHANNEL 1)
		else()
			set(BUILD_IOT_AV_CHANNEL 0)
		endif()
		add_compile_definitions(
			BUILD_IOT_AV=${BUILD_IOT_AV}
			BUILD_IOT_CLOUD_STORAGE=${BUILD_IOT_CLOUD_STORAGE}
			BUILD_IOT_AV_CHANNEL=${BUILD_IOT_AV_CHANNEL}
		)
	else()
		# 源码态：AITALK 默认随 C TRTC 开启；env 可覆盖。
		if (NOT DEFINED ENV{BUILD_IOT_AITALK})
			set(BUILD_IOT_AITALK 1)
		endif()
		set(AITALK_USE_WEBSOCKET OFF)
		include(${IOT_SDK_ROOT}/config.cmake)
		include(${IOT_SDK_ROOT}/src/base/base.cmake)
		include(${IOT_SDK_ROOT}/src/iot/iot.cmake)
		include(${IOT_SDK_ROOT}/src/third_party/third_party.cmake)
		include(${IOT_SDK_ROOT}/src/trtc/trtc.cmake)
		# config.cmake 对 BEKEN 提前 return、不加全局编译宏；源码态须在此把模块宏作为 -D 传给 ap 组件，
		# 否则 ap_main.c 的 #if BUILD_IOT_AV 恒为 0，iot_start/iot_call 等视频 CLI 不会被编译
		# （预编译态已在上面 if 分支 add 过）。
		add_compile_definitions(
			BUILD_IOT_AV=${BUILD_IOT_AV}
			BUILD_IOT_CLOUD_STORAGE=${BUILD_IOT_CLOUD_STORAGE}
			BUILD_IOT_AV_CHANNEL=${BUILD_IOT_AV_CHANNEL}
		)
	endif()

	if (BUILD_IOT_AITALK)
		list(APPEND c_compile_options "-DIOT_AITALK_ENABLED")
	endif()
	if (DEFINED ENV{IOT_API_COVERAGE} AND "$ENV{IOT_API_COVERAGE}" STREQUAL "1")
		add_compile_definitions(IOT_API_COVERAGE=1)
	endif()

	# 板型：IOT_BOARD=ai 用 DVP/smp 设备层；默认 av 用 UVC/dev_media。
	# IOT_BOARD_NAME 已在文件前部解析（含 .active_board 回退）。
	if (IOT_BOARD_NAME STREQUAL "av")
		add_compile_definitions(BEKEN_BOARD_AV=1)
	else()
		add_compile_definitions(BEKEN_BOARD_AI=1)
		# 通用按键模块（AI 玩具板 S3 → 云存事件）
		list(APPEND srcs app_key.c)
	endif()

	# demo 源文件。iot_demo.c / av_sender.c / av_device_* 为 av 和云存共用。
	# bk7258 入口在 ap_main.c，不编 demo/main.c。
	if (BUILD_IOT_AV OR BUILD_IOT_CLOUD_STORAGE)
		list(APPEND srcs
			${DEMO_SRC_DIR}/iot_video_demo/iot_demo.c
			${DEMO_SRC_DIR}/iot_video_demo/av_sender.c
			${DEMO_SRC_DIR}/iot_video_demo/av_receiver.c
			${DEMO_SRC_DIR}/iot_video_demo/cloud_storage_demo.c
		)
		if (IOT_BOARD_NAME STREQUAL "av")
			list(APPEND srcs ${DEMO_SRC_DIR}/iot_video_demo/av_device_beken_smp_av.c)
			if (CONFIG_DEV_AUDIO_EN OR CONFIG_DEV_VIDEO_EN)
				include(${CMAKE_CURRENT_SOURCE_DIR}/dev_media/dev_media_includes.cmake)
				dev_media_collect_include_dirs(incs)
			endif()
		else()
			list(APPEND srcs ${DEMO_SRC_DIR}/iot_video_demo/av_device_beken_smp_ai.c)
		endif()
	endif()

	# aitalk demo（C TRTC + AITALK）
	if (BUILD_IOT_AITALK)
		list(APPEND srcs ${DEMO_SRC_DIR}/iot_aitalk_demo/aitalk_demo.c)
		if (IOT_BOARD_NAME STREQUAL "av")
			list(APPEND srcs ${DEMO_SRC_DIR}/iot_aitalk_demo/audio_device_beken_smp_av.c)
			if (CONFIG_DEV_AUDIO_EN OR CONFIG_DEV_VIDEO_EN)
				include(${CMAKE_CURRENT_SOURCE_DIR}/dev_media/dev_media_includes.cmake)
				dev_media_collect_include_dirs(incs)
			endif()
		else()
			list(APPEND srcs ${DEMO_SRC_DIR}/iot_aitalk_demo/audio_device_beken_smp_ai.c)
		endif()
	endif()

	# size_analyze：强制链接 profile 内全部 public API（见 tools/size_analyze/）
	if (DEFINED ENV{IOT_API_COVERAGE} AND "$ENV{IOT_API_COVERAGE}" STREQUAL "1")
		list(APPEND srcs ${DEMO_SRC_DIR}/iot_api_coverage_demo/api_coverage.c)
	endif()

	list(APPEND incs
		${DEMO_SRC_DIR}/iot_video_demo
		${DEMO_SRC_DIR}/iot_aitalk_demo
		${IOT_SDK_ROOT}/src/base/hal
	)
	if (DEFINED ENV{IOT_API_COVERAGE} AND "$ENV{IOT_API_COVERAGE}" STREQUAL "1")
		list(APPEND incs ${DEMO_SRC_DIR}/iot_api_coverage_demo)
	endif()
	if (TC_IOT_SDK_PREBUILT)
		list(APPEND incs ${TC_IOT_SDK_PREBUILT_INC}
			${IOT_SDK_ROOT}/tc_iot_sdk/include/hal)
	else()
		list(APPEND incs
			${IOT_SDK_ROOT}
			${IOT_SDK_ROOT}/src/base
			${IOT_SDK_ROOT}/src/api/iot
			${IOT_SDK_ROOT}/src/third_party/jansson/src
			${IOT_SDK_ROOT}/src/third_party/jansson/private_include
			${IOT_SDK_ROOT}/src/third_party/nanopb
			${IOT_SDK_ROOT}/src/third_party/cJSON
			${IOT_SDK_ROOT}/src/trtc/include
			${TC_IOT_SDK_INC}
		)
	endif()
endif()

# 注：mbedtls 组件名为 psa_mbedtls（已在列）；zlib/bk_vfs 为有效组件，供预编译 .a 在最终链接解析其符号。
set(priv_req  media_service multimedia wifi_transfer avdk_utils lwip_intf_v2_1 bk_wifi_driver bk_bluetooth psa_mbedtls bk_camera bk_video_pipeline bk_display
				bk_https easy_flash bk_rtos zlib bk_vfs)
if (IOT_BOARD_NAME STREQUAL "av")
	list(APPEND priv_req dev_media)
else()
	list(APPEND priv_req key)
endif()

armino_component_register(SRCS "${srcs}" INCLUDE_DIRS "${incs}" PRIV_REQUIRES "${priv_req}")

if (NOT CMAKE_BUILD_EARLY_EXPANSION)
	# JPEG 软编码器库（用于云存抓拍截图）
	# jpeg_sw_encoder / jpeg_sw_encoder_init 的实现在 libtjpg_enc_sram.a 中
	set(TJPG_ENC_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../sdk/ap/components/bk_libs/bk7258_ap/libs/libtjpg_enc_sram.a")
	if (EXISTS "${TJPG_ENC_LIB_PATH}")
		get_filename_component(tjpg_lib_name ${TJPG_ENC_LIB_PATH} NAME)
		add_prebuilt_library(${tjpg_lib_name} "${TJPG_ENC_LIB_PATH}")
		target_link_libraries(${COMPONENT_LIB} INTERFACE ${tjpg_lib_name})
	else()
		message(WARNING "libtjpg_enc_sram.a not found at: ${TJPG_ENC_LIB_PATH}")
	endif()

	if (TC_IOT_SDK_PREBUILT)
		# 预编译态：直接链接交付包内自包含 .a。
		get_filename_component(iot_lib_name "${TC_IOT_SDK_PREBUILT_LIB}" NAME)
		add_prebuilt_library(${iot_lib_name} "${TC_IOT_SDK_PREBUILT_LIB}")
		target_link_libraries(${COMPONENT_LIB} INTERFACE ${iot_lib_name})
		target_include_directories(${COMPONENT_LIB} PRIVATE ${TC_IOT_SDK_PREBUILT_INC})
		target_compile_definitions(${COMPONENT_LIB} PRIVATE MQTT_DO_NOT_USE_CUSTOM_CONFIG NDEBUG)
		target_compile_options(${COMPONENT_LIB} PRIVATE $<$<COMPILE_LANGUAGE:C>:-Wno-discarded-qualifiers> -O3)
	else()
		# 源码态：从 src/ 编 IoT SDK 静态库（含 C TRTC 源码）。
		set(TC_IOT_SDK_ALL_SRC
			${BASE_SRC}
			${TC_IOT_SDK_SRC}
			${IOT_SDK_ROOT}/src/third_party/cJSON/cJSON.c
		)
		if (BUILD_TRTC)
			list(APPEND TC_IOT_SDK_ALL_SRC ${TRTC_SDK_SRC})
		elseif (BUILD_IOT_CLOUD_STORAGE)
			# CS-only（无 AV/aitalk）：BUILD_TRTC=0，但仍需 third_party（含 libtcmov/fMP4）。
			list(APPEND TC_IOT_SDK_ALL_SRC ${THIRD_PARTY_SRC})
		endif()

		add_library(tc_iot_sdk STATIC ${TC_IOT_SDK_ALL_SRC})
		target_include_directories(tc_iot_sdk PRIVATE
			${TC_IOT_SDK_INC}
			${IOT_SDK_ROOT}
			${IOT_SDK_ROOT}/src/base
			${IOT_SDK_ROOT}/src/third_party/cJSON
			${IOT_SDK_ROOT}/src/third_party/jansson/src
			${IOT_SDK_ROOT}/src/third_party/jansson/private_include
			${IOT_SDK_ROOT}/src/trtc/include
			${THIRD_PARTY_INC}
		)
		target_compile_definitions(tc_iot_sdk PRIVATE
			__STDC_LIMIT_MACROS __STDC_CONSTANT_MACROS PB_BUFFER_ONLY HAVE_STDINT_H
			MQTT_DO_NOT_USE_CUSTOM_CONFIG NDEBUG
			BUILD_OPUS=${BUILD_OPUS}
		)
		target_compile_options(tc_iot_sdk PRIVATE
			$<$<COMPILE_LANGUAGE:C>:-Wno-discarded-qualifiers>
			-Wno-stringop-truncation
			-Wno-stringop-overflow
			-O3
			-ffile-prefix-map=${IOT_SDK_ROOT}/=
		)
		target_link_libraries(tc_iot_sdk PRIVATE
			__armino_lwip_intf_v2_1 __armino_psa_mbedtls __armino_bk_vfs __armino_zlib)

		target_link_libraries(${COMPONENT_LIB} INTERFACE tc_iot_sdk)
		target_include_directories(${COMPONENT_LIB} PRIVATE ${TC_IOT_SDK_INC})
		target_compile_definitions(${COMPONENT_LIB} PRIVATE MQTT_DO_NOT_USE_CUSTOM_CONFIG NDEBUG)
		target_compile_options(${COMPONENT_LIB} PRIVATE $<$<COMPILE_LANGUAGE:C>:-Wno-discarded-qualifiers> -O3 -ffile-prefix-map=${IOT_SDK_ROOT}/=)
	endif()
endif()

list(APPEND c_compile_options "-Wno-error=unused-but-set-variable")
list(APPEND c_compile_options "-Wno-error=incompatible-pointer-types")
list(APPEND c_compile_options "-Wno-error=unused-variable")
list(APPEND c_compile_options "-enable-non-contiguous-regions")
list(APPEND c_compile_options "-Wno-format")
list(APPEND c_compile_options "-Wno-missing-field-initializers")
list(APPEND c_compile_options "-Wno-write-strings")
list(APPEND c_compile_options "-Wno-unused-value")
list(APPEND c_compile_options "-Wno-pointer-sign")
list(APPEND c_compile_options "-Wno-int-conversion")
list(APPEND c_compile_options "-Wno-error=address")
list(APPEND c_compile_options "-Wno-error=enum-compare")
list(APPEND c_compile_options "-Wno-maybe-uninitialized")
list(APPEND c_compile_options "-Wno-error=unused-const-variable")

armino_build_set_property(C_COMPILE_OPTIONS "${c_compile_options}" APPEND)

list(APPEND cxx_compile_options "-std=c++14")
list(APPEND cxx_compile_options "-fno-exceptions")
list(APPEND cxx_compile_options "-fno-rtti")
list(APPEND cxx_compile_options "-D__BK7258_SPINLOCK_ATOMICS__")
armino_build_set_property(CXX_COMPILE_OPTIONS "${cxx_compile_options}" APPEND)
