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

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

declare_args() {
  # Enable server command only on linux for now.
  chip_shell_cmd_server = current_os == "linux" || current_os == "mac"
}

config("shell_common_config") {
  include_dirs = [
    ".",
    "include",
    "${chip_root}/src/lib/shell",
  ]

  defines = [
    "ENABLE_CHIP_SHELL",
    "OPENTHREAD_CONFIG_CLI_TRANSPORT=OT_CLI_TRANSPORT_CONSOLE",
    "CHIP_SHELL_ENABLE_CMD_SERVER=${chip_shell_cmd_server}",
  ]
}

static_library("shell_common") {
  sources = [
    "cmd_misc.cpp",
    "cmd_otcli.cpp",
    "globals.cpp",
  ]

  public_deps = [
    "${chip_root}/src/lib/shell",
    "${chip_root}/src/lib/support",
    "${chip_root}/src/platform",
    "${chip_root}/src/protocols",
  ]

  if (chip_enable_openthread &&
      (current_os == "freertos" || current_os == "zephyr")) {
    if (chip_openthread_ftd) {
      public_deps += [
        "${chip_root}/third_party/openthread/repo:libopenthread-cli-ftd",
        "${chip_root}/third_party/openthread/repo:libopenthread-ftd",
      ]
    } else {
      public_deps += [
        "${chip_root}/third_party/openthread/repo:libopenthread-cli-mtd",
        "${chip_root}/third_party/openthread/repo:libopenthread-mtd",
      ]
    }
  }

  if (chip_shell_cmd_server) {
    sources += [ "cmd_server.cpp" ]

    import("${chip_root}/src/app/chip_data_model.gni")

    sources += [
      "${chip_root}/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp",
      "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp",
    ]

    include_dirs =
        [ "${chip_root}/examples/all-clusters-app/all-clusters-common/include" ]

    public_deps +=
        [ "${chip_root}/examples/all-clusters-app/all-clusters-common" ]
  }

  public_configs = [ ":shell_common_config" ]
}
