// 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/base/console_commands.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.
  base::ConsoleCommandManager::CommandHandler trace_command_handler_;
  // Command handler object for input trace command from the debug console.
  base::ConsoleCommandManager::CommandHandler input_trace_command_handler_;
  // Whether input tracing is enabled.
  bool input_tracing_enabled_;

  base::ThreadChecker 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_
