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

static_library("ESP32") {
  sources = [
    "../SingletonConfigurationManager.cpp",
    "BLEManagerImpl.h",
    "CHIPDevicePlatformConfig.h",
    "CHIPDevicePlatformEvent.h",
    "ConfigurationManagerImpl.cpp",
    "ConfigurationManagerImpl.h",
    "ConnectivityManagerImpl.cpp",
    "ConnectivityManagerImpl.h",
    "DeviceNetworkProvisioningDelegateImpl.cpp",
    "DeviceNetworkProvisioningDelegateImpl.h",
    "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",
    "bluedroid/BLEManagerImpl.cpp",
    "nimble/BLEManagerImpl.cpp",
  ]

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

  public = [ "${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_wifi) {
    sources += [
      "ConnectivityManagerImpl_WiFi.cpp",
      "NetworkCommissioningDriver.cpp",
      "NetworkCommissioningDriver.h",
    ]
    if (chip_mdns == "platform") {
      sources += [
        "DnssdImpl.cpp",
        "DnssdImpl.h",
      ]
    }
  }

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

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