cmake_minimum_required(VERSION 3.16)

if(ESP_PLATFORM)
  # ---------------------------------------------------------------------------
  # Сборка как компонента ESP-IDF (корень репозитория = компонент; имя
  # компонента = имя каталога, из которого он подключён).
  # ВАЖНО: cmake_minimum_required должен остаться до этой ветки, project()
  # для IDF-сборки не вызывается.
  # ---------------------------------------------------------------------------
  idf_component_register(
    SRCS
      "src/ayla/crypto.cpp"
      "src/ayla/envelope.cpp"
      "src/ayla/httpc.cpp"
      "src/ayla/httpd.cpp"
      "src/ayla/log.cpp"
      "src/ayla/platform/esp-idf/platform.cpp"
    INCLUDE_DIRS
      "include"
    PRIV_INCLUDE_DIRS
      "."
      "src"
    PRIV_REQUIRES
      lwip
      esp_timer
      esp_hw_support
      pthread
      mbedtls
  )
  target_compile_options(${COMPONENT_LIB} PRIVATE
    -Wall -Wextra -Werror
    -fno-exceptions -fno-rtti
  )
  target_compile_features(${COMPONENT_LIB} PUBLIC cxx_std_20)
else()
  # ---------------------------------------------------------------------------
  # Обычная (POSIX) сборка: статическая библиотека + тесты.
  # ---------------------------------------------------------------------------
  project(fgl-aircon VERSION 0.1.0 LANGUAGES CXX)

  option(FGL_BUILD_TESTS "Build tests" ON)
  option(FGL_BUNDLED_MBEDTLS "Fetch and build Mbed TLS instead of system" OFF)

  # ---- mbedtls ----
  if(NOT FGL_BUNDLED_MBEDTLS)
    find_path(MBEDTLS_INCLUDE_DIR mbedtls/aes.h
      HINTS /usr/include/mbedtls3 /usr/include
    )
    find_library(MBEDTLS_CRYPTO_LIB
      NAMES mbedcrypto-3 mbedcrypto
    )
    if(NOT MBEDTLS_INCLUDE_DIR OR NOT MBEDTLS_CRYPTO_LIB)
      message(STATUS "System Mbed TLS not found - falling back to bundled")
      set(FGL_BUNDLED_MBEDTLS ON)
    endif()
  endif()
  if(FGL_BUNDLED_MBEDTLS)
    include(FetchContent)
    FetchContent_Declare(mbedtls
      GIT_REPOSITORY https://github.com/Mbed-TLS/mbedtls.git
      GIT_TAG v3.6.2
      GIT_SHALLOW TRUE
    )
    set(ENABLE_PROGRAMS OFF CACHE BOOL "" FORCE)
    set(ENABLE_TESTING OFF CACHE BOOL "" FORCE)
    set(USE_SHARED_MBEDTLS_LIBRARY OFF CACHE BOOL "" FORCE)
    set(USE_STATIC_MBEDTLS_LIBRARY ON CACHE BOOL "" FORCE)
    FetchContent_MakeAvailable(mbedtls)
    set(FGL_MBEDTLS_TARGET mbedcrypto STATIC)
    set(FGL_MBEDTLS_INCLUDE_DIR "")
  else()
    set(FGL_MBEDTLS_TARGET "${MBEDTLS_CRYPTO_LIB}")
    set(FGL_MBEDTLS_INCLUDE_DIR "${MBEDTLS_INCLUDE_DIR}")
  endif()

  add_library(fgl-aircon STATIC
    src/ayla/crypto.cpp
    src/ayla/envelope.cpp
    src/ayla/httpc.cpp
    src/ayla/httpd.cpp
    src/ayla/log.cpp
    src/ayla/platform/posix/platform.cpp
  )
  target_include_directories(fgl-aircon
    PUBLIC
      "${CMAKE_CURRENT_SOURCE_DIR}/include"
      "${CMAKE_CURRENT_SOURCE_DIR}"
      "${FGL_MBEDTLS_INCLUDE_DIR}"
    PRIVATE
      "${CMAKE_CURRENT_SOURCE_DIR}/src"
  )
  target_link_libraries(fgl-aircon PUBLIC ${FGL_MBEDTLS_TARGET})
  target_compile_features(fgl-aircon PUBLIC cxx_std_20)
  target_compile_options(fgl-aircon PRIVATE
    -Wall -Wextra -Werror
    -fno-exceptions -fno-rtti
  )

  if(FGL_BUILD_TESTS)
    enable_testing()
    add_subdirectory(tests)
  endif()
endif()
