// Copyright 2016 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_BROWSER_TRACE_MANAGER_H_
#define COBALT_BROWSER_TRACE_MANAGER_H_

#include <map>
#include <string>

#include "base/threading/thread_checker.h"
#include "cobalt/debug/console/command_manager.h"
#include "cobalt/trace_event/event_parser.h"
#include "cobalt/trace_event/scoped_trace_to_file.h"

namespace cobalt {
namespace browser {

// Wrapper class which wraps all trace related stuff.
class TraceManager {
 public:
  // Returns whether there's a trace that is active.
  static bool IsTracing();

  TraceManager();

  // Called by browser module when an input event is produced.
  void OnInputEventProduced();

  // Message handler callback for trace message from debug console.
  void OnTraceMessage(const std::string& message);

  // Message handler callback for input trace message from debug console.
  void OnInputTraceMessage(const std::string& message);

  // Called when receiving and finishing receiving parsed trace events.
  void OnReceiveTraceEvent(
      const scoped_refptr<trace_event::EventParser::ScopedEvent>& event);
  void OnFinishReceiveTraceEvent();

 private:
  typedef std::multimap<int64,
                        scoped_refptr<trace_event::EventParser::ScopedEvent> >
      StartTimeToEventMap;

  // The message loop on which we'll do all our work.
  MessageLoop* const self_message_loop_;

  // Command handler object for trace command from the debug console.
  debug::console::ConsoleCommandManager::CommandHandler trace_command_handler_;
  // Command handler object for input trace command from the debug console.
  debug::console::ConsoleCommandManager::CommandHandler
      input_trace_command_handler_;
  // Whether input tracing is enabled.
  bool input_tracing_enabled_;

  THREAD_CHECKER(thread_checker_);
  // This object can be set to start a trace if a hotkey (like F3) is pressed.
  // While initialized, it means that a trace is on-going.
  scoped_ptr<trace_event::ScopedTraceToFile> trace_to_file_;
  // Record of a list of events we're interested in, ordered by starting time.
  StartTimeToEventMap start_time_to_event_map_;
};

}  // namespace browser
}  // namespace cobalt

#endif  // COBALT_BROWSER_TRACE_MANAGER_H_
