// 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 "components/omnibox/browser/page_classification_functions.h"

#include "base/check.h"
#include "components/omnibox/common/omnibox_feature_configs.h"
#include "page_classification_functions.h"

namespace omnibox {

using OEP = ::metrics::OmniboxEventProto;

bool IsNTPPage(OEP::PageClassification classification) {
  CheckObsoletePageClass(classification);

  return (classification == OEP::NTP) ||
         (classification == OEP::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS) ||
         (classification == OEP::NTP_REALBOX) ||
         (classification == OEP::NTP_ZPS_PREFETCH);
}

bool IsSearchResultsPage(OEP::PageClassification classification) {
  return (classification ==
          OEP::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT) ||
         (classification ==
          OEP::SEARCH_RESULT_PAGE_DOING_SEARCH_TERM_REPLACEMENT) ||
         (classification == OEP::SEARCH_RESULT_PAGE_ON_CCT) ||
         (classification == OEP::SRP_ZPS_PREFETCH);
}

bool IsOtherWebPage(OEP::PageClassification classification) {
  return (classification == OEP::OTHER) ||
         (classification == OEP::OTHER_ON_CCT) ||
         (classification == OEP::ANDROID_SHORTCUTS_WIDGET) ||
         (classification == OEP::OTHER_ZPS_PREFETCH);
}

bool IsLensContextualSearchbox(OEP::PageClassification classification) {
  return classification == OEP::CONTEXTUAL_SEARCHBOX;
}

bool IsLensSearchbox(OEP::PageClassification classification) {
  return IsLensContextualSearchbox(classification) ||
         (classification == OEP::SEARCH_SIDE_PANEL_SEARCHBOX) ||
         (classification == OEP::LENS_SIDE_PANEL_SEARCHBOX);
}

bool IsCustomTab(OEP::PageClassification classification) {
  return classification == OEP::SEARCH_RESULT_PAGE_ON_CCT ||
         classification == OEP::OTHER_ON_CCT;
}

bool IsAndroidHub(OEP::PageClassification classification) {
  return classification == OEP::ANDROID_HUB;
}

bool IsWebUISearchbox(OEP::PageClassification classification) {
  return classification == OEP::NTP_REALBOX ||
         IsLensSearchbox(classification) || IsComposebox(classification);
}

void CheckObsoletePageClass(OEP::PageClassification classification) {
  CHECK(classification != OEP::OBSOLETE_INSTANT_NTP &&
        classification !=
            OEP::OBSOLETE_INSTANT_NTP_WITH_FAKEBOX_AS_STARTING_FOCUS)
      << "b/357961079: invalid/unexpected page context. Please report.";
}

bool SupportsMostVisitedSites(OEP::PageClassification classification) {
  if (omnibox_feature_configs::OmniboxUrlSuggestionsOnFocus::Get().enabled) {
    return classification == OEP::OTHER_ON_CCT ||
           classification == OEP::OTHER ||
           classification == OEP::OTHER_ZPS_PREFETCH ||
           IsSearchResultsPage(classification);
  }

  return classification == OEP::OTHER ||
         classification == OEP::ANDROID_SEARCH_WIDGET ||
         classification == OEP::ANDROID_SHORTCUTS_WIDGET;
}

bool IsComposebox(OEP::PageClassification classification) {
  return classification == OEP::NTP_COMPOSEBOX;
}

}  // namespace omnibox
