// Copyright 2021 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_TAB_MATCHER_H_
#define COMPONENTS_OMNIBOX_BROWSER_TAB_MATCHER_H_

#include <functional>
#include <unordered_map>

#include "base/time/time.h"
#include "build/build_config.h"
#include "components/omnibox/browser/autocomplete_input.h"
#include "url/gurl.h"

// Abstraction of a mechanism that associates GURL objects with open tabs.
class TabMatcher {
 public:
  // Information about presence of open tabs that match supplied URL.
  // The open tab information may be platform specific.
  struct TabInfo {
    // Whether a tab with matching URL exists.
    bool has_matching_tab{};

#if BUILDFLAG(IS_ANDROID)
    int android_tab_id{};
#endif
  };

  // Mechanism that facilitates hashing of the GURL objects.
  struct GURLHash {
    size_t operator()(const GURL& url) const {
      return std::hash<std::string>()(url.spec());
    }
  };

  // Wrapper for tab information used by OpenTabProvider.
  struct TabWrapper {
    std::u16string title;
    GURL url;
    base::Time last_shown_time;

    TabWrapper(std::u16string title, GURL url, base::Time last_shown_time) {
      this->title = title;
      this->url = url;
      this->last_shown_time = last_shown_time;
    }
  };

  // Map of URLs to TabInfo used for batch tab lookups.
  // Note this uses ptr_hash<> for lookups: objects used for insertion must
  // outlive the map and serve as direct keys.
  using GURLToTabInfoMap = std::unordered_map<GURL, TabInfo, GURLHash>;

  TabMatcher() = default;
  TabMatcher(TabMatcher&&) = delete;
  TabMatcher(const TabMatcher&) = delete;
  TabMatcher& operator=(TabMatcher&&) = delete;
  TabMatcher& operator=(const TabMatcher&) = delete;

  virtual ~TabMatcher() = default;

  // For a given URL, check if a tab already exists where that URL is already
  // opened.
  // Returns true, if the URL can be matched to existing tab, otherwise false.
  virtual bool IsTabOpenWithURL(const GURL& gurl,
                                const AutocompleteInput* input) const = 0;

  // For a given input GURLToTabInfoMap, in-place update the map with the
  // TabInfo details.
  // The matching operation is performed in a batch, offering performance
  // benefits on Android where the operation is otherwise very expensive.
  virtual void FindMatchingTabs(GURLToTabInfoMap* map,
                                const AutocompleteInput* input) const;

  // Returns tab wrappers for all open tabs for the current profile.
  virtual std::vector<TabWrapper> GetOpenTabs(
      const AutocompleteInput* input,
      bool exclude_active_tab = true) const;
};

#endif  // COMPONENTS_OMNIBOX_BROWSER_TAB_MATCHER_H_
