// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/browser/scheduler/browser_task_priority.h"

#include "base/notreached.h"
#include "base/task/sequence_manager/sequence_manager.h"
#include "base/tracing/protos/chrome_track_event.pbzero.h"
#include "components/performance_manager/scenario_api/performance_scenarios.h"
#include "content/public/common/content_features.h"

namespace content::internal {

namespace {

using ProtoPriority = perfetto::protos::pbzero::SequenceManagerTask::Priority;

ProtoPriority ToProtoPriority(BrowserTaskPriority priority) {
  switch (priority) {
    case BrowserTaskPriority::kControlPriority:
      return ProtoPriority::CONTROL_PRIORITY;
    case BrowserTaskPriority::kHighestPriority:
      return ProtoPriority::HIGHEST_PRIORITY;
    case BrowserTaskPriority::kHighPriority:
      return ProtoPriority::HIGH_PRIORITY;
    case BrowserTaskPriority::kNormalPriority:
      return ProtoPriority::NORMAL_PRIORITY;
    case BrowserTaskPriority::kLowPriority:
      return ProtoPriority::LOW_PRIORITY;
    case BrowserTaskPriority::kBestEffortPriority:
      return ProtoPriority::BEST_EFFORT_PRIORITY;
    case BrowserTaskPriority::kPriorityCount:
      NOTREACHED();
  }
}

ProtoPriority TaskPriorityToProto(
    base::sequence_manager::TaskQueue::QueuePriority priority) {
  DCHECK_LT(static_cast<size_t>(priority),
            static_cast<size_t>(BrowserTaskPriority::kPriorityCount));
  return ToProtoPriority(static_cast<BrowserTaskPriority>(priority));
}

}  // namespace

base::sequence_manager::SequenceManager::PrioritySettings
CreateBrowserTaskPrioritySettings() {
  using base::sequence_manager::TaskQueue;
  base::sequence_manager::SequenceManager::PrioritySettings settings(
      BrowserTaskPriority::kPriorityCount,
      BrowserTaskPriority::kDefaultPriority);
  settings.SetProtoPriorityConverter(&TaskPriorityToProto);
  return settings;
}

bool ShouldBoostThreadsPriority() {
  DCHECK(base::FeatureList::IsEnabled(
      features::kBoostThreadsPriorityDuringInputScenario));
  performance_scenarios::ScenarioPattern no_input{
      .input = {performance_scenarios::InputScenario::kNoInput},
  };

  return !performance_scenarios::CurrentScenariosMatch(
      performance_scenarios::ScenarioScope::kGlobal, no_input);
}

}  // namespace content::internal
