// Copyright 2025 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_EXTENSION_SUGGESTION_H_
#define COMPONENTS_OMNIBOX_BROWSER_EXTENSION_SUGGESTION_H_

#include <stdint.h>

#include <memory>
#include <optional>
#include <string>
#include <vector>

#include "base/values.h"
#include "components/omnibox/browser/autocomplete_match.h"
#include "components/omnibox/browser/extension_suggestion.h"
#include "ui/gfx/image/image.h"

// A suggest result parsed from omnibox_api::SuggestResult.
struct ExtensionSuggestion {
  // An action button attached to a suggest result.
  struct Action {
    Action(std::string name,
           std::string label,
           std::string tooltip_text,
           gfx::Image icon);

    ~Action();
    Action(const Action&) = delete;
    Action& operator=(const Action&) = delete;
    Action(Action&& rhs);
    Action& operator=(Action&& rhs);

    // The string sent to the extension in the event corresponding to the user
    // clicking on the action.
    std::string name;

    // The action button label.
    std::string label;

    // The action button hover tooltip text.
    std::string tooltip_text;

    // The deserialized image data of an action icon.
    gfx::Image icon;
  };

  ExtensionSuggestion(std::string content,
                      std::string description,
                      bool deletable,
                      ACMatchClassifications match_classifications,
                      std::optional<std::vector<Action>> actions,
                      std::optional<std::string> icon_url);

  ~ExtensionSuggestion();
  ExtensionSuggestion(const ExtensionSuggestion&) = delete;
  ExtensionSuggestion& operator=(const ExtensionSuggestion&) = delete;
  ExtensionSuggestion(ExtensionSuggestion&& rhs);
  ExtensionSuggestion& operator=(ExtensionSuggestion&& rhs);

  // The text that is put into the URL bar, and that is sent to the extension
  // when the user chooses this entry.
  std::string content;

  // The text that is displayed in the URL dropdown. Can contain XML-style
  // markup for styling.
  std::string description;

  // Whether the suggest result can be deleted by the user.
  bool deletable;

  // The formatting for the suggestion text that matches the search query text.
  ACMatchClassifications match_classifications;

  // An array of actions attached to the suggestion. Only supported for
  // suggestions added in unscoped mode.
  std::optional<std::vector<Action>> actions;

  // An icon shown on the leading edge of the suggestion in the omnibox
  // dropdown. Only supported for suggestions added in unscoped mode.
  std::optional<std::string> icon_url;
};

#endif  // COMPONENTS_OMNIBOX_BROWSER_EXTENSION_SUGGESTION_H_
