// Copyright 2014 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 CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_CHANNEL_ID_HELPER_H_
#define CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_CHANNEL_ID_HELPER_H_

#include <map>
#include <string>

#include "base/callback.h"
#include "net/ssl/channel_id_store.h"

namespace net {
class URLRequestContextGetter;
}

// BrowsingDataChannelIDHelper is an interface for classes dealing with
// aggregating and deleting browsing data stored in the channel ID store.
// A client of this class need to call StartFetching from the UI thread to
// initiate the flow, and it'll be notified by the callback in its UI thread at
// some later point.
class BrowsingDataChannelIDHelper
    : public base::RefCountedThreadSafe<BrowsingDataChannelIDHelper> {
 public:
  // Create a BrowsingDataChannelIDHelper instance for the given
  // |request_context|.
  static BrowsingDataChannelIDHelper* Create(
      net::URLRequestContextGetter* request_context);

  typedef base::Callback<
      void(const net::ChannelIDStore::ChannelIDList&)>
      FetchResultCallback;

  // Starts the fetching process, which will notify its completion via
  // callback.
  // This must be called only in the UI thread.
  virtual void StartFetching(const FetchResultCallback& callback) = 0;
  // Requests a single channel ID to be deleted.  This must be called in
  // the UI thread.
  virtual void DeleteChannelID(const std::string& server_id) = 0;

 protected:
  friend class base::RefCountedThreadSafe<BrowsingDataChannelIDHelper>;
  virtual ~BrowsingDataChannelIDHelper() {}
};

// This class is a thin wrapper around BrowsingDataChannelIDHelper that
// does not fetch its information from the ChannelIDService, but gets them
// passed as a parameter during construction.
class CannedBrowsingDataChannelIDHelper
    : public BrowsingDataChannelIDHelper {
 public:
  CannedBrowsingDataChannelIDHelper();

  // Add an ChannelID to the set of canned channel IDs that is
  // returned by this helper.
  void AddChannelID(
      const net::ChannelIDStore::ChannelID& channel_id);

  // Clears the list of canned channel IDs.
  void Reset();

  // True if no ChannelIDs are currently stored.
  bool empty() const;

  // Returns the current number of channel IDs.
  size_t GetChannelIDCount() const;

  // BrowsingDataChannelIDHelper methods.
  void StartFetching(const FetchResultCallback& callback) override;
  void DeleteChannelID(const std::string& server_id) override;

 private:
  ~CannedBrowsingDataChannelIDHelper() override;

  void FinishFetching();

  typedef std::map<std::string, net::ChannelIDStore::ChannelID>
      ChannelIDMap;
  ChannelIDMap channel_id_map_;

  FetchResultCallback completion_callback_;

  DISALLOW_COPY_AND_ASSIGN(CannedBrowsingDataChannelIDHelper);
};

#endif  // CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_CHANNEL_ID_HELPER_H_
