# Copyright (c) 2021 Project CHIP Authors
#
# 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.

import("//build_overrides/build.gni")
import("//build_overrides/chip.gni")
import("${chip_root}/build/chip/chip_codegen.gni")
import("${chip_root}/src/platform/python.gni")

import("${chip_root}/src/lib/core/core.gni")

_app_root = get_path_info(".", "abspath")

_zap_cluster_list_script = get_path_info("zap_cluster_list.py", "abspath")

# Defines a source_set for CHIP data model.
#
# Arguments:
#  zap_pregenerated_dir
#    Path to the ZAP "gen" dir.
#
#  zap_file
#    Path to the ZAP input file.
#
#  idl
#    Path to the .matter IDL corresponding to the zap file. This is for
#    dependencies on build-time code generation.
#
# Forwards all the remaining variables to the source_set.
#
template("chip_data_model") {
  _data_model_name = target_name

  if (defined(invoker.idl)) {
    _idl = invoker.idl
  } else {
    # Assume that IDL name is the same as the zap file name, but instead of
    # '.zap' use '.matter' as extension. This is currently the case in the
    # sample apps, but may change in the future
    _idl = string_replace(invoker.zap_file, ".zap", ".matter")
  }

  config("${_data_model_name}_config") {
    include_dirs = []

    if (defined(invoker.zap_pregenerated_dir)) {
      include_dirs += [ "${invoker.zap_pregenerated_dir}/.." ]
    }
  }

  chip_zapgen("${_data_model_name}_zapgen") {
    input = rebase_path(invoker.zap_file)
    generator = "app-templates"

    outputs = [
      "zap-generated/access.h",
      "zap-generated/gen_config.h",
      "zap-generated/endpoint_config.h",
      "zap-generated/CHIPClientCallbacks.h",
    ]

    if (chip_code_pre_generated_directory == "") {
      prune_outputs = []
    }

    if (chip_controller) {
      outputs += [ "zap-generated/CHIPClusters.h" ]
    } else {
      if (defined(prune_outputs)) {
        prune_outputs += [ "zap-generated/CHIPClusters.h" ]
      }
    }

    # TODO: It is unclear here why `zap_pregenerated_dir` has any relevance
    #       in including IMClusterCommandHandler or not.
    #
    #       This logic has been carried over from previous code during compile
    #       time codegen addition, however the rationale of why pregenerated
    #       dir controls IMClusterCommandHandler needs to be explained and
    #       potentially controlled by a clearer variable (is this for controllers?
    #       is this during app compile but not others? I am unclear what
    #       zap_pregenerated_dir is supposed to convey. Existence of a directory
    #       does not obviously map to "need command handler cpp compiled in").
    if (defined(invoker.zap_pregenerated_dir)) {
      outputs += [ "zap-generated/IMClusterCommandHandler.cpp" ]
    } else {
      if (defined(prune_outputs)) {
        prune_outputs += [ "zap-generated/IMClusterCommandHandler.cpp" ]
      }
    }

    public_configs = [ ":${_data_model_name}_config" ]

    if (!defined(deps)) {
      deps = []
    }

    deps += [ "${chip_root}/src/app" ]
  }

  chip_codegen("${_data_model_name}_codegen") {
    input = _idl
    generator = "cpp-app"

    outputs = [
      "app/PluginApplicationCallbacks.h",
      "app/callback-stub.cpp",
    ]

    public_configs = [ ":${_data_model_name}_config" ]

    if (!defined(deps)) {
      deps = []
    }

    deps += [
      ":${_data_model_name}_zapgen",
      "${chip_root}/src/app/common:cluster-objects",
    ]
  }

  source_set(_data_model_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "zap_pregenerated_dir",
                             "zap_file",
                             "is_server",
                           ])

    if (!defined(sources)) {
      sources = []
    }

    if (!defined(is_server)) {
      is_server = false
    }

    sources += [
      "${_app_root}/clusters/barrier-control-server/barrier-control-server.h",
      "${_app_root}/clusters/basic-information/basic-information.h",
      "${_app_root}/clusters/client-monitoring-server/client-monitoring-server.h",
      "${_app_root}/clusters/color-control-server/color-control-server.h",
      "${_app_root}/clusters/door-lock-server/door-lock-server.h",
      "${_app_root}/clusters/groups-server/groups-server.h",
      "${_app_root}/clusters/identify-server/identify-server.h",
      "${_app_root}/clusters/level-control/level-control.h",
      "${_app_root}/clusters/on-off-server/on-off-server.h",
      "${_app_root}/clusters/scenes/scenes-tokens.h",
      "${_app_root}/clusters/scenes/scenes.h",
      "${_app_root}/util/ClientMonitoringRegistrationTable.cpp",
      "${_app_root}/util/ClientMonitoringRegistrationTable.h",
      "${_app_root}/util/DataModelHandler.cpp",
      "${_app_root}/util/af-event.cpp",
      "${_app_root}/util/attribute-size-util.cpp",
      "${_app_root}/util/attribute-storage.cpp",
      "${_app_root}/util/attribute-table.cpp",
      "${_app_root}/util/binding-table.cpp",
      "${_app_root}/util/binding-table.h",
      "${_app_root}/util/ember-compatibility-functions.cpp",
      "${_app_root}/util/ember-print.cpp",
      "${_app_root}/util/error-mapping.cpp",
      "${_app_root}/util/generic-callback-stubs.cpp",
      "${_app_root}/util/message.cpp",
      "${_app_root}/util/privilege-storage.cpp",
      "${_app_root}/util/util.cpp",
      "${chip_root}/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp",
    ]

    if (defined(invoker.zap_file)) {
      _zap_path = rebase_path(invoker.zap_file, root_build_dir)
      _script_path = rebase_path(_zap_cluster_list_script, root_build_dir)
      _script_args = [ "--zap_file=" + _zap_path ]

      _cluster_sources = exec_script("${build_root}/gn_run_binary.py",
                                     [ _script_path ] + _script_args,
                                     "list lines",
                                     [ invoker.zap_file ])
    }

    foreach(cluster, _cluster_sources) {
      if (cluster == "door-lock-server") {
        sources += [
          "${_app_root}/clusters/${cluster}/door-lock-server-callback.cpp",
          "${_app_root}/clusters/${cluster}/door-lock-server.cpp",
        ]
      } else if (cluster == "mode-select-server") {
        sources += [
          "${_app_root}/clusters/${cluster}/${cluster}.cpp",
          "${_app_root}/clusters/${cluster}/supported-modes-manager.h",
        ]
      } else if (cluster == "application-launcher-server") {
        sources += [
          "${_app_root}/app-platform/ContentApp.cpp",
          "${_app_root}/app-platform/ContentAppPlatform.cpp",
          "${_app_root}/clusters/${cluster}/${cluster}.cpp",
        ]
      } else if (cluster == "ota-requestor") {
        sources += [
          # TODO - align name of folder ?
          "${_app_root}/clusters/${cluster}/${cluster}-server.cpp",
          "${_app_root}/clusters/${cluster}/BDXDownloader.cpp",
          "${_app_root}/clusters/${cluster}/BDXDownloader.h",
          "${_app_root}/clusters/${cluster}/DefaultOTARequestor.cpp",
          "${_app_root}/clusters/${cluster}/DefaultOTARequestorDriver.cpp",
          "${_app_root}/clusters/${cluster}/DefaultOTARequestorStorage.cpp",
          "${_app_root}/clusters/${cluster}/DefaultOTARequestorStorage.h",
          "${_app_root}/clusters/${cluster}/DefaultOTARequestorUserConsent.h",
          "${_app_root}/clusters/${cluster}/ExtendedOTARequestorDriver.cpp",
          "${_app_root}/clusters/${cluster}/OTARequestorStorage.h",
          "${_app_root}/clusters/${cluster}/OTATestEventTriggerDelegate.cpp",
          "${_app_root}/clusters/${cluster}/OTATestEventTriggerDelegate.h",
        ]
      } else if (cluster == "bindings") {
        sources += [
          "${_app_root}/clusters/${cluster}/${cluster}.cpp",
          "${_app_root}/clusters/${cluster}/BindingManager.cpp",
          "${_app_root}/clusters/${cluster}/BindingManager.h",
          "${_app_root}/clusters/${cluster}/PendingNotificationMap.cpp",
          "${_app_root}/clusters/${cluster}/PendingNotificationMap.h",
        ]
      } else {
        sources += [ "${_app_root}/clusters/${cluster}/${cluster}.cpp" ]
      }
    }

    if (!defined(public_deps)) {
      public_deps = []
    }

    public_deps += [
      ":${_data_model_name}_codegen",
      ":${_data_model_name}_zapgen",
      "${chip_root}/src/app",
      "${chip_root}/src/app/common:cluster-objects",
      "${chip_root}/src/controller",
      "${chip_root}/src/lib/core",
      "${chip_root}/src/lib/support",
      "${chip_root}/src/protocols/secure_channel",
    ]

    if (is_server) {
      public_deps += [ "${chip_root}/src/app/server" ]
    }

    if (!defined(cflags)) {
      cflags = []
    }

    cflags += [ "-Wconversion" ]

    if (!defined(public_configs)) {
      public_configs = []
    }

    public_configs += [ ":${_data_model_name}_config" ]
  }
}
