// Copyright 2016 The Fuchsia 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 PERIDOT_LIB_FIREBASE_FIREBASE_H_
#define PERIDOT_LIB_FIREBASE_FIREBASE_H_

#include <functional>
#include <string>
#include <vector>

#include <lib/fit/function.h>
#include <src/lib/fxl/macros.h>
#include <rapidjson/document.h>

#include "peridot/lib/firebase/status.h"
#include "peridot/lib/firebase/watch_client.h"

namespace firebase {

class Firebase {
 public:
  Firebase() {}
  virtual ~Firebase() {}

  // Common parameters:
  //   |query_params| - array of params that are joined using the "&" separator
  //       passed verbatim as the query parameter of the request. Can be empty.

  // Retrieves the JSON representation of the data under the given path. See
  // https://firebase.google.com/docs/database/rest/retrieve-data.
  //
  // TODO(ppi): support response Content-Length header, see LE-210.
  virtual void Get(const std::string& key,
                   const std::vector<std::string>& query_params,
                   fit::function<void(Status status,
                                      std::unique_ptr<rapidjson::Value> value)>
                       callback) = 0;

  // Overwrites the data under the given path. Data needs to be a valid JSON
  // object or JSON primitive value.
  // https://firebase.google.com/docs/database/rest/save-data
  virtual void Put(const std::string& key,
                   const std::vector<std::string>& query_params,
                   const std::string& data,
                   fit::function<void(Status status)> callback) = 0;

  // Adds or updates multiple keys under the given path. Data needs to be a
  // JSON dictionary.
  // https://firebase.google.com/docs/database/rest/save-data
  virtual void Patch(const std::string& key,
                     const std::vector<std::string>& query_params,
                     const std::string& data,
                     fit::function<void(Status status)> callback) = 0;

  // Deletes the data under the given path.
  virtual void Delete(const std::string& key,
                      const std::vector<std::string>& query_params,
                      fit::function<void(Status status)> callback) = 0;

  // Registers the given |watch_client| to receive notifications about changes
  // under the given |key|. See
  // https://firebase.google.com/docs/database/rest/retrieve-data.
  virtual void Watch(const std::string& key,
                     const std::vector<std::string>& query_params,
                     WatchClient* watch_client) = 0;

  // Unregisters the given |watch_client|. No calls on the client will be made
  // after this method returns.
  virtual void UnWatch(WatchClient* watch_client) = 0;

 private:
  FXL_DISALLOW_COPY_AND_ASSIGN(Firebase);
};

}  // namespace firebase

#endif  // PERIDOT_LIB_FIREBASE_FIREBASE_H_
