// Copyright 2014 The Chromium OS 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 LIBWEAVE_SRC_COMMANDS_CLOUD_COMMAND_PROXY_H_
#define LIBWEAVE_SRC_COMMANDS_CLOUD_COMMAND_PROXY_H_

#include <deque>
#include <memory>
#include <string>
#include <utility>

#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <base/scoped_observer.h>
#include <weave/command.h>

#include "src/backoff_entry.h"
#include "src/commands/cloud_command_update_interface.h"
#include "src/states/state_change_queue_interface.h"

namespace weave {

class CommandInstance;

namespace provider {
class TaskRunner;
}

// Command proxy which publishes command updates to the cloud.
class CloudCommandProxy final : public Command::Observer {
 public:
  CloudCommandProxy(CommandInstance* command_instance,
                    CloudCommandUpdateInterface* cloud_command_updater,
                    StateChangeQueueInterface* state_change_queue,
                    std::unique_ptr<BackoffEntry> backoff_entry,
                    provider::TaskRunner* task_runner);
  ~CloudCommandProxy() override = default;

  // CommandProxyInterface implementation/overloads.
  void OnResultsChanged() override;
  void OnStatusChanged() override;
  void OnProgressChanged() override;
  void OnCommandDestroyed() override;

 private:
  using UpdateID = StateChangeQueueInterface::UpdateID;
  using UpdateQueueEntry =
      std::pair<UpdateID, std::unique_ptr<base::DictionaryValue>>;

  // Puts a command update data into the update queue, and optionally sends an
  // asynchronous request to GCD server to update the command resource, if there
  // are no pending device status updates.
  void QueueCommandUpdate(std::unique_ptr<base::DictionaryValue> patch);

  // Sends an asynchronous request to GCD server to update the command resource,
  // if there are no pending device status updates.
  void SendCommandUpdate();

  // Retry the last failed command update request to the server.
  void ResendCommandUpdate();

  // Callback invoked by the asynchronous PATCH request to the server.
  // Called both in a case of successfully updating server command resource
  // and in case of an error, indicated by the |success| parameter.
  void OnUpdateCommandFinished(bool success);

  // Callback invoked by the device state change queue to notify of the
  // successful device state update. |update_id| is the ID of the state that
  // has been updated on the server.
  void OnDeviceStateUpdated(UpdateID update_id);

  CommandInstance* command_instance_;
  CloudCommandUpdateInterface* cloud_command_updater_;
  StateChangeQueueInterface* state_change_queue_;
  provider::TaskRunner* task_runner_{nullptr};

  // Backoff for SendCommandUpdate() method.
  std::unique_ptr<BackoffEntry> cloud_backoff_entry_;

  // Set to true while a pending PATCH request is in flight to the server.
  bool command_update_in_progress_{false};
  // Update queue with all the command update requests ready to be sent to
  // the server.
  std::deque<UpdateQueueEntry> update_queue_;

  // Callback token from the state change queue for OnDeviceStateUpdated()
  // callback for ask the device state change queue to call when the state
  // is updated on the server.
  StateChangeQueueInterface::Token callback_token_;

  // Last device state update ID that has been sent out to the server
  // successfully.
  UpdateID last_state_update_id_{0};

  ScopedObserver<Command, Command::Observer> observer_{this};

  base::WeakPtrFactory<CloudCommandProxy> backoff_weak_ptr_factory_{this};
  base::WeakPtrFactory<CloudCommandProxy> weak_ptr_factory_{this};
  DISALLOW_COPY_AND_ASSIGN(CloudCommandProxy);
};

}  // namespace weave

#endif  // LIBWEAVE_SRC_COMMANDS_CLOUD_COMMAND_PROXY_H_
