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

#ifndef COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_GROUPER_SECTIONS_H_
#define COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_GROUPER_SECTIONS_H_

#include <memory>
#include <vector>

#include "components/omnibox/browser/autocomplete_grouper_groups.h"
#include "components/omnibox/browser/autocomplete_match.h"
#include "components/omnibox/browser/suggestion_group_util.h"
#include "components/omnibox/common/omnibox_feature_configs.h"

class Section;
using Groups = std::vector<Group>;
using PSections = std::vector<std::unique_ptr<Section>>;

// `Section` class and subclasses used to implement the various autocomplete
// grouping algorithms.

// Section containing no `Groups` and, therefore, no matches.
class Section {
 public:
  explicit Section(size_t limit,
                   Groups groups,
                   omnibox::GroupConfigMap& group_configs,
                   omnibox::GroupConfig_SideType side_type =
                       omnibox::GroupConfig_SideType_DEFAULT_PRIMARY);
  virtual ~Section();
  // Returns `matches` ranked and culled according to `sections`. All `matches`
  // should have `suggestion_group_id` set and be sorted by relevance.
  static ACMatches GroupMatches(PSections sections, ACMatches& matches);
  // Used to adjust this `Section`'s and its `Group`s' total limits.
  virtual void InitFromMatches(ACMatches& matches) {}

 protected:
  // Returns the first `Group` in this `Section` `match` can be added to or
  // `groups_.end()` if none can be found. Does not take the total limit into
  // account.
  Groups::iterator FindGroup(const AutocompleteMatch& match);
  // Returns whether `match` was added to a `Group` in this `Section`. Does not
  // add a match beyond the total limit.
  bool Add(const AutocompleteMatch& match);

  // Max number of matches this `Section` can contain across `groups_`.
  size_t limit_{0};
  // The number of matches this `Section` contains across `groups_`.
  size_t count_{0};
  // The `Group`s this `Section` contains.
  Groups groups_{};
  // This `Section`s map of group IDs to group information.
  omnibox::GroupConfigMap group_configs_;
  // This `Section`s side type.
  omnibox::GroupConfig_SideType side_type_;
};

// Base section for ZPS limits and grouping. Asserts that matches are sorted by
// their `Group`s position.
class ZpsSection : public Section {
 public:
  ZpsSection(size_t limit,
             Groups groups,
             omnibox::GroupConfigMap& group_configs,
             omnibox::GroupConfig_SideType side_type =
                 omnibox::GroupConfig_SideType_DEFAULT_PRIMARY);
  // Section:
  void InitFromMatches(ACMatches& matches) override;
};

// Base section for ZPS limits and grouping where local history zero-prefix
// suggestions are enabled. Sorts the matches by their `Group`s position to
// ensure zero-prefix suggestions from local history backfill remote
// personalized zero-prefix suggestions.
// TODO(crbug.com/409810808): Find a more general solution for accommodating
// local history backfill and remove this class.
class ZpsSectionWithLocalHistory : public ZpsSection {
 protected:
  explicit ZpsSectionWithLocalHistory(size_t limit,
                                      Groups groups,
                                      omnibox::GroupConfigMap& group_configs);
  // Section:
  void InitFromMatches(ACMatches& matches) override;
};

// A ZpsSection that automatically counts all MV Tiles as one suggestion when
// applying the total limit.
class ZpsSectionWithMVTiles : public ZpsSection {
 public:
  explicit ZpsSectionWithMVTiles(size_t limit,
                                 Groups groups,
                                 omnibox::GroupConfigMap& group_configs);
  // Section:
  void InitFromMatches(ACMatches& matches) override;
};

// Android prefixed section for Adaptive Suggestions grouping.
class AndroidNonZPSSection : public Section {
 public:
  // Construct a new instance of the grouping class used in non-zero-prefix
  // context.
  // When `show_only_search_suggestions` is set to `true`, URLs will not be
  // offered at any position other than position 0 (the Default Match).
  explicit AndroidNonZPSSection(bool show_only_search_suggestions,
                                omnibox::GroupConfigMap& group_configs);

  // Section:
  void InitFromMatches(ACMatches& matches) override;

  // Specify number of matches that are at least 50% exposed while the
  // software keyboard is visible.
  static void set_num_visible_matches(size_t num_visible_matches) {
    num_visible_matches_ = num_visible_matches;
  }

 private:
  static size_t num_visible_matches_;
};

// Android prefix section for Hub search (ZPS).
class AndroidHubZPSSection : public Section {
 public:
  explicit AndroidHubZPSSection(omnibox::GroupConfigMap& group_configs);
};

// Android prefix section for Hub search (non-ZPS).
class AndroidHubNonZPSSection : public Section {
 public:
  explicit AndroidHubNonZPSSection(omnibox::GroupConfigMap& group_configs);
};

// Section expressing the Android ZPS limits and grouping for the NTP.
// - up to 15 + `max_related_queries` + `max_trending_queries` suggestions
//   total.
//  - up to 1 clipboard suggestion.
//  - up to 15 MIA or personalized suggestions.
//  - up to 5 trending search suggestions.
class AndroidNTPZpsSection : public ZpsSectionWithLocalHistory {
 public:
  AndroidNTPZpsSection(omnibox::GroupConfigMap& group_configs,
                       bool mia_enabled);

  void InitFromMatches(ACMatches& matches) override;
};

// Section expressing the Android ZPS limits and grouping for the SRP.
// - up to 15 suggestions total.
//  - up to 1 verbatim suggestion.
//  - up to 1 clipboard suggestion.
//  - up to 1 most visited carousel.
//  - up to 15 previous search related suggestions.
//  - up to 15 personalized suggestions.
class AndroidSRPZpsSection : public ZpsSection {
 public:
  explicit AndroidSRPZpsSection(omnibox::GroupConfigMap& group_configs);
};

// Section expressing the Android ZPS limits and grouping for the Web.
// - up to 15 suggestions total.
//  - up to 1 verbatim suggestion.
//  - up to 1 clipboard suggestion.
//  - up to 1 most visited carousel.
//  - up to 8 page related suggestions.
//  - up to 15 personalized suggestions.
class AndroidWebZpsSection : public ZpsSectionWithMVTiles {
 public:
  explicit AndroidWebZpsSection(omnibox::GroupConfigMap& group_configs);
};

// Section expressing the Desktop ZPS limits and grouping for the NTP.
// - up to 8 suggestions total or 7 total if the ZPS IPH is enabled (the 8th
// suggestion being the IPH).
//  - up to 8 MIA or personalized suggestions.
//  - up to 8 trending search suggestions.
class DesktopNTPZpsSection : public ZpsSectionWithLocalHistory {
 public:
  DesktopNTPZpsSection(omnibox::GroupConfigMap& group_configs,
                       size_t limit,
                       bool mia_enabled);
};

// Section expressing the Desktop ZPS limits and grouping for unscoped
// extensions.
// - Up to 8 unscoped extension suggestions total.
//  - Up to 4 from the first extension.
//  - Up to 4 from the second extension.
class DesktopZpsUnscopedExtensionSection : public ZpsSection {
 public:
  explicit DesktopZpsUnscopedExtensionSection(
      omnibox::GroupConfigMap& group_configs);
};

// Section expressing the Desktop ZPS limits and grouping for the IPH suggestion
// on the NTP.
// - Up to 1 IPH suggestion total
class DesktopNTPZpsIPHSection : public ZpsSection {
 public:
  explicit DesktopNTPZpsIPHSection(omnibox::GroupConfigMap& group_configs);
};

// Section expressing the Desktop secondary ZPS limits and grouping for the NTP.
// - up to 4 suggestions total.
//  - up to 3 previous search related suggestion chips.
// - up to 4 previous search related text suggestions.
// - up to 4 trending suggestions.
class DesktopSecondaryNTPZpsSection : public ZpsSection {
 public:
  explicit DesktopSecondaryNTPZpsSection(
      omnibox::GroupConfigMap& group_configs);
};

// Section expressing the Desktop ZPS limits and grouping for the SRP.
// - up to `max_suggestions` suggestions total.
//  - up to `search_limit` previous search related suggestions.
//  - up to `search_limit` personalized suggestions.
//  - up to `url_limit` most visited tiles suggestions
class DesktopSRPZpsSection : public ZpsSection {
 public:
  explicit DesktopSRPZpsSection(omnibox::GroupConfigMap& group_configs,
                                size_t max_suggestions,
                                size_t search_limit,
                                size_t url_limit,
                                size_t contextual_action_limit);
};

// Section expressing the Desktop URL ZPS limits and grouping for the Web.
// - up to `limit` most visited tiles suggestions.
class DesktopWebURLZpsSection : public ZpsSection {
 public:
  explicit DesktopWebURLZpsSection(omnibox::GroupConfigMap& group_configs,
                                   size_t limit);
};

// Section expressing the Desktop Search ZPS limits and grouping for the Web.
// - up to `limit` suggestions total.
//  - up to `limit` page related or personalized search suggestions.
//  - up to `contextual_action_limit` contextual search action suggestions.
//  - up to `contextual_search_limit` contextual search suggestions.
class DesktopWebSearchZpsSection : public Section {
 public:
  explicit DesktopWebSearchZpsSection(omnibox::GroupConfigMap& group_configs,
                                      size_t limit,
                                      size_t contextual_action_limit,
                                      size_t contextual_search_limit);
};

// An experimental alternative for `DesktopWebSearchZpsSection` that excludes
// all but contextual matches. It's intended as a full replacement instead
// of modifying that section, for simplicity and ease of removal after
// experimentation.
// - up to `contextual_action_limit` + `contextual_search_limit` total.
//  - up to `contextual_action_limit` contextual search action suggestions.
//  - up to `contextual_search_limit` contextual search suggestions.
class DesktopWebSearchZpsContextualOnlySection : public Section {
 public:
  explicit DesktopWebSearchZpsContextualOnlySection(
      omnibox::GroupConfigMap& group_configs,
      size_t contextual_action_limit,
      size_t contextual_search_limit);
};

// Section expressing the Desktop ZPS limits and grouping for the Lens
// contextual searchbox.
// - up to 8 suggestions total.
//  - up to 8 page related suggestions.
class DesktopLensContextualZpsSection : public ZpsSection {
 public:
  explicit DesktopLensContextualZpsSection(
      omnibox::GroupConfigMap& group_configs);
};

// Section expressing the Desktop ZPS limits and grouping for the Lens
// multimodal searchbox.
// - up to 8 suggestions total.
//  - up to 8 multimodal suggestions.
class DesktopLensMultimodalZpsSection : public ZpsSection {
 public:
  explicit DesktopLensMultimodalZpsSection(
      omnibox::GroupConfigMap& group_configs);
};

class DesktopComposeboxZpsSection : public ZpsSection {
 public:
  explicit DesktopComposeboxZpsSection(omnibox::GroupConfigMap& group_configs,
                                       size_t max_suggestions,
                                       size_t max_aim_suggestions,
                                       size_t max_contextual_suggestions);
};

// A ZPS section that includes only the toolbelt match.
class ToolbeltSection : public ZpsSection {
 public:
  explicit ToolbeltSection(omnibox::GroupConfigMap& group_configs);
};

// Section expressing the Desktop, non-ZPS limits and grouping.
// - up to 10 suggestions total.
//  - up to 1 default, 10 starer packs, 10 search, 8 nav, and 1 history cluster
//   suggestions.
// - Only allow more than 8 suggestions if the section does not contain navs.
// - Only allow more than 7 navs if there are no non-navs to show.
// - The history cluster suggestion should count against the search limit.
// - The default suggestion should count against either the search or nav limit.
// - Group defaults 1st, then searches and history clusters, then navs.
class DesktopNonZpsSection : public Section {
 public:
  explicit DesktopNonZpsSection(omnibox::GroupConfigMap& group_configs);
  // Section:
  void InitFromMatches(ACMatches& matches) override;
};

// Section expressing the iOS ZPS limits and grouping for the NTP.
// - up to `total_count` suggestions total.
//  - up to 1 clipboard suggestion.
//  - up to `psuggest_count` MIA or personalized suggestions.
//  - up to `max_trending_queries` trending suggestions.
class IOSNTPZpsSection : public ZpsSectionWithLocalHistory {
 public:
  IOSNTPZpsSection(omnibox::GroupConfigMap& group_configs, bool mia_enabled);
  void InitFromMatches(ACMatches& matches) override;
};

// Section expressing the iOS ZPS limits and grouping for the SRP.
// - up to 20 suggestions total (where all MV Tiles are counted for 1).
//  - up to 1 verbatim suggestion.
//  - up to 1 clipboard suggestion.
//  - up to 10 most visited in a carousel.
//  - up to 8 previous search related suggestions.
//  - up to 20 personalized suggestions.
class IOSSRPZpsSection : public ZpsSectionWithMVTiles {
 public:
  explicit IOSSRPZpsSection(omnibox::GroupConfigMap& group_configs);
};

// Section expressing the iOS ZPS limits and grouping for the Web.
// - up to 20 suggestions total (but all MV Tiles are counted for 1).
//  - up to 1 verbatim suggestion.
//  - up to 1 clipboard suggestion.
//  - up to 10 most visited in a carousel.
//  - up to 8 page related suggestions.
//  - up to 20 personalized suggestions.
class IOSWebZpsSection : public ZpsSectionWithMVTiles {
 public:
  explicit IOSWebZpsSection(omnibox::GroupConfigMap& group_configs);
};

// Section expressing the iOS ZPS limits and grouping for the Lens mutimodal
// searchbox.
// - up to 10 suggestions total.
//  - up to 10 search suggestions.
class IOSLensMultimodalZpsSection : public ZpsSection {
 public:
  explicit IOSLensMultimodalZpsSection(omnibox::GroupConfigMap& group_configs);
};

#endif  // COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_GROUPER_SECTIONS_H_
