// Copyright 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 "chrome/browser/ash/arc/process/arc_process.h"

#include <utility>

#include "base/no_destructor.h"
#include "base/strings/string_util.h"
#include "components/arc/mojom/process.mojom.h"

namespace arc {

using mojom::ProcessState;

namespace {

constexpr char kCloudDpcrocessName[] =
    "com.google.android.apps.work.clouddpc.arc";

bool IsImportantState(ProcessState state) {
  switch (state) {
    case ProcessState::IMPORTANT_FOREGROUND:
    case ProcessState::BOUND_FOREGROUND_SERVICE:
    case ProcessState::FOREGROUND_SERVICE:
    case ProcessState::TOP:
    case ProcessState::PERSISTENT_UI:
    case ProcessState::PERSISTENT:
      return true;
    default:
      return false;
  }
}

bool IsPersistentState(ProcessState state) {
  switch (state) {
    case ProcessState::PERSISTENT_UI:
    case ProcessState::PERSISTENT:
      return true;
    default:
      return false;
  }
}

bool IsProtectedBackgroundState(ProcessState state) {
  switch (state) {
    case ProcessState::TOP:
    case ProcessState::FOREGROUND_SERVICE:
    case ProcessState::BOUND_FOREGROUND_SERVICE:
    case ProcessState::IMPORTANT_FOREGROUND:
    case ProcessState::IMPORTANT_BACKGROUND:
      return true;
    default:
      return false;
  }
}

bool IsBackgroundState(ProcessState state) {
  switch (state) {
    case ProcessState::TRANSIENT_BACKGROUND:
    case ProcessState::BACKUP:
    case ProcessState::SERVICE:
    case ProcessState::RECEIVER:
    case ProcessState::TOP_SLEEPING:
    case ProcessState::HEAVY_WEIGHT:
    case ProcessState::HOME:
    case ProcessState::LAST_ACTIVITY:
    case ProcessState::CACHED_ACTIVITY:
      return true;
    default:
      return false;
  }
}

bool IsCachedState(ProcessState state) {
  switch (state) {
    case ProcessState::CACHED_ACTIVITY_CLIENT:
    case ProcessState::CACHED_RECENT:
    case ProcessState::CACHED_EMPTY:
    case ProcessState::NONEXISTENT:
      return true;
    default:
      return false;
  }
}

}  // namespace

ArcProcess::ArcProcess(base::ProcessId nspid,
                       base::ProcessId pid,
                       const std::string& process_name,
                       mojom::ProcessState process_state,
                       bool is_focused,
                       int64_t last_activity_time)
    : nspid_(nspid),
      pid_(pid),
      process_name_(process_name),
      process_state_(process_state),
      is_focused_(is_focused),
      last_activity_time_(last_activity_time) {}

ArcProcess::~ArcProcess() = default;

// Sort by (process_state, last_activity_time) pair.
// Smaller process_state value means higher priority as defined in Android.
// Larger last_activity_time means more recently used.
bool ArcProcess::operator<(const ArcProcess& rhs) const {
  return std::make_pair(process_state(), -last_activity_time()) <
         std::make_pair(rhs.process_state(), -rhs.last_activity_time());
}

ArcProcess::ArcProcess(ArcProcess&& other) = default;
ArcProcess& ArcProcess::operator=(ArcProcess&& other) = default;

bool ArcProcess::IsImportant() const {
  return IsImportantState(process_state()) || IsArcProtected();
}

bool ArcProcess::IsPersistent() const {
  // Protect PERSISTENT, PERSISTENT_UI, our HOME and custom set of ARC processes
  // since they should have lower priority to be killed.
  return IsPersistentState(process_state()) || IsArcProtected();
}

bool ArcProcess::IsCached() const {
  return IsCachedState(process_state());
}

bool ArcProcess::IsBackgroundProtected() const {
  return IsProtectedBackgroundState(process_state());
}

bool ArcProcess::IsArcProtected() const {
  return process_name() == kCloudDpcrocessName;
}

std::ostream& operator<<(std::ostream& out, const ArcProcess& arc_process) {
  out << "process_name: " << arc_process.process_name()
      << ", pid: " << arc_process.pid()
      << ", process_state: " << arc_process.process_state()
      << ", is_focused: " << arc_process.is_focused()
      << ", last_activity_time: " << arc_process.last_activity_time()
      << ", packages: " << base::JoinString(arc_process.packages(), ",");
  return out;
}

}  // namespace arc
