# 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}/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
}

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

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/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",
    ]
  }
}
