// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_DEBUG_CONSOLE_COMMAND_MANAGER_H_
#define COBALT_DEBUG_CONSOLE_COMMAND_MANAGER_H_

#if !defined(ENABLE_DEBUGGER)
#error "Debugger is not enabled in this build."
#endif  // !ENABLE_DEBUGGER

#include <map>
#include <set>
#include <string>

#include "base/callback.h"
#include "base/memory/singleton.h"
#include "base/synchronization/lock.h"

namespace cobalt {
namespace debug {
namespace console {

// The console command system allows the app to register actions that can be
// triggered by the debug console.
//
// Any component can create a handler object of the CommandHandler class to
// listen for commands. A CommandHandler object automatically registers itself
// with the ConsoleCommandManager singleton on construction and unregisters
// itself on destruction.
//
// Each CommandHandler object specifies a callback and a help string. The
// ConsoleCommandManager handles a particular command by running the callback of
// the CommandHandler object registered for that command. The help string is
// used within the debug console to document the registered commands.

class ConsoleCommandManager {
 public:
  // Type for a callback to handle a command.
  typedef base::Callback<void(const std::string& message)> VoidCommandCallback;
  typedef base::Callback<std::string(const std::string& message)>
      StringCommandCallback;

  // Command handler that registers itself with this object.
  class CommandHandler {
   public:
    CommandHandler(const std::string& command,
                   const VoidCommandCallback& callback,
                   const std::string& short_help, const std::string& long_help);
    CommandHandler(const std::string& command,
                   const StringCommandCallback& callback,
                   const std::string& short_help, const std::string& long_help);
    ~CommandHandler();

    const std::string& command() const { return command_; }
    const VoidCommandCallback& void_callback() const { return void_callback_; }
    const StringCommandCallback& string_callback() const {
      return string_callback_;
    }
    const std::string& short_help() const { return short_help_; }
    const std::string& long_help() const { return long_help_; }

    // Returns true if the message is 'on', 'enable', or 'true'.
    static bool IsOnEnableOrTrue(const std::string& message);

   private:
    std::string command_;
    VoidCommandCallback void_callback_;
    StringCommandCallback string_callback_;
    std::string short_help_;
    std::string long_help_;
  };

  friend struct base::StaticMemorySingletonTraits<ConsoleCommandManager>;

  // Method to get the singleton instance of this class.
  static ConsoleCommandManager* GetInstance();

  // Handles a command by posting the message to the handler registered for
  // the specified command, if any.
  std::string HandleCommand(const std::string& command,
                            const std::string& message) const;

  // Returns a set of all the currently registered commands.
  std::set<std::string> GetRegisteredCommands() const;

  // Returns the help strings for a command.
  std::string GetShortHelp(const std::string& command) const;
  std::string GetLongHelp(const std::string& command) const;

 private:
  // Class can only be instanced via the singleton
  ConsoleCommandManager() {}
  ~ConsoleCommandManager() {}

  // Command handler map type.
  typedef std::map<std::string, const CommandHandler*> CommandHandlerMap;

  // Methods to register/unregister command handlers.
  // These are intended only to be called from the command handler objects.
  friend class CommandHandler;
  void RegisterCommandHandler(const CommandHandler* handler);
  void UnregisterCommandHandler(const CommandHandler* handler);

  mutable base::Lock lock_;

  // Map of command handlers, one for each command.
  CommandHandlerMap command_command_map_;
};

}  // namespace console
}  // namespace debug
}  // namespace cobalt

#endif  // COBALT_DEBUG_CONSOLE_COMMAND_MANAGER_H_
