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

#ifndef COMPONENTS_NTP_TILES_CUSTOM_LINKS_MANAGER_H_
#define COMPONENTS_NTP_TILES_CUSTOM_LINKS_MANAGER_H_

#include <vector>

#include "base/callback_list.h"
#include "base/strings/string16.h"
#include "components/ntp_tiles/ntp_tile.h"
#include "url/gurl.h"

namespace ntp_tiles {

// Interface to manage and store custom links for the NTP. Initialized from
// MostVisitedSites.
//
// Custom links replaces the Most Visited tiles and allows users to manually
// add, edit, and delete tiles (i.e. links) up to a certain maximum. Duplicate
// URLs are not allowed, and the links are stored locally per profile.
//
// If the link is initialized from |Initialize|, it is considered a Most Visited
// link and will be deleted when its history entry is cleared. Once the user
// modifies the link, it will no longer be considered Most Visited and will not
// be deleted when history is cleared.
//
// The current list of links is kept in sync with any changes from Chrome sync.
class CustomLinksManager {
 public:
  struct Link {
    GURL url;
    base::string16 title;
    bool is_most_visited = false;

    bool operator==(const Link& other) const {
      return url == other.url && title == other.title &&
             is_most_visited == other.is_most_visited;
    }
  };

  virtual ~CustomLinksManager() = default;

  // Fills the initial links with |tiles| and sets the initalized status to
  // true. These links will be considered Most Visited and will be deleted when
  // history is cleared. Returns false and does nothing if custom links has
  // already been initialized.
  virtual bool Initialize(const NTPTilesVector& tiles) = 0;
  // Uninitializes custom links and clears the current links from storage.
  virtual void Uninitialize() = 0;
  // True if custom links is initialized and Most Visited tiles have been
  // replaced by custom links.
  virtual bool IsInitialized() const = 0;

  // Returns the current links.
  virtual const std::vector<Link>& GetLinks() const = 0;

  // Adds a link to the end of the list. This link will not be deleted when
  // history is cleared. Returns false and does nothing if custom links is not
  // initialized, |url| is invalid, we're at the maximum number of links, or
  // |url| already exists in the list.
  virtual bool AddLink(const GURL& url, const base::string16& title) = 0;
  // Updates the URL and/or title of the link specified by |url|. The link will
  // no longer be considered Most Visited. Returns false and does nothing if
  // custom links is not initialized, either URL is invalid, |url| does not
  // exist in the list, |new_url| already exists in the list, or both parameters
  // are empty.
  virtual bool UpdateLink(const GURL& url,
                          const GURL& new_url,
                          const base::string16& new_title) = 0;
  // Moves the specified link from its current index and inserts it at
  // |new_pos|. Returns false and does nothing if custom links is not
  // initialized, |url| is invalid, |url| does not exist in the list, or
  // |new_pos| is invalid/already the current index.
  virtual bool ReorderLink(const GURL& url, size_t new_pos) = 0;
  // Deletes the link with the specified |url|. Returns false and does nothing
  // if custom links is not initialized, |url| is invalid, or |url| does not
  // exist in the list.
  virtual bool DeleteLink(const GURL& url) = 0;
  // Restores the previous state of the list of links. Used to undo the previous
  // action (add, edit, delete, etc.). Returns false and does nothing if custom
  // links is not initialized or there is no previous state to restore.
  virtual bool UndoAction() = 0;

  // Registers a callback that will be invoked when custom links are updated by
  // sources other than this interface's methods (i.e. when links are deleted by
  // history clear or when links are updated by Chrome sync).
  virtual std::unique_ptr<base::CallbackList<void()>::Subscription>
  RegisterCallbackForOnChanged(base::RepeatingClosure callback) = 0;
};

}  // namespace ntp_tiles

#endif  // COMPONENTS_NTP_TILES_CUSTOM_LINKS_MANAGER_H_
