
// Copyright (c) 2016 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 "components/update_client/updater_state.h"

#include <utility>

#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
#include "base/enterprise_util.h"
#endif  // OS_WIN or Mac
#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"

namespace update_client {

// The value of this constant does not reflect its name (i.e. "domainjoined"
// vs something like "isenterprisemanaged") because it is used with omaha.
// After discussion with omaha team it was decided to leave the value as is to
// keep continuity with previous chrome versions.
const char UpdaterState::kIsEnterpriseManaged[] = "domainjoined";

UpdaterState::UpdaterState(bool is_machine) : is_machine_(is_machine) {}

UpdaterState::~UpdaterState() {}

std::unique_ptr<UpdaterState::Attributes> UpdaterState::GetState(
    bool is_machine) {
#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
  UpdaterState updater_state(is_machine);
  updater_state.ReadState();
  return std::make_unique<Attributes>(updater_state.BuildAttributes());
#else
  return nullptr;
#endif  // OS_WIN or Mac
}

#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
void UpdaterState::ReadState() {
  is_enterprise_managed_ = base::IsMachineExternallyManaged();

#if defined(GOOGLE_CHROME_BUILD)
  updater_name_ = GetUpdaterName();
  updater_version_ = GetUpdaterVersion(is_machine_);
  last_autoupdate_started_ = GetUpdaterLastStartedAU(is_machine_);
  last_checked_ = GetUpdaterLastChecked(is_machine_);
  is_autoupdate_check_enabled_ = IsAutoupdateCheckEnabled();
  update_policy_ = GetUpdatePolicy();
#endif  // GOOGLE_CHROME_BUILD
}
#endif  // OS_WIN or Mac

UpdaterState::Attributes UpdaterState::BuildAttributes() const {
  Attributes attributes;

#if defined(OS_WIN)
  // Only Windows implements this attribute in a meaningful way.
  attributes["ismachine"] = is_machine_ ? "1" : "0";
#endif  // OS_WIN
  attributes[kIsEnterpriseManaged] = is_enterprise_managed_ ? "1" : "0";

  attributes["name"] = updater_name_;

  if (updater_version_.IsValid())
    attributes["version"] = updater_version_.GetString();

  const base::Time now = base::Time::NowFromSystemTime();
  if (!last_autoupdate_started_.is_null())
    attributes["laststarted"] =
        NormalizeTimeDelta(now - last_autoupdate_started_);
  if (!last_checked_.is_null())
    attributes["lastchecked"] = NormalizeTimeDelta(now - last_checked_);

  attributes["autoupdatecheckenabled"] =
      is_autoupdate_check_enabled_ ? "1" : "0";

  DCHECK((update_policy_ >= 0 && update_policy_ <= 3) || update_policy_ == -1);
  attributes["updatepolicy"] = base::NumberToString(update_policy_);

  return attributes;
}

std::string UpdaterState::NormalizeTimeDelta(const base::TimeDelta& delta) {
  const base::TimeDelta two_weeks = base::TimeDelta::FromDays(14);
  const base::TimeDelta two_months = base::TimeDelta::FromDays(60);

  std::string val;  // Contains the value to return in hours.
  if (delta <= two_weeks) {
    val = "0";
  } else if (two_weeks < delta && delta <= two_months) {
    val = "408";  // 2 weeks in hours.
  } else {
    val = "1344";  // 2*28 days in hours.
  }

  DCHECK(!val.empty());
  return val;
}

}  // namespace update_client
