/** @file
 *
 *  A brief file description
 *
 *  @section license License
 *
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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.
 */

#include <string>

#include "QLog.h"

namespace QLog
{
void
Trace::encode(YAML::Node &node)
{
  node["title"]       = _title;
  node["description"] = _desc;

  // common fields
  {
    YAML::Node cf;
    cf["ODCID"]           = _odcid;
    cf["reference_time"]  = std::to_string(this->_reference_time / HRTIME_MSECOND);
    node["common_fields"] = cf;
  }

  {
    node["event_fields"].push_back("relative_time");
    node["event_fields"].push_back("category");
    node["event_fields"].push_back("event");
    node["event_fields"].push_back("data");

    if (_vp.name != "") {
      node["vantage_point"]["name"] = _vp.name;
    }

    if (vantage_point_type_name(_vp.type)) {
      node["vantage_point"]["type"] = vantage_point_type_name(_vp.type);
    }

    if (vantage_point_type_name(_vp.flow)) {
      node["vantage_point"]["flow"] = vantage_point_type_name(_vp.flow);
    }
  }

  // events
  for (auto &&it : _events) {
    YAML::Node sub(YAML::NodeType::value::Sequence);
    sub.push_back((it->get_time() - this->_reference_time) / HRTIME_MSECOND);
    sub.push_back(it->category());
    sub.push_back(it->event());
    YAML::Node event;
    it->encode(event);
    sub.push_back(event);
    node["events"].push_back(sub);
  }
}

void
QLog::dump(std::string dir)
{
  YAML::Node root;
  root["qlog_version"] = this->_ver;
  root["title"]        = this->_title;
  root["description"]  = this->_desc;
  for (auto &&it : this->_traces) {
    YAML::Node node;
    it->encode(node);
    root["traces"].push_back(node);
  }

  auto file = dir;
  if (file.back() != '/') {
    file += "/";
  }
  file += this->last_trace().odcid() + ".qlog";
  std::ofstream ofs;
  ofs.open(file, std::ofstream::in | std::ofstream::trunc);

  YAML::Emitter emitter(ofs);
  emitter << YAML::DoubleQuoted << YAML::Flow << root;
  ofs << "\n";
  ofs.close();
}

} // namespace QLog
