# Copyright (c) 2020 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/chip.gni")
import("//build_overrides/efr32_sdk.gni")
import("//build_overrides/jlink.gni")
import("${chip_root}/src/platform/device.gni")
import("${efr32_sdk_build_root}/silabs_board.gni")

if (silabs_board == "BRD4325A") {  # CCP board
  import("${efr32_sdk_build_root}/SiWx917_sdk.gni")
} else {
  import("${efr32_sdk_build_root}/efr32_sdk.gni")
}

declare_args() {
  # Build target to use for efr32 SDK. Use this to set global SDK defines.
  efr32_sdk_target = ""
  sl_ot_efr32_root = "${chip_root}/third_party/openthread/ot-efr32"
  sl_openthread_root = "${chip_root}/third_party/openthread/ot-efr32/openthread"
  use_thread_coap_lib = false
  sl_matter_version_str = ""
}

assert(efr32_sdk_target != "", "efr32_sdk_target must be specified")

config("silabs_config") {
  if (sl_matter_version_str != "") {
    defines = [ "SL_MATTER_VERSION_STRING=\"${sl_matter_version_str}\"" ]
  }
}

group("efr32_sdk") {
  public_deps = [ efr32_sdk_target ]
}

if (use_silabs_thread_lib) {
  config("libopenthread-platform_config") {
    include_dirs = [ "${sl_openthread_root}/examples/platforms" ]
  }

  copy("copy_openthread_system") {
    sources = [ "${sl_openthread_root}/examples/platforms/openthread-system.h" ]

    outputs =
        [ "${root_gen_dir}/include/openthread/platform/{{source_file_part}}" ]
  }

  source_set("openthread_system") {
    sources =
        [ "${root_gen_dir}/include/openthread/platform/openthread-system.h" ]
    deps = [ ":copy_openthread_system" ]
  }

  source_set("libopenthread-platform") {
    sources = [ "${sl_openthread_root}/examples/platforms/openthread-system.h" ]

    public_deps = [ ":openthread_system" ]

    public_configs = [ ":libopenthread-platform_config" ]
  }

  config("openthread_efr32_config") {
    defines = [
      "RADIO_CONFIG_DMP_SUPPORT=1",
      "${silabs_board}=1",
      "${silabs_mcu}",
      "OPENTHREAD_CORE_CONFIG_PLATFORM_CHECK_FILE=\"openthread-core-efr32-config-check.h\"",
    ]

    include_dirs = [
      "${chip_root}/examples/platform/silabs/efr32",
      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}",
      "${sl_ot_efr32_root}/src/src",
      "${sl_openthread_root}/src/",
    ]
  }

  source_set("openthread_core_config_efr32") {
    sources = [
      "${sl_ot_efr32_root}/src/src/openthread-core-efr32-config-check.h",
      "${sl_ot_efr32_root}/src/src/openthread-core-efr32-config.h",
    ]

    public_deps = [
      ":libopenthread-platform",
      "${efr32_sdk_build_root}:efr32_sdk",
    ]

    public_configs = [ ":openthread_efr32_config" ]
  }

  source_set("ot-efr32-cert") {
    if (enable_openthread_cli) {
      sources = [
        "${sl_openthread_root}/examples/apps/cli/cli_uart.cpp",
        "${sl_openthread_root}/src/cli/cli.cpp",
        "${sl_openthread_root}/src/cli/cli.hpp",
        "${sl_openthread_root}/src/cli/cli_coap.cpp",
        "${sl_openthread_root}/src/cli/cli_coap.hpp",
        "${sl_openthread_root}/src/cli/cli_coap_secure.cpp",
        "${sl_openthread_root}/src/cli/cli_coap_secure.hpp",
        "${sl_openthread_root}/src/cli/cli_commissioner.cpp",
        "${sl_openthread_root}/src/cli/cli_commissioner.hpp",
        "${sl_openthread_root}/src/cli/cli_config.h",
        "${sl_openthread_root}/src/cli/cli_dataset.cpp",
        "${sl_openthread_root}/src/cli/cli_dataset.hpp",
        "${sl_openthread_root}/src/cli/cli_history.cpp",
        "${sl_openthread_root}/src/cli/cli_history.hpp",
        "${sl_openthread_root}/src/cli/cli_joiner.cpp",
        "${sl_openthread_root}/src/cli/cli_joiner.hpp",
        "${sl_openthread_root}/src/cli/cli_network_data.cpp",
        "${sl_openthread_root}/src/cli/cli_network_data.hpp",
        "${sl_openthread_root}/src/cli/cli_output.cpp",
        "${sl_openthread_root}/src/cli/cli_output.hpp",
        "${sl_openthread_root}/src/cli/cli_srp_client.cpp",
        "${sl_openthread_root}/src/cli/cli_srp_client.hpp",
        "${sl_openthread_root}/src/cli/cli_srp_server.cpp",
        "${sl_openthread_root}/src/cli/cli_srp_server.hpp",
        "${sl_openthread_root}/src/cli/cli_tcp.cpp",
        "${sl_openthread_root}/src/cli/cli_tcp.hpp",
        "${sl_openthread_root}/src/cli/cli_udp.cpp",
        "${sl_openthread_root}/src/cli/cli_udp.hpp",
        "${sl_openthread_root}/src/cli/x509_cert_key.hpp",
      ]
    }

    public_configs = [
      ":openthread_efr32_config",
      ":libopenthread-platform_config",
    ]

    public_deps = [
      ":libopenthread-platform",
      ":openthread_core_config_efr32",
      "${segger_rtt_root}:segger_rtt",
      "${sl_openthread_root}/include/openthread:openthread",
      "${sl_openthread_root}/src/core/:libopenthread_core_headers",
    ]

    deps = [ "${efr32_sdk_build_root}:efr32_sdk" ]

    # selected thread device type FTD or MTD
    XTD = "ftd"
    if (!chip_openthread_ftd) {
      XTD = "mtd"
    }

    # Use silabs openthread library stack with or without coap api enabled
    COAP_API = ""
    if (use_thread_coap_lib) {
      COAP_API = "coap_"
    }

    public_configs += [ "${sl_openthread_root}:openthread_${XTD}_config" ]

    libs = [
      "${sl_ot_efr32_root}/libs/libsl_ot_stack_${XTD}_${COAP_API}${silabs_family}_gcc.a",
      "${sl_ot_efr32_root}/libs/libsl_platform_${XTD}_dmp_${silabs_family}_gcc.a",
    ]
  }
}
