// 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 COMPONENTS_COPRESENCE_RPC_RPC_HANDLER_H_
#define COMPONENTS_COPRESENCE_RPC_RPC_HANDLER_H_

#include <set>
#include <string>
#include <vector>

#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "components/copresence/proto/enums.pb.h"
#include "components/copresence/public/copresence_client_delegate.h"
#include "components/copresence/public/whispernet_client.h"
#include "components/copresence/rpc/http_post.h"
#include "components/copresence/timed_map.h"

namespace copresence {

class DirectiveHandler;
class ReportRequest;
class RequestHeader;
class SubscribedMessage;

// This class currently handles all communication with the copresence server.
class RpcHandler {
 public:
  // A callback to indicate whether handler initialization succeeded.
  typedef base::Callback<void(bool)> SuccessCallback;

  // Report rpc name to send to Apiary.
  static const char kReportRequestRpcName[];

  // Constructor. |delegate| is owned by the caller,
  // and must be valid as long as the RpcHandler exists.
  explicit RpcHandler(CopresenceClientDelegate* delegate);

  virtual ~RpcHandler();

  // Clients must call this and wait for |init_done_callback|
  // to be called before invoking any other methods.
  void Initialize(const SuccessCallback& init_done_callback);

  // Send a report request
  void SendReportRequest(scoped_ptr<ReportRequest> request);
  void SendReportRequest(scoped_ptr<ReportRequest> request,
                         const std::string& app_id,
                         const StatusCallback& callback);

  // Report a set of tokens to the server for a given medium.
  void ReportTokens(const std::vector<AudioToken>& tokens);

  // Create the directive handler and connect it to
  // the whispernet client specified by the delegate.
  void ConnectToWhispernet();

 private:
  // An HttpPost::ResponseCallback prepended with an HttpPost object
  // that needs to be deleted.
  typedef base::Callback<void(HttpPost*, int, const std::string&)>
      PostCleanupCallback;

  // Callback to allow tests to stub out HTTP POST behavior.
  // Arguments:
  // URLRequestContextGetter: Context for the HTTP POST request.
  // string: Name of the rpc to invoke. URL format: server.google.com/rpc_name
  // MessageLite: Contents of POST request to be sent. This needs to be
  //     a (scoped) pointer to ease handling of the abstract MessageLite class.
  // ResponseCallback: Receives the response to the request.
  typedef base::Callback<void(net::URLRequestContextGetter*,
                              const std::string&,
                              scoped_ptr<google::protobuf::MessageLite>,
                              const PostCleanupCallback&)> PostCallback;

  friend class RpcHandlerTest;

  void RegisterResponseHandler(const SuccessCallback& init_done_callback,
                               HttpPost* completed_post,
                               int http_status_code,
                               const std::string& response_data);
  void ReportResponseHandler(const StatusCallback& status_callback,
                             HttpPost* completed_post,
                             int http_status_code,
                             const std::string& response_data);

  // If the request has any unpublish or unsubscribe operations, it removes
  // them from our directive handlers.
  void ProcessRemovedOperations(const ReportRequest& request);

  // Add all currently playing tokens to the update signals in this report
  // request. This ensures that the server doesn't keep issueing new tokens to
  // us when we're already playing valid tokens.
  void AddPlayingTokens(ReportRequest* request);

  void DispatchMessages(
      const google::protobuf::RepeatedPtrField<SubscribedMessage>&
      subscribed_messages);

  RequestHeader* CreateRequestHeader(const std::string& client_name) const;

  template <class T>
  void SendServerRequest(const std::string& rpc_name,
                         const std::string& app_id,
                         scoped_ptr<T> request,
                         const PostCleanupCallback& response_handler);

  // Wrapper for the http post constructor. This is the default way
  // to contact the server, but it can be overridden for testing.
  void SendHttpPost(net::URLRequestContextGetter* url_context_getter,
                    const std::string& rpc_name,
                    scoped_ptr<google::protobuf::MessageLite> request_proto,
                    const PostCleanupCallback& callback);

  // This method receives the request to encode a token and forwards it to
  // whispernet, setting the samples return callback to samples_callback.
  void AudioDirectiveListToWhispernetConnector(
      const std::string& token,
      bool audible,
      const WhispernetClient::SamplesCallback& samples_callback);

  CopresenceClientDelegate* delegate_;  // Belongs to the caller.
  TimedMap<std::string, bool> invalid_audio_token_cache_;
  PostCallback server_post_callback_;

  std::string device_id_;
  scoped_ptr<DirectiveHandler> directive_handler_;
  std::set<HttpPost*> pending_posts_;

  DISALLOW_COPY_AND_ASSIGN(RpcHandler);
};

}  // namespace copresence

#endif  // COMPONENTS_COPRESENCE_RPC_RPC_HANDLER_H_
