#
#    Copyright (c) 2022 Project CHIP Authors
#    All rights reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
#

macro(chip_app_component_codegen IDL_NAME)
  include("${CHIP_ROOT}/build/chip/chip_codegen.cmake")

  # The IDF build system performs a two-pass expansion to determine
  # component expansion. The first pass runs in script-mode
  # to determine idf_component_register REQUIRES and PRIV_REQUIRES.
  #
  # We can only set up code generation during the 2nd pass
  #
  # see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html
  if (NOT CMAKE_BUILD_EARLY_EXPANSION)
  
    chip_codegen(app-codegen
      INPUT     "${IDL_NAME}"
      GENERATOR "cpp-app"
      OUTPUTS
            "app/PluginApplicationCallbacks.h"
            "app/callback-stub.cpp"
      OUTPUT_PATH   APP_GEN_DIR
      OUTPUT_FILES  APP_GEN_FILES
    )

    add_dependencies(${COMPONENT_LIB} app-codegen)
    target_include_directories(${COMPONENT_LIB} PUBLIC "${APP_GEN_DIR}")
    target_sources(${COMPONENT_LIB} PRIVATE ${APP_GEN_FILES})
  endif()
endmacro()

macro(chip_app_component_zapgen ZAP_NAME)
  include("${CHIP_ROOT}/build/chip/chip_codegen.cmake")

  # The IDF build system performs a two-pass expansion to determine
  # component expansion. The first pass runs in script-mode
  # to determine idf_component_register REQUIRES and PRIV_REQUIRES.
  #
  # We can only set up code generation during the 2nd pass
  #
  # see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html
  if (NOT CMAKE_BUILD_EARLY_EXPANSION)

    chip_zapgen(app-zapgen
      INPUT     "${ZAP_NAME}"
      GENERATOR "app-templates"
      OUTPUTS
            "zap-generated/access.h"
            "zap-generated/CHIPClientCallbacks.h"
            "zap-generated/CHIPClusters.h"
            "zap-generated/endpoint_config.h"
            "zap-generated/gen_config.h"
            "zap-generated/IMClusterCommandHandler.cpp"
      OUTPUT_PATH   APP_TEMPLATE_GEN_DIR
      OUTPUT_FILES  APP_TEMPLATE_GEN_FILES
    )

    add_dependencies(${COMPONENT_LIB} app-zapgen)
    target_include_directories(${COMPONENT_LIB} PUBLIC "${APP_TEMPLATE_GEN_DIR}")
    target_sources(${COMPONENT_LIB} PRIVATE ${APP_TEMPLATE_GEN_FILES})
  endif()
endmacro()
