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

#include <map>
#include <memory>
#include <string>

#include <base/macros.h>

#include "buffet/commands/command_instance.h"

namespace buffet {

class CommandDispachInterface;

class CommandQueue final {
 public:
  CommandQueue() = default;

  // Sets a command dispatch notifications for changes in command queue.
  // |dispatch_interface| must outlive the CommandQueue object instance
  // or be nullptr.
  void SetCommandDispachInterface(CommandDispachInterface* dispatch_interface) {
    dispatch_interface_ = dispatch_interface;
  }

  // Checks if the command queue is empty.
  bool IsEmpty() const { return map_.empty(); }

  // Returns the number of commands in the queue.
  size_t GetCount() const { return map_.size(); }

  // Adds a new command to the queue. Each command in the queue has a unique
  // ID that identifies that command instance in this queue. This identifier
  // has no relation to any GCD command identifiers or anything else. Just a
  // unique key in this queue class.
  // The ID string of the added command is returned by this method.
  std::string Add(std::unique_ptr<CommandInstance> instance);

  // Removes a command identified by |id| from the queue. Returns a unique
  // pointer to the command instance if removed successfully, or an empty
  // unique_ptr if the command with the given ID doesn't exist in the queue.
  std::unique_ptr<CommandInstance> Remove(const std::string& id);

  // Finds a command instance in the queue by the instance |id|. Returns
  // nullptr if the command with the given |id| is not found. The returned
  // pointer should not be persisted for a long period of time.
  CommandInstance* Find(const std::string& id) const;

 private:
  // ID-to-CommandInstance map.
  std::map<std::string, std::unique_ptr<CommandInstance>> map_;
  // Counter for generating unique command IDs.
  int next_id_ = 0;
  // Callback interface for command dispatch, if provided.
  CommandDispachInterface* dispatch_interface_ = nullptr;

  DISALLOW_COPY_AND_ASSIGN(CommandQueue);
};

}  // namespace buffet

#endif  // BUFFET_COMMANDS_COMMAND_QUEUE_H_
