if(ESP_PLATFORM)
  return()
endif()

set(TARGET_APP_NAME iot_video_demo)

set(ROOT_DIR ${CMAKE_SOURCE_DIR})

# tc_iot_sdk 静态库由 src/iot/CMakeLists.txt 创建。 demo 可执行文件 —— 只依赖 public
# API：include 仅 {当前目录, src/api/iot}， 链接预编译并已自包含的 tc_iot_sdk .a / --shared 时的
# .so（build.sh 先编 .a、 ar 合并后经 -DTC_IOT_SDK_LIB_PATH 传入）。未设该变量时不建 demo。
if(NOT BUILD_IOT_AV)
  return()
endif()

# SDK 链接来源（二选一）：
#  1) -DTC_IOT_SDK_LIB_PATH：build.sh 两阶段产出的自包含 .a（窄 include 边界，保持原行为）。
#  2) 同工程内已构建 tc_iot_sdk 目标（IDE 单工程联编，如 Xcode/CLion）：把 tc_iot_sdk
#     + TrtcSDK(+libopus) 合并为单一自包含 .a 再链接，等价于 build.sh 的 ar/libtool 合并，
#     既消解 tc_iot_sdk <-> TrtcSDK 的循环引用，又避免 faac/helix 符号重复。
if(TC_IOT_SDK_LIB_PATH)
  set(_IOT_SDK_LINK ${TC_IOT_SDK_LIB_PATH})
elseif(TARGET tc_iot_sdk)
  set(_IOT_SDK_MERGE_LIST tc_iot_sdk)
  if(USE_TRTC_C AND TARGET ${TrtcSDK_TARGET})
    list(APPEND _IOT_SDK_MERGE_LIST ${TrtcSDK_TARGET})
  endif()
  if(BUILD_OPUS AND TARGET libopus)
    list(APPEND _IOT_SDK_MERGE_LIST libopus)
  endif()

  set(_IOT_SDK_MERGE_PATHS "")
  foreach(_t ${_IOT_SDK_MERGE_LIST})
    list(APPEND _IOT_SDK_MERGE_PATHS "$<TARGET_FILE:${_t}>")
  endforeach()

  # $<CONFIG> 目录隔离：Xcode 多配置生成器下 Debug/Release 产物互不覆盖。
  set(_IOT_SDK_MERGED_A ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/libtc_iot_sdk_merged.a)
  if(APPLE)
    # BSD libtool：把多个 .a 的成员对象合并为单一静态库
    add_custom_command(OUTPUT ${_IOT_SDK_MERGED_A}
      COMMAND /usr/bin/libtool -static -o ${_IOT_SDK_MERGED_A} ${_IOT_SDK_MERGE_PATHS}
      DEPENDS ${_IOT_SDK_MERGE_LIST}
      COMMENT "Merge tc_iot_sdk(+TrtcSDK) into self-contained .a for iot_video_demo")
  else()
    # GNU ar MRI 脚本合并多个 .a
    set(_IOT_SDK_MRI ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/merge_iot_sdk.mri)
    set(_MRI_CONTENT "CREATE ${_IOT_SDK_MERGED_A}\n")
    foreach(_t ${_IOT_SDK_MERGE_LIST})
      string(APPEND _MRI_CONTENT "ADDLIB $<TARGET_FILE:${_t}>\n")
    endforeach()
    string(APPEND _MRI_CONTENT "SAVE\nEND\n")
    file(GENERATE OUTPUT ${_IOT_SDK_MRI} CONTENT "${_MRI_CONTENT}")
    add_custom_command(OUTPUT ${_IOT_SDK_MERGED_A}
      COMMAND ${CMAKE_AR} -M < ${_IOT_SDK_MRI}
      DEPENDS ${_IOT_SDK_MERGE_LIST} ${_IOT_SDK_MRI}
      COMMENT "Merge tc_iot_sdk(+TrtcSDK) into self-contained .a for iot_video_demo")
  endif()
  add_custom_target(_iot_sdk_merged DEPENDS ${_IOT_SDK_MERGED_A})
  set(_IOT_SDK_LINK ${_IOT_SDK_MERGED_A})
else()
  message(STATUS "Demo: neither TC_IOT_SDK_LIB_PATH nor tc_iot_sdk target, skip iot_video_demo")
  return()
endif()

# minimp4 单头文件库：在 build 目录中生成 .c 文件，内含 #define MINIMP4_IMPLEMENTATION
set(MINIMP4_C ${CMAKE_CURRENT_BINARY_DIR}/minimp4.c)
file(WRITE ${MINIMP4_C} "#define MINIMP4_IMPLEMENTATION\n"
                        "#include \"minimp4.h\"\n")

list(
  APPEND
  IOT_VIDEO_SRC_LIST
  ${CMAKE_CURRENT_SOURCE_DIR}/main.c
  ${CMAKE_CURRENT_SOURCE_DIR}/iot_demo.c
  ${CMAKE_CURRENT_SOURCE_DIR}/cmd_exec.c
  ${CMAKE_CURRENT_SOURCE_DIR}/file_stream.c
  ${CMAKE_CURRENT_SOURCE_DIR}/av_device_linux.c
  ${CMAKE_CURRENT_SOURCE_DIR}/av_sender.c
  ${CMAKE_CURRENT_SOURCE_DIR}/av_receiver.c
  ${CMAKE_CURRENT_SOURCE_DIR}/cloud_storage_demo.c
  ${MINIMP4_C})

add_executable(${TARGET_APP_NAME} ${IOT_VIDEO_SRC_LIST})

# 回退模式（同工程联编）下，先合并 tc_iot_sdk+TrtcSDK 为自包含 .a 再链接。
if(TARGET _iot_sdk_merged)
  add_dependencies(${TARGET_APP_NAME} _iot_sdk_merged)
endif()

# 把 demo_media 的绝对路径编译进程序，使媒体文件查找不依赖运行工作目录
# （Xcode/CLI 运行均可，避免 ./src/demo/... 相对路径在构建产物目录下解析失败）。
target_compile_definitions(${TARGET_APP_NAME} PRIVATE
    IOT_DEMO_MEDIA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/demo_media/")

# 窄 include：任何 src/base、src/third_party 越界 include 都会在此编译失败（强制只依赖 public API）。
target_include_directories(
  ${TARGET_APP_NAME}
  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${ROOT_DIR}/src/api/iot
          ${ROOT_DIR}/src/base/hal ${ROOT_DIR})

if(WIN32)
  target_link_libraries(${TARGET_APP_NAME} PRIVATE ${_IOT_SDK_LINK}
                                                   Ws2_32.lib)
elseif(APPLE)
  target_link_libraries(${TARGET_APP_NAME} PRIVATE ${_IOT_SDK_LINK} z m
                                                   pthread)
  find_library(FOUNDATION_FRAMEWORK Foundation)
  target_link_libraries(${TARGET_APP_NAME} PRIVATE ${FOUNDATION_FRAMEWORK})
  find_library(SYSTEM_CONFIGURATION_FRAMEWORK SystemConfiguration)
  target_link_libraries(${TARGET_APP_NAME}
                        PRIVATE ${SYSTEM_CONFIGURATION_FRAMEWORK})
  if(NOT IOS)
    find_library(APPKIT_FRAMEWORK AppKit)
    target_link_libraries(${TARGET_APP_NAME} PRIVATE ${APPKIT_FRAMEWORK})
  endif()
else()
  # 系统库：桌面用系统 z(libz)+dl；交叉编译时 zlib 已并入 .a、dl 在 musl/uclibc 并入 libc，仅留
  # m+pthread。
  set(_demo_syslibs m pthread)
  if(NOT CMAKE_CROSSCOMPILING)
    list(APPEND _demo_syslibs z dl)
  endif()
  if(TC_IOT_SDK_LIB_PATH MATCHES "\\.(so|dylib)$")
    get_filename_component(_sdk_so_dir "${TC_IOT_SDK_LIB_PATH}" DIRECTORY)
    set(_so_extra "")
    set(_trtc_rpath "")
    # :c 的 .so 已含 TRTC-c，勿链 libliteav（未设 TRTC_CC_LIB_ARCH 时会落到 x64 .so）。
    if(NOT USE_TRTC_C)
      if(TRTC_CC_LIB_ARCH)
        set(_trtc_lib_dir
            ${ROOT_DIR}/src/third_party/iot_trtc/lib/${TRTC_CC_LIB_ARCH})
      else()
        set(_trtc_lib_dir ${ROOT_DIR}/src/third_party/iot_trtc/lib/x64)
      endif()
      if(EXISTS ${_trtc_lib_dir}/libliteav.so)
        list(APPEND _so_extra ${_trtc_lib_dir}/libliteav.so)
        if(EXISTS ${_trtc_lib_dir}/libtxffmpeg.so)
          list(APPEND _so_extra ${_trtc_lib_dir}/libtxffmpeg.so)
        endif()
        set(_trtc_rpath "${_trtc_lib_dir}")
      endif()
      # cc 的 .so 仍带 C++ ABI UND；C demo 用 gcc 链，须显式 stdc++。
      list(APPEND _so_extra stdc++)
      if(CMAKE_SYSTEM_PROCESSOR MATCHES "mips")
        list(APPEND _so_extra atomic)
      endif()
    endif()
    target_link_libraries(
      ${TARGET_APP_NAME} PRIVATE ${_IOT_SDK_LINK} ${_so_extra}
                                 ${_demo_syslibs})
    set_target_properties(
      ${TARGET_APP_NAME} PROPERTIES BUILD_RPATH "${_sdk_so_dir};${_trtc_rpath}")
  elseif(USE_TRTC_C AND ${BUILD_TRTC} EQUAL 1)
    # c 模式：.a 已并入 TRTC-c/opus，仅需系统库；--start-group 兜底归并库内部互相引用。
    target_link_libraries(
      ${TARGET_APP_NAME} PRIVATE -Wl,--start-group ${_IOT_SDK_LINK}
                                 -Wl,--end-group ${_demo_syslibs})
  elseif(CMAKE_CROSSCOMPILING)
    # cc 交叉：默认静态 libliteav.a 已并入自包含 .a；若存在 .so（如 x5 动态 cc）则单独链接。
    if(TRTC_CC_LIB_ARCH)
      set(_trtc_lib_dir
          ${ROOT_DIR}/src/third_party/iot_trtc/lib/${TRTC_CC_LIB_ARCH})
    else()
      set(_trtc_lib_dir ${ROOT_DIR}/src/third_party/iot_trtc/lib/x64)
    endif()
    set(_liteav_so ${_trtc_lib_dir}/libliteav.so)
    set(_txffmpeg_so ${_trtc_lib_dir}/libtxffmpeg.so)
    if(EXISTS ${_liteav_so})
      set(_cc_extra stdc++)
      set(_trtc_so_libs ${_liteav_so})
      if(EXISTS ${_txffmpeg_so})
        list(APPEND _trtc_so_libs ${_txffmpeg_so})
      endif()
      set(_zlib_link "")
      if(DEFINED XC_LINK_DIRS AND EXISTS ${XC_LINK_DIRS}/libz.so.1.2.11)
        set(_zlib_link ${XC_LINK_DIRS}/libz.so.1.2.11)
      elseif(DEFINED XC_LINK_DIRS AND EXISTS ${XC_LINK_DIRS}/libz.so.1)
        set(_zlib_link ${XC_LINK_DIRS}/libz.so.1)
      else()
        list(APPEND _demo_syslibs z)
      endif()
      if(CMAKE_SYSTEM_PROCESSOR MATCHES "mips")
        list(APPEND _cc_extra atomic)
      endif()
      target_link_libraries(
        ${TARGET_APP_NAME}
        PRIVATE -Wl,--start-group
                ${_IOT_SDK_LINK}
                -Wl,--end-group
                ${_trtc_so_libs}
                ${_cc_extra}
                ${_zlib_link}
                ${_demo_syslibs})
    else()
      # MIPS32 无原生 64-bit 原子操作，需 libatomic。
      set(_cc_extra stdc++)
      if(CMAKE_SYSTEM_PROCESSOR MATCHES "mips")
        list(APPEND _cc_extra atomic)
      endif()
      target_link_libraries(
        ${TARGET_APP_NAME}
        PRIVATE -Wl,--start-group ${_IOT_SDK_LINK} -Wl,--end-group
                ${_cc_extra} ${_demo_syslibs})
    endif()
  else()
    # cc x64 原生：TRTC 走预编 libliteav.so/libtxffmpeg.so。
    find_library(LIBLITEAV libliteav.so
                 ${ROOT_DIR}/src/third_party/iot_trtc/lib/x64/ NO_DEFAULT_PATH)
    find_library(LIBTXFFMPEG libtxffmpeg.so
                 ${ROOT_DIR}/src/third_party/iot_trtc/lib/x64/ NO_DEFAULT_PATH)
    target_link_libraries(
      ${TARGET_APP_NAME}
      PRIVATE -Wl,--start-group ${_IOT_SDK_LINK} -Wl,--end-group
              ${LIBLITEAV} ${LIBTXFFMPEG} ${_demo_syslibs})
  endif()
endif()
