# 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/build.gni")
import("//build_overrides/chip.gni")
import("//build_overrides/nlio.gni")
import("//build_overrides/pigweed.gni")

import("${build_root}/config/linux/pkg_config.gni")
import("${chip_root}/build/chip/buildconfig_header.gni")

import("device.gni")

if (chip_enable_openthread) {
  import("//build_overrides/openthread.gni")

  if (chip_device_platform == "linux" || chip_device_platform == "Darwin") {
    import("//build_overrides/ot_br_posix.gni")
  }
}

if (chip_device_platform == "linux" && chip_mdns != "none") {
  pkg_config("avahi_client_config") {
    packages = [ "avahi-client" ]
  }
}

if (chip_device_platform != "none") {
  declare_args() {
    # Extra header to include in CHIPDeviceConfig.h for project.
    chip_device_project_config_include = ""

    # Date the firmware was built.
    chip_device_config_firmware_build_date = ""

    # Time the firmware was built.
    chip_device_config_firmware_build_time = ""

    # Use OpenThread ftd or mtd library
    chip_device_config_thread_ftd = chip_openthread_ftd

    # By pass provision and secure session
    chip_bypass_rendezvous = false

    # Enable including the additional data in the advertisement packets
    chip_enable_additional_data_advertising = true

    # Enable adding optional rotating device id to the additional data.
    chip_enable_rotating_device_id = false

    # lock tracking: none/log/fatal or auto for a platform-dependent choice
    chip_stack_lock_tracking = "auto"

    # todo: below operates are not work without root permission
    # pthread_attr_setschedpolicy in GenericPlatformManagerImpl_POSIX.cpp
    chip_device_config_run_as_root = current_os != "android"
  }

  if (chip_stack_lock_tracking == "auto") {
    if (chip_device_platform == "linux" || chip_device_platform == "tizen" ||
        chip_device_platform == "android") {
      # TODO: should be fatal for development. Change once bugs are fixed
      chip_stack_lock_tracking = "log"
    } else {
      # TODO: may want to enable at least logging for embedded to find bugs
      # this needs tuning depending on how many resources various platforms have
      # available (mainly flash size)
      chip_stack_lock_tracking = "none"
    }
  } else {
    assert(
        chip_stack_lock_tracking == "none" ||
            chip_stack_lock_tracking == "log" ||
            chip_stack_lock_tracking == "fatal",
        "Please select a valid value for chip_stack_lock_tracking: auto, none, log, fatal")
  }

  buildconfig_header("platform_buildconfig") {
    header = "CHIPDeviceBuildConfig.h"
    header_dir = "platform"

    chip_with_gio = chip_enable_wifi
    chip_device_config_enable_wpa = chip_enable_wifi
    chip_device_config_enable_dnssd = chip_mdns != "none"
    chip_stack_lock_tracking_log = chip_stack_lock_tracking != "none"
    chip_stack_lock_tracking_fatal = chip_stack_lock_tracking == "fatal"
    defines = [
      "CHIP_DEVICE_CONFIG_ENABLE_WPA=${chip_device_config_enable_wpa}",
      "CHIP_ENABLE_OPENTHREAD=${chip_enable_openthread}",
      "CHIP_DEVICE_CONFIG_THREAD_FTD=${chip_device_config_thread_ftd}",
      "CHIP_WITH_GIO=${chip_with_gio}",
      "OPENTHREAD_CONFIG_ENABLE_TOBLE=false",
      "CHIP_DEVICE_CONFIG_ENABLE_DNSSD=${chip_device_config_enable_dnssd}",
      "CHIP_BYPASS_RENDEZVOUS=${chip_bypass_rendezvous}",
      "CHIP_STACK_LOCK_TRACKING_ENABLED=${chip_stack_lock_tracking_log}",
      "CHIP_STACK_LOCK_TRACKING_ERROR_FATAL=${chip_stack_lock_tracking_fatal}",
      "CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING=${chip_enable_additional_data_advertising}",
      "CHIP_ENABLE_ROTATING_DEVICE_ID=${chip_enable_rotating_device_id}",
      "CHIP_DEVICE_CONFIG_RUN_AS_ROOT=${chip_device_config_run_as_root}",
    ]

    if (chip_device_platform == "linux" || chip_device_platform == "darwin" ||
        chip_device_platform == "tizen" || chip_device_platform == "android") {
      defines += [ "CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE=${chip_enable_ble}" ]
    }

    if (chip_enable_nfc) {
      defines += [ "CHIP_DEVICE_CONFIG_ENABLE_NFC=1" ]
    }

    if (chip_enable_ota_requestor) {
      defines += [ "CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR=1" ]
    }

    if (chip_device_project_config_include != "") {
      defines += [ "CHIP_DEVICE_PROJECT_CONFIG_INCLUDE=${chip_device_project_config_include}" ]
    }
    if (chip_device_platform_config_include != "") {
      defines += [ "CHIP_DEVICE_PLATFORM_CONFIG_INCLUDE=${chip_device_platform_config_include}" ]
    }

    if (chip_device_config_firmware_build_date != "") {
      defines += [ "CHIP_DEVICE_CONFIG_FIRWMARE_BUILD_DATE=\"${chip_device_config_firmware_build_date}\"" ]
    }
    if (chip_device_config_firmware_build_time != "") {
      defines += [ "CHIP_DEVICE_CONFIG_FIRMWARE_BUILD_TIME=\"${chip_device_config_firmware_build_time}\"" ]
    }

    if (chip_device_platform == "cc13x2_26x2") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_CC13X2_26X2=1",
        "CHIP_DEVICE_LAYER_TARGET=cc13x2_26x2",
      ]
    } else if (chip_device_platform == "darwin") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_DARWIN=1",
        "CHIP_DEVICE_LAYER_TARGET=Darwin",
      ]
    } else if (chip_device_platform == "efr32") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_EFR32=1",
        "CHIP_DEVICE_LAYER_TARGET=EFR32",
      ]
    } else if (chip_device_platform == "esp32") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_ESP32=1",
        "CHIP_DEVICE_LAYER_TARGET=ESP32",
      ]
    } else if (chip_device_platform == "p6") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_P6=1",
        "CHIP_DEVICE_LAYER_TARGET=P6",
      ]
    } else if (chip_device_platform == "linux") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_LINUX=1",
        "CHIP_DEVICE_LAYER_TARGET=Linux",
        "CHIP_DEVICE_CONFIG_ENABLE_WIFI=${chip_enable_wifi}",
      ]
    } else if (chip_device_platform == "tizen") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_TIZEN=1",
        "CHIP_DEVICE_LAYER_TARGET=Tizen",
        "CHIP_DEVICE_CONFIG_ENABLE_WIFI=${chip_enable_wifi}",
      ]
      defines -=
          [ "CHIP_DEVICE_CONFIG_ENABLE_WPA=${chip_device_config_enable_wpa}" ]
    } else if (chip_device_platform == "nrfconnect") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_NRFCONNECT=1",
        "CHIP_DEVICE_LAYER_TARGET=nrfconnect",
      ]
    } else if (chip_device_platform == "qpg") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_QPG=1",
        "CHIP_DEVICE_LAYER_TARGET=qpg",
      ]
    } else if (chip_device_platform == "k32w0") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_K32W=1",
        "CHIP_DEVICE_LAYER_TARGET=nxp/k32w/k32w0",
      ]
    } else if (chip_device_platform == "telink") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_TELINK=1",
        "CHIP_DEVICE_LAYER_TARGET=telink",
      ]
    } else if (chip_device_platform == "mbed") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_MBED=1",
        "CHIP_DEVICE_LAYER_TARGET=mbed",
      ]
    } else if (chip_device_platform == "fake") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_FAKE=1",
        "CHIP_DEVICE_LAYER_TARGET=fake",
      ]
    } else if (chip_device_platform == "android") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_ANDROID=1",
        "CHIP_DEVICE_LAYER_TARGET=android",
      ]
    } else if (chip_device_platform == "ameba") {
      defines += [
        "CHIP_DEVICE_LAYER_TARGET_AMEBA=1",
        "CHIP_DEVICE_LAYER_TARGET=Ameba",
        "CHIP_DEVICE_CONFIG_ENABLE_WIFI=${chip_enable_wifi}",
      ]
    }
  }
} else {
  buildconfig_header("platform_buildconfig") {
    header = "CHIPDeviceBuildConfig.h"
    header_dir = "platform"

    defines = [
      "CHIP_DEVICE_LAYER_NONE=1",
      "CHIP_DEVICE_LAYER_TARGET=NONE",
    ]

    if (current_os == "android") {
      chip_device_config_enable_dnssd = chip_mdns != "none"
      defines += [
        "CHIP_DEVICE_CONFIG_ENABLE_DNSSD=${chip_device_config_enable_dnssd}",
        "EXTERNAL_KEYVALUESTOREMANAGERIMPL_HEADER=\"controller/java/AndroidKeyValueStoreManagerImpl.h\"",
      ]
    }
  }
}

if (chip_device_platform != "none") {
  group("platform_base") {
    public_deps = [
      ":platform_buildconfig",
      "${chip_root}/src/ble",
      "${chip_root}/src/inet",
      "${chip_root}/src/lib/core",
      "${chip_root}/src/lib/support",
      "${chip_root}/src/system",
    ]

    public_configs = [ "${chip_root}/src:includes" ]
  }

  static_library("platform") {
    output_name = "libDeviceLayer"

    sources = [
      "../include/platform/CHIPDeviceConfig.h",
      "../include/platform/CHIPDeviceError.h",
      "../include/platform/CHIPDeviceEvent.h",
      "../include/platform/CHIPDeviceLayer.h",
      "../include/platform/ConfigurationManager.h",
      "../include/platform/ConnectivityManager.h",
      "../include/platform/DeviceControlServer.h",
      "../include/platform/GeneralUtils.h",
      "../include/platform/KeyValueStoreManager.h",
      "../include/platform/PersistedStorage.h",
      "../include/platform/PlatformManager.h",
      "../include/platform/ThreadStackManager.h",
      "../include/platform/internal/BLEManager.h",
      "../include/platform/internal/CHIPDeviceLayerInternal.h",
      "../include/platform/internal/DeviceNetworkInfo.h",
      "../include/platform/internal/DeviceNetworkProvisioning.h",
      "../include/platform/internal/EventLogging.h",
      "../include/platform/internal/GenericConfigurationManagerImpl.h",
      "../include/platform/internal/GenericConnectivityManagerImpl.h",
      "../include/platform/internal/GenericConnectivityManagerImpl_BLE.h",
      "../include/platform/internal/GenericConnectivityManagerImpl_NoBLE.h",
      "../include/platform/internal/GenericConnectivityManagerImpl_NoThread.h",
      "../include/platform/internal/GenericConnectivityManagerImpl_NoWiFi.h",
      "../include/platform/internal/GenericConnectivityManagerImpl_Thread.h",
      "../include/platform/internal/GenericConnectivityManagerImpl_WiFi.h",
      "../include/platform/internal/GenericPlatformManagerImpl.h",
      "../include/platform/internal/GenericPlatformManagerImpl_FreeRTOS.h",
      "../include/platform/internal/GenericPlatformManagerImpl_POSIX.h",
      "../include/platform/internal/testing/ConfigUnitTest.h",
      "DeviceControlServer.cpp",
      "DiagnosticDataProvider.cpp",
      "Entropy.cpp",
      "GeneralUtils.cpp",
      "Globals.cpp",
      "LockTracker.cpp",
      "PersistedStorage.cpp",
      "PlatformEventSupport.cpp",
    ]

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

    cflags = [ "-Wconversion" ]

    public_deps = [
      ":platform_base",
      "${chip_root}/src/app:app_buildconfig",
      "${chip_root}/src/app/common:cluster-objects",
      "${chip_root}/src/crypto",
      "${chip_root}/src/lib/support",
    ]

    if (chip_device_platform == "cc13x2_26x2") {
      _platform_target = "cc13x2_26x2"
    } else if (chip_device_platform == "darwin") {
      _platform_target = "Darwin"
    } else if (chip_device_platform == "efr32") {
      _platform_target = "EFR32"
    } else if (chip_device_platform == "esp32") {
      _platform_target = "ESP32"
    } else if (chip_device_platform == "k32w0") {
      _platform_target = "nxp/k32w/k32w0"
    } else if (chip_device_platform == "linux") {
      _platform_target = "Linux"
    } else if (chip_device_platform == "nrfconnect") {
      _platform_target = "nrfconnect"
    } else if (chip_device_platform == "qpg") {
      _platform_target = "qpg"
    } else if (chip_device_platform == "telink") {
      _platform_target = "telink"
    } else if (chip_device_platform == "mbed") {
      _platform_target = "mbed"
    } else if (chip_device_platform == "tizen") {
      _platform_target = "Tizen"
    } else if (chip_device_platform == "android") {
      _platform_target = "android"
    } else if (chip_device_platform == "external") {
      _platform_target = chip_platform_target
    } else if (chip_device_platform == "p6") {
      _platform_target = "P6"
    } else if (chip_device_platform == "ameba") {
      _platform_target = "Ameba"
    } else if (chip_device_platform == "fake") {
      _platform_target = "fake"
    } else {
      assert(false, "Unknown chip_device_platform: ${chip_device_platform}")
    }

    public_deps += [ _platform_target ]

    # The platform target needs to include the headers, so allow that here.
    # It should be considered logically part of this target.
    allow_circular_includes_from = [
      _platform_target,
      "${chip_root}/src/lib/support",
    ]
  }
} else {
  group("platform") {
    public_deps = [ ":platform_buildconfig" ]
  }
}
