// Copyright 2024 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_HISTORY_EMBEDDINGS_PROVIDER_H_
#define COMPONENTS_OMNIBOX_BROWSER_HISTORY_EMBEDDINGS_PROVIDER_H_

#include <optional>
#include <string>

#include "base/memory/raw_ptr.h"
#include "components/history_embeddings/history_embeddings_service.h"
#include "components/omnibox/browser/autocomplete_enums.h"
#include "components/omnibox/browser/autocomplete_input.h"
#include "components/omnibox/browser/history_provider.h"

class AutocompleteProviderClient;
class TemplateURL;

class HistoryEmbeddingsProvider : public HistoryProvider {
 public:
  HistoryEmbeddingsProvider(AutocompleteProviderClient* client,
                            AutocompleteProviderListener* listener);

  // AutocompleteProvider:
  void Start(const AutocompleteInput& input, bool minimal_changes) override;
  void Stop(AutocompleteStopReason stop_reason) override;

 private:
  friend class FakeHistoryEmbeddingsProvider;

  ~HistoryEmbeddingsProvider() override;

  // Callback for querying `HistoryEmbeddingsService::Search()`.
  void OnReceivedSearchResult(history_embeddings::SearchResult search_result);

  // Creates a `HISTORY_EMBEDDINGS` match.
  AutocompleteMatch CreateMatch(
      const history_embeddings::ScoredUrlRow& scored_url_row);

  // Creates a HISTORY_EMBEDDINGS_ANSWER` match. `scored_url_row` is the
  // `ScoredUrlRow` `answerer_result` was derived from; `match` is the match
  // created by `CreateMatch()` for `scored_url_row`.
  std::optional<AutocompleteMatch> CreateAnswerMatch(
      const history_embeddings::AnswererResult& answerer_result,
      const history_embeddings::ScoredUrlRow& scored_url_row,
      const AutocompleteMatch& match);

  // Creates a HISTORY_EMBEDDINGS_ANSWER` match.
  AutocompleteMatch CreateAnswerMatchHelper(
      int score,
      const std::u16string& history_embeddings_answer_header_text,
      const std::u16string& description);

  // Assigned in `Start()`, accessed in `OnReceivedSearchResult()` which is only
  // called asyncly after `Start()`, so it's never null when accessed.
  raw_ptr<const TemplateURL> starter_pack_engine_;

  // The last input sent to `HistoryEmbeddingsService::Search()`.
  AutocompleteInput input_;

  base::WeakPtrFactory<HistoryEmbeddingsProvider> weak_factory_{this};
};

#endif  // COMPONENTS_OMNIBOX_BROWSER_HISTORY_EMBEDDINGS_PROVIDER_H_
