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

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