// 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 CHROME_BROWSER_PRELOADING_SEARCH_PRELOAD_SEARCH_PRELOAD_PIPELINE_H_
#define CHROME_BROWSER_PRELOADING_SEARCH_PRELOAD_SEARCH_PRELOAD_PIPELINE_H_

#include "chrome/browser/preloading/search_preload/search_preload_signal_result.h"
#include "content/public/browser/prefetch_handle.h"
#include "content/public/browser/preload_pipeline_info.h"
#include "content/public/browser/prerender_handle.h"
#include "url/gurl.h"

class SearchPreloadService;

namespace content {
class WebContents;
}

// Represents a pipeline for Default Search Engine preloads.
class SearchPreloadPipeline {
 public:
  explicit SearchPreloadPipeline(GURL canonical_url);
  ~SearchPreloadPipeline();

  // Not movable nor copyable.
  SearchPreloadPipeline(const SearchPreloadPipeline&&) = delete;
  SearchPreloadPipeline& operator=(const SearchPreloadPipeline&&) = delete;
  SearchPreloadPipeline(const SearchPreloadPipeline&) = delete;
  SearchPreloadPipeline& operator=(const SearchPreloadPipeline&) = delete;

  void UpdateConfidence(content::WebContents& web_contents, int confidence);

  // Starts prefetch if not triggered yet.
  //
  // Returns true iff prefetch is triggered, i.e. `WebContents::StartPrefetch()`
  // is called.
  SearchPreloadSignalResult StartPrefetch(
      content::WebContents& web_contents,
      base::WeakPtr<SearchPreloadService> search_preload_service,
      const GURL& prefetch_url,
      content::PreloadingPredictor predictor,
      const std::optional<net::HttpNoVarySearchData>& no_vary_search_hint,
      bool is_navigation_likely,
      bool should_ignore_saver_modes);
  // Starts prerender if not triggered yet and prefetch is alive.
  SearchPreloadSignalResult StartPrerender(
      content::WebContents& web_contents,
      const GURL& prerernder_url,
      content::PreloadingPredictor predictor);

  // Cancels prerender if triggered.
  void CancelPrerender();

  bool IsPrefetchAlive() const;
  bool IsPrerenderValid() const;

 private:
  const scoped_refptr<content::PreloadPipelineInfo> pipeline_info_;

  const GURL canonical_url_;

  int confidence_ = 0;

  std::unique_ptr<content::PrefetchHandle> prefetch_handle_;
  std::unique_ptr<content::PrerenderHandle> prerender_handle_;
};

#endif  // CHROME_BROWSER_PRELOADING_SEARCH_PRELOAD_SEARCH_PRELOAD_PIPELINE_H_
