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

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

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