# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//chrome/version.gni")  # TODO layering violation!
import("//chromecast/chromecast.gni")
import("//testing/test.gni")

if (is_android) {
  import("//build/config/android/rules.gni")
}

declare_args() {
  # Denotes the type of Cast product. This is #defined as CAST_PRODUCT_TYPE in
  # version.h. This is an integer in the range [0-4].
  cast_product_type = 0

  # If true, IS_CAST_DEBUG_BUILD() will evaluate to 1 in version.h. Otherwise,
  # it will evaluate to 0. Overriding this when is_debug=false is useful for
  # doing engineering builds.
  cast_is_debug = is_debug
}

assert(cast_product_type >= 0 && cast_product_type <= 4)

# GYP target: chromecast.gyp:cast_base
source_set("base") {
  sources = [
    "android/dumpstate_writer.cc",
    "android/dumpstate_writer.h",
    "android/system_time_change_notifier_android.cc",
    "android/system_time_change_notifier_android.h",
    "bind_to_task_runner.h",
    "cast_constants.cc",
    "cast_constants.h",
    "cast_paths.cc",
    "cast_paths.h",
    "cast_resource.cc",
    "cast_resource.h",
    "chromecast_config_android.cc",
    "chromecast_config_android.h",
    "chromecast_switches.cc",
    "chromecast_switches.h",
    "device_capabilities.h",
    "device_capabilities_impl.cc",
    "device_capabilities_impl.h",
    "error_codes.cc",
    "error_codes.h",
    "init_command_line_shlib.cc",
    "init_command_line_shlib.h",
    "path_utils.cc",
    "path_utils.h",
    "pref_names.cc",
    "pref_names.h",
    "process_utils.cc",
    "process_utils.h",
    "serializers.cc",
    "serializers.h",
    "system_time_change_notifier.cc",
    "system_time_change_notifier.h",
    "task_runner_impl.cc",
    "task_runner_impl.h",
  ]

  public_deps = [
    "//chromecast/base/metrics",
    "//chromecast/public",
  ]

  deps = [
    "//base",
  ]

  if (is_android) {
    deps += [ ":jni_headers" ]
  }
}

# GYP target: n/a
source_set("test_support") {
  sources = [
    "scoped_temp_file.cc",
    "scoped_temp_file.h",
  ]

  public_deps = [
    ":base",
    "//base",
  ]
}

# GYP target: chromecast_tests.gypi:cast_base_unittests
test("cast_base_unittests") {
  sources = [
    "bind_to_task_runner_unittest.cc",
    "chromecast_switches_unittest.cc",
    "device_capabilities_impl_unittest.cc",
    "error_codes_unittest.cc",
    "path_utils_unittest.cc",
    "process_utils_unittest.cc",
    "serializers_unittest.cc",
    "system_time_change_notifier_unittest.cc",
  ]

  deps = [
    ":test_support",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

source_set("cast_sys_info") {
  sources = [
    "cast_sys_info_android.cc",
    "cast_sys_info_android.h",
    "cast_sys_info_dummy.cc",
    "cast_sys_info_dummy.h",
    "cast_sys_info_util.h",
  ]

  deps = [
    "//base",
    "//chromecast/public",
  ]

  if (is_android) {
    deps += [
      ":cast_version",
      "//chromecast/browser:jni_headers",
    ]
  } else if (chromecast_branding == "public") {
    sources += [ "cast_sys_info_util_simple.cc" ]
  }
}

# Target for OEM partners to override sys_info shared library, i.e.
# libcast_sys_info_1.0.so.
shared_library("libcast_sys_info_1.0") {
  sources = [
    "cast_sys_info_dummy.cc",
    "cast_sys_info_dummy.h",
    "cast_sys_info_shlib.cc",
  ]

  deps = [
    "//chromecast/public",
  ]
}

# Note: Android links //chromecast/base:cast_sys_info statically.
source_set("cast_sys_info_shlib") {
  if (!is_android) {
    sources = [
      "cast_sys_info_util_shlib.cc",
    ]

    deps = [
      ":cast_sys_info",
      ":libcast_sys_info_1.0",
      "//base",
      "//chromecast/public",
    ]
  }
}

process_version("cast_version") {
  template_file = "version.h.in"
  output = "$target_gen_dir/version.h"

  extra_args = [
    "-e",
    "VERSION_FULL=\"%s.%s.%s.%s\"%(MAJOR,MINOR,BUILD,PATCH)",
    "-e",
    "CAST_BUILD_RELEASE=\"$cast_build_release\"",
    "-e",
    "CAST_BUILD_INCREMENTAL=\"$cast_build_incremental\"",
    "-e",
    "CAST_PRODUCT_TYPE=$cast_product_type",
  ]

  if (cast_is_debug) {
    extra_args += [
      "-e",
      "CAST_IS_DEBUG_BUILD=1",
    ]
  } else {
    extra_args += [
      "-e",
      "CAST_IS_DEBUG_BUILD=0",
    ]
  }
}

if (is_android) {
  # GYP target: chromecast.gyp:jni_headers
  generate_jni("jni_headers") {
    sources = [
      "java/src/org/chromium/chromecast/base/ChromecastConfigAndroid.java",
      "java/src/org/chromium/chromecast/base/DumpstateWriter.java",
      "java/src/org/chromium/chromecast/base/SystemTimeChangeNotifierAndroid.java",
    ]

    jni_package = "chromecast"
  }

  # GYP target: chromecast.gyp:cast_base_java
  android_library("base_java") {
    java_src_dir = "//chromecast/base/java/src"
    java_files = [
      "$java_src_dir/org/chromium/chromecast/base/CastSettingsManager.java",
      "$java_src_dir/org/chromium/chromecast/base/ChromecastConfigAndroid.java",
      "$java_src_dir/org/chromium/chromecast/base/DumpstateWriter.java",
      "$java_src_dir/org/chromium/chromecast/base/SystemTimeChangeNotifierAndroid.java",
    ]

    deps = [
      "//base:base_java",
    ]
  }
}
