# Copyright (c) 2021 Project CHIP Authors
# Copyright 2023 NXP
#
# 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/nxp_sdk.gni")
import("//build_overrides/openthread.gni")
import("${chip_root}/src/platform/device.gni")
import("${nxp_sdk_build_root}/${nxp_sdk_name}/${nxp_sdk_name}.gni")
import("${nxp_sdk_build_root}/nxp_sdk.gni")

assert(chip_device_platform == "nxp")

config("nxp_platform_config") {
  defines = [ "EXTERNAL_BLEMANAGERIMPL_HEADER=\"platform/nxp/common/ble_zephyr/BLEManagerImpl.h\"" ]
  include_dirs = [
    ".",
    "../../common",
  ]
  if (chip_with_factory_data == 1) {
    include_dirs += [
      ".",
      "../../common/factory_data",
    ]
    defines += [
      "CONFIG_CHIP_PLAT_LOAD_REAL_FACTORY_DATA=1",
      "CONFIG_CHIP_ENCRYPTED_FACTORY_DATA=1",
    ]

    if (chip_enable_secure_dac_private_key_storage == 1) {
      defines += [ "EXTERNAL_FACTORY_DATA_PROVIDER_IMPL_HEADER=\"platform/nxp/rt/rw61x/FactoryDataProviderImpl.h\"" ]
    } else {
      defines += [ "EXTERNAL_FACTORY_DATA_PROVIDER_IMPL_HEADER=\"platform/nxp/common/factory_data/FactoryDataProviderFwkImpl.h\"" ]
    }
  }
  if (chip_enable_wifi && chip_enable_openthread) {
    # Disable thread nwk commissioning instance on endpoint 0, when OTBR is enabled
    defines += [ "_NO_NETWORK_COMMISSIONING_DRIVER_" ]
  }
}

static_library("nxp_platform") {
  deps = []
  defines = []
  sources = [
    "../../../FreeRTOS/SystemTimeSupport.cpp",
    "../../../SingletonConfigurationManager.cpp",
    "../../common/CHIPDevicePlatformEvent.h",
    "../../common/ConfigurationManagerImpl.cpp",
    "../../common/ConfigurationManagerImpl.h",
    "../../common/ConnectivityManagerImpl.cpp",
    "../../common/ConnectivityManagerImpl.h",
    "../../common/DiagnosticDataProviderImpl.cpp",
    "../../common/DiagnosticDataProviderImpl.h",
    "../../common/KeyValueStoreManagerImpl.cpp",
    "../../common/KeyValueStoreManagerImpl.h",
    "../../common/Logging.cpp",
    "../../common/NXPConfig.h",
    "../../common/NetworkProvisioningServerImpl.h",
    "../../common/PlatformManagerImpl.h",
    "../../common/SoftwareUpdateManagerImpl.h",
    "CHIPDevicePlatformConfig.h",
    "PlatformManagerImpl.cpp",
  ]

  if (rt_nvm_component == "nvm_fwk" || rt_nvm_component == "littlefs") {
    sources += [
      "../../common/NXPConfig.cpp",
      "../../common/ram_storage.c",
      "../../common/ram_storage.h",
    ]
  } else if (rt_nvm_component == "key_storage") {
    sources += [ "../../common/NXPConfigKS.cpp" ]
  }

  public_deps = [ "${chip_root}/src/platform:platform_base" ]

  deps += [ "${chip_root}/src/platform/logging:headers" ]

  if (chip_enable_ble) {
    sources += [
      # Adding random file which defines the function sys_csrand_get which is called by BLEManagerImpl from Zephyr
      "${nxp_sdk_build_root}/${nxp_sdk_name}/sdk_hook/zephyr/random/random.cpp",
      "../../../Zephyr/BLEAdvertisingArbiter.cpp",
      "../../../Zephyr/BLEManagerImpl.cpp",
      "../../common/ble_zephyr/BLEManagerImpl.h",
    ]
  }

  # define CHIP_PLAT_NVM_SUPPORT - See NXPConfig.cpp for definition
  if (rt_nvm_component == "nvm_fwk") {
    defines += [ "CHIP_PLAT_NVM_SUPPORT=1" ]
  } else if (rt_nvm_component == "littlefs") {
    defines += [ "CHIP_PLAT_NVM_SUPPORT=2" ]
  } else if (rt_nvm_component == "key_storage") {
    defines += [ "CHIP_PLAT_NVM_SUPPORT=3" ]
  }

  if (chip_enable_wifi) {
    sources += [
      "../../common/NetworkCommissioningDriver.h",
      "../../common/NetworkCommissioningWiFiDriver.cpp",
    ]
    defines += [ "WIFI_DFS_OPTIMIZATION=1" ]
  }

  if (chip_enable_ota_requestor) {
    sources += [
      "../../common/OTAImageProcessorImpl.cpp",
      "../../common/OTAImageProcessorImpl.h",
    ]
    include_dirs =
        [ "${chip_root}/examples/platform/nxp/common/mcuboot_app_support/" ]
  }

  if (chip_enable_openthread) {
    sources += [
      "../../../OpenThread/OpenThreadUtils.cpp",
      "../../common/ThreadStackManagerImpl.cpp",
      "../../common/ThreadStackManagerImpl.h",
    ]

    deps += [ "${chip_root}/third_party/openthread:openthread" ]
    public_deps += [ "${chip_root}/third_party/openthread:openthread-platform" ]

    if (chip_mdns == "platform") {
      if (chip_enable_wifi) {
        sources += [ "../../common/DnssdImpl.cpp" ]
      } else {
        sources += [
          "../../../OpenThread/DnssdImpl.cpp",
          "../../../OpenThread/OpenThreadDnssdImpl.cpp",
          "../../../OpenThread/OpenThreadDnssdImpl.h",
        ]
      }
      deps += [ "${chip_root}/src/lib/dnssd:platform_header" ]
    }
  }

  if (chip_with_factory_data == 1) {
    sources += [
      "../../common/factory_data/FactoryDataProvider.cpp",
      "../../common/factory_data/FactoryDataProvider.h",
    ]
    if (chip_enable_secure_dac_private_key_storage == 1) {
      sources += [
        # TO BE MOVED TO THE SDK
        "ELSFactoryData.c",
        "ELSFactoryData.h",
        "FactoryDataProviderImpl.cpp",
        "FactoryDataProviderImpl.h",
      ]
    } else {
      sources += [
        "../../common/factory_data/FactoryDataProviderFwkImpl.cpp",
        "../../common/factory_data/FactoryDataProviderFwkImpl.h",
      ]
    }

    deps += [ "${chip_root}/src/credentials:credentials_header" ]
  }

  if (chip_convert_dac_private_key == 1) {
    defines += [ "CHIP_DEVICE_CONFIG_SECURE_DAC_PRIVATE_KEY=1" ]
  }

  deps += [ "${nxp_sdk_build_root}:nxp_sdk" ]

  public_deps += [
    "${chip_root}/examples/platform/nxp/common/app/support:freertos_memory_utils",
    "${chip_root}/src/crypto",
    "${chip_root}/src/platform:syscalls_stub",
  ]

  public_configs = [ ":nxp_platform_config" ]
}
