# 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/chip.gni")

import("${chip_root}/src/platform/device.gni")

assert(chip_device_platform == "esp32")

declare_args() {
  # By default use default/example implementation of CommissionableDataProvider,
  # DeviceAttestationCredentialsProvider and DeviceInstanceInforProvider
  chip_use_factory_data_provider = false
  chip_use_device_info_provider = false
  chip_config_software_version_number = 0
  chip_enable_chipoble = true
  chip_bt_nimble_enabled = false
  chip_bt_bluedroid_enabled = false
  chip_enable_ble_controller = false
  chip_use_secure_cert_dac_provider = false
  chip_use_esp32_ecdsa_peripheral = false
}

defines = [
  "CHIP_CONFIG_SOFTWARE_VERSION_NUMBER=${chip_config_software_version_number}",
]

static_library("ESP32") {
  sources = [
    "../SingletonConfigurationManager.cpp",
    "CHIPDevicePlatformConfig.h",
    "CHIPDevicePlatformEvent.h",
    "ConfigurationManagerImpl.cpp",
    "ConfigurationManagerImpl.h",
    "ConnectivityManagerImpl.cpp",
    "ConnectivityManagerImpl.h",
    "ConnectivityManagerImpl_Ethernet.cpp",
    "DiagnosticDataProviderImpl.cpp",
    "DiagnosticDataProviderImpl.h",
    "ESP32Config.cpp",
    "ESP32Config.h",
    "ESP32Utils.cpp",
    "ESP32Utils.h",
    "KeyValueStoreManagerImpl.cpp",
    "KeyValueStoreManagerImpl.h",
    "Logging.cpp",
    "LwIPCoreLock.cpp",
    "PlatformManagerImpl.cpp",
    "PlatformManagerImpl.h",
    "SystemTimeSupport.cpp",
    "SystemTimeSupport.h",
  ]

  deps = [
    "${chip_root}/src/lib/dnssd:platform_header",
    "${chip_root}/src/setup_payload",
  ]

  public = [
    "${chip_root}/src/credentials/CHIPCert.h",
    "${chip_root}/src/credentials/DeviceAttestationCredsProvider.h",
  ]

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

  if (chip_enable_ota_requestor) {
    sources += [
      "OTAImageProcessorImpl.cpp",
      "OTAImageProcessorImpl.h",
    ]
  }

  if (chip_enable_chipoble) {
    sources += [
      "BLEManagerImpl.h",
      "ChipDeviceScanner.h",
    ]
  }

  if (chip_enable_ble_controller) {
    sources += [ "ChipDeviceScanner.h" ]
  }

  if (chip_bt_nimble_enabled) {
    sources += [ "nimble/BLEManagerImpl.cpp" ]
    if (chip_enable_ble_controller) {
      sources += [
        "nimble/ChipDeviceScanner.cpp",
        "nimble/blecent.h",
        "nimble/misc.c",
        "nimble/peer.c",
      ]
    }
  }

  if (chip_bt_bluedroid_enabled) {
    sources += [ "bluedroid/BLEManagerImpl.cpp" ]
    if (chip_enable_ble_controller) {
      sources += [ "bluedroid/ChipDeviceScanner.cpp" ]
    }
  }

  if (chip_enable_wifi) {
    sources += [
      "ConnectivityManagerImpl_WiFi.cpp",
      "NetworkCommissioningDriver.cpp",
      "NetworkCommissioningDriver.h",
      "route_hook/ESP32RouteHook.c",
      "route_hook/ESP32RouteHook.h",
      "route_hook/ESP32RouteTable.c",
      "route_hook/ESP32RouteTable.h",
    ]
    if (chip_mdns == "platform") {
      sources += [
        "WiFiDnssdImpl.cpp",
        "WiFiDnssdImpl.h",
      ]
    }
  }

  if (chip_mdns == "platform") {
    sources += [ "DnssdImpl.cpp" ]
  }

  if (chip_enable_openthread) {
    sources += [
      "../OpenThread/GenericNetworkCommissioningThreadDriver.cpp",
      "../OpenThread/GenericNetworkCommissioningThreadDriver.h",
      "../OpenThread/OpenThreadUtils.cpp",
      "OpenthreadConfig.h",
      "OpenthreadLauncher.c",
      "OpenthreadLauncher.h",
      "ThreadStackManagerImpl.cpp",
      "ThreadStackManagerImpl.h",
    ]
    if (chip_mdns == "platform") {
      sources += [
        "../OpenThread/OpenThreadDnssdImpl.cpp",
        "../OpenThread/OpenThreadDnssdImpl.h",
      ]
    }
    configs -= [ "${chip_root}/build/config/compiler:warnings_default" ]
  }

  if (chip_use_factory_data_provider) {
    sources += [
      "ESP32FactoryDataProvider.cpp",
      "ESP32FactoryDataProvider.h",
    ]
  }

  if (chip_use_device_info_provider) {
    sources += [
      "ESP32DeviceInfoProvider.cpp",
      "ESP32DeviceInfoProvider.h",
    ]
  }

  if (chip_use_secure_cert_dac_provider) {
    sources += [
      "ESP32SecureCertDACProvider.cpp",
      "ESP32SecureCertDACProvider.h",
    ]
  }

  if (chip_use_esp32_ecdsa_peripheral) {
    sources += [
      "ESP32CHIPCryptoPAL.cpp",
      "ESP32CHIPCryptoPAL.h",
    ]
  }

  cflags = [ "-Wconversion" ]
}
