// Copyright 2016 The Fuchsia 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 GARNET_LIB_TRACE_CONVERTERS_CHROMIUM_EXPORTER_H_
#define GARNET_LIB_TRACE_CONVERTERS_CHROMIUM_EXPORTER_H_

#include <trace-reader/reader.h>

#include <memory>
#include <ostream>
#include <tuple>
#include <unordered_map>
#include <vector>

#include "garnet/lib/perfmon/writer.h"
#include "rapidjson/ostreamwrapper.h"
#include "rapidjson/writer.h"

namespace tracing {

class ChromiumExporter {
 public:
  explicit ChromiumExporter(std::unique_ptr<std::ostream> stream_out);
  explicit ChromiumExporter(std::ostream& out);
  ~ChromiumExporter();

  void ExportRecord(const trace::Record& record);

 private:
  void Start();
  void Stop();
  void ExportEvent(const trace::Record::Event& event);
  void ExportLastBranchBlob(const perfmon::LastBranchRecordBlob& lbr);
  void ExportKernelObject(const trace::Record::KernelObject& kernel_object);
  void ExportLog(const trace::Record::Log& log);
  void ExportMetadata(const trace::Record::Metadata& metadata);
  void ExportContextSwitch(const trace::Record::ContextSwitch& context_switch);

  std::unique_ptr<std::ostream> stream_out_;
  rapidjson::OStreamWrapper wrapper_;
  rapidjson::Writer<rapidjson::OStreamWrapper> writer_;

  // Scale factor to get to microseconds.
  // By default ticks are in nanoseconds.
  double tick_scale_ = 0.001;

  std::unordered_map<zx_koid_t, fbl::String> processes_;
  // Virtual threads mean the same thread id can appear in different processes.
  // Organize threads by process to cope with this.
  std::unordered_map<zx_koid_t /* process id */,
                     std::unordered_map<zx_koid_t /* thread id */,
                                        fbl::String /* thread name */>>
      threads_;

  // The chromium/catapult trace file format doesn't support context switch
  // records, so we can't emit them inline. Save them for later emission to
  // the systemTraceEvents section.
  std::vector<trace::Record::ContextSwitch> context_switch_records_;

  // The chromium/catapult trace file format doesn't support random blobs,
  // so we can't emit them inline. Save them for later emission.
  // LastBranch records will go to the lastBranch section.
  std::vector<perfmon::LastBranchRecordBlob> last_branch_records_;
};

}  // namespace tracing

#endif  // GARNET_LIB_TRACE_CONVERTERS_CHROMIUM_EXPORTER_H_
