// 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_DOWNLOAD_DATABASE_DOWNLOAD_DB_H_
#define COMPONENTS_DOWNLOAD_DATABASE_DOWNLOAD_DB_H_

#include <memory>
#include <string>
#include <vector>

#include "base/callback_forward.h"
#include "base/optional.h"
#include "components/download/database/download_namespace.h"

namespace download {

struct DownloadDBEntry;

// A backing storage for persisting DownloadDBEntry objects.
class DownloadDB {
 public:
  using LoadEntriesCallback = base::OnceCallback<void(
      bool success,
      std::unique_ptr<std::vector<DownloadDBEntry>> entries)>;
  using DownloadDBCallback = base::OnceCallback<void(bool success)>;

  DownloadDB();
  virtual ~DownloadDB();

  // Initializes this db asynchronously, callback will be run on completion.
  virtual void Initialize(DownloadDBCallback callback);

  // Adds or updates |entry| in the storage.
  virtual void AddOrReplace(const DownloadDBEntry& entry);

  // Adds or updates multiple entries in the storage.
  virtual void AddOrReplaceEntries(const std::vector<DownloadDBEntry>& entry,
                                   DownloadDBCallback callback);

  // Retrieves all entries with the given |download_namespace|.
  virtual void LoadEntries(LoadEntriesCallback callback);

  // Removes the Entry associated with |guid| from the storage.
  virtual void Remove(const std::string& guid);
};

}  // namespace download

#endif  // COMPONENTS_DOWNLOAD_DATABASE_DOWNLOAD_DB_H_
