// 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.

#include "chromecast/base/cast_sys_info_android.h"

#include <sys/system_properties.h>
#include <memory>
#include <string>

#include "base/android/apk_assets.h"
#include "base/android/build_info.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/strings/string_number_conversions.h"
#include "base/system/sys_info.h"
#include "chromecast/base/cast_sys_info_util.h"
#include "chromecast/base/version.h"
#include "chromecast/chromecast_buildflags.h"
#include "jni/CastSysInfoAndroid_jni.h"

namespace chromecast {

namespace {
const char kCastConfigAssetPath[] = "assets/cast_config";

std::string GetAndroidProperty(const std::string& key,
                               const std::string& default_value) {
  char value[PROP_VALUE_MAX];
  int ret = __system_property_get(key.c_str(), value);
  if (ret <= 0) {
    VLOG(1) << "No value set for property: " << key;
    return default_value;
  }

  return std::string(value);
}

bool DoesCastConfigFileExist() {
  base::MemoryMappedFile::Region config_region;
  int config_fd =
      base::android::OpenApkAsset(kCastConfigAssetPath, &config_region);
  if (config_fd > 0)
    close(config_fd);
  return config_fd > 0;
}
}  // namespace

CastSysInfoAndroid::CastSysInfoAndroid()
    : build_info_(base::android::BuildInfo::GetInstance()) {}

CastSysInfoAndroid::~CastSysInfoAndroid() {}

CastSysInfo::BuildType CastSysInfoAndroid::GetBuildType() {
  // TODO(b/110375912): Update this to parse the file contents and allow
  // selection based on the config values.  For now this is just checking for
  // file existence.
  if (!DoesCastConfigFileExist())
    return BUILD_PRODUCTION;

  if (CAST_IS_DEBUG_BUILD())
    return BUILD_ENG;

  // Default to BETA build.
  return BUILD_BETA;
}

std::string CastSysInfoAndroid::GetSerialNumber() {
  JNIEnv* env = base::android::AttachCurrentThread();
  return base::android::ConvertJavaStringToUTF8(
      Java_CastSysInfoAndroid_getSerialNumber(env));
}

std::string CastSysInfoAndroid::GetProductName() {
  return build_info_->device();
}

std::string CastSysInfoAndroid::GetDeviceModel() {
  return build_info_->model();
}

std::string CastSysInfoAndroid::GetManufacturer() {
  return build_info_->manufacturer();
}

std::string CastSysInfoAndroid::GetSystemBuildNumber() {
  return base::SysInfo::GetAndroidBuildID();
}

std::string CastSysInfoAndroid::GetSystemReleaseChannel() {
  return "";
}

std::string CastSysInfoAndroid::GetBoardName() {
  JNIEnv* env = base::android::AttachCurrentThread();
  return base::android::ConvertJavaStringToUTF8(
      Java_CastSysInfoAndroid_getBoard(env));
}

std::string CastSysInfoAndroid::GetBoardRevision() {
  return "";
}

std::string CastSysInfoAndroid::GetFactoryCountry() {
  return GetAndroidProperty("ro.boot.wificountrycode", "");
}

std::string CastSysInfoAndroid::GetFactoryLocale(std::string* second_locale) {
  // This duplicates the read-only property portion of
  // frameworks/base/core/jni/AndroidRuntime.cpp in the Android tree, which is
  // effectively the "factory locale", i.e. the locale chosen by Android
  // assuming the other persist.sys.* properties are not set.
  const std::string locale = GetAndroidProperty("ro.product.locale", "");
  if (!locale.empty()) {
    return locale;
  }

  const std::string language =
      GetAndroidProperty("ro.product.locale.language", "en");
  const std::string region =
      GetAndroidProperty("ro.product.locale.region", "US");
  return language + "-" + region;
}

std::string CastSysInfoAndroid::GetWifiInterface() {
  return "";
}

std::string CastSysInfoAndroid::GetApInterface() {
  return "";
}

}  // namespace chromecast
