# 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("args.gni")

import("${chip_root}/build/chip/tools.gni")

assert(chip_build_tools)

declare_args() {
  # Enable Wake on LAN cluster
  chip_enable_wake_on_lan = false
}

config("config") {
  include_dirs = [
    ".",
    "${chip_root}/zzz_generated/chip-tv-app",
    "${chip_root}/src/lib",
  ]

  defines = [ "CHIP_ENABLE_WAKE_ON_LAN=${chip_enable_wake_on_lan}" ]

  cflags = [ "-Wconversion" ]
}

executable("chip-tv-app") {
  sources = [
    "${chip_root}/examples/tv-app/tv-common/include/CHIPProjectAppConfig.h",
    "AppImpl.cpp",
    "AppImpl.h",
    "AppPlatformShellCommands.cpp",
    "ZclCallbacks.cpp",
    "include/account-login/AccountLoginManager.cpp",
    "include/account-login/AccountLoginManager.h",
    "include/application-basic/ApplicationBasicManager.cpp",
    "include/application-basic/ApplicationBasicManager.h",
    "include/application-launcher/ApplicationLauncherManager.cpp",
    "include/application-launcher/ApplicationLauncherManager.h",
    "include/audio-output/AudioOutputManager.cpp",
    "include/audio-output/AudioOutputManager.h",
    "include/channel/ChannelManager.cpp",
    "include/channel/ChannelManager.h",
    "include/cluster-change-attribute.cpp",
    "include/cluster-init.cpp",
    "include/content-launcher/ContentLauncherManager.cpp",
    "include/content-launcher/ContentLauncherManager.h",
    "include/endpoint-configuration/EndpointConfigurationStorage.cpp",
    "include/endpoint-configuration/EndpointConfigurationStorage.h",
    "include/keypad-input/KeypadInputManager.cpp",
    "include/keypad-input/KeypadInputManager.h",
    "include/low-power/LowPowerManager.cpp",
    "include/low-power/LowPowerManager.h",
    "include/media-input/MediaInputManager.cpp",
    "include/media-input/MediaInputManager.h",
    "include/media-playback/MediaPlaybackManager.cpp",
    "include/media-playback/MediaPlaybackManager.h",
    "include/target-navigator/TargetNavigatorManager.cpp",
    "include/target-navigator/TargetNavigatorManager.h",
    "include/wake-on-lan/WakeOnLanManager.cpp",
    "include/wake-on-lan/WakeOnLanManager.h",
    "main.cpp",
  ]

  deps = [
    "${chip_root}/examples/platform/linux:app-main",
    "${chip_root}/examples/tv-app/tv-common",
    "${chip_root}/src/lib",
    "${chip_root}/third_party/inipp",
  ]

  cflags = [ "-Wconversion" ]

  public_configs = [ ":config" ]

  if (chip_build_libshell) {
    cflags += [ "-DENABLE_CHIP_SHELL" ]
  }

  output_dir = root_out_dir
}

group("linux") {
  deps = [ ":chip-tv-app" ]
}
