/*
 *  Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <cstdio>
#include <string>
#include <utility>
#include <vector>

#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "absl/flags/usage.h"
#include "absl/strings/string_view.h"
#include "logging/rtc_event_log/rtc_event_log_parser.h"
#include "rtc_base/logging.h"
#include "rtc_tools/rtc_event_log_to_text/converter.h"

ABSL_FLAG(bool,
          parse_unconfigured_header_extensions,
          true,
          "Attempt to parse unconfigured header extensions using the default "
          "WebRTC mapping. This can give very misleading results if the "
          "application negotiates a different mapping.");

// Prints an RTC event log as human readable text with one line per event.
// Note that the RTC event log text format isn't an API. Prefer to build
// tools directly on the parser (logging/rtc_event_log/rtc_event_log_parser.cc).
int main(int argc, char* argv[]) {
  absl::SetProgramUsageMessage(
      "A tool for converting WebRTC event logs to text.\n"
      "The events are sorted by log time and printed\n"
      "with one event per line, using the following format:\n"
      "<EVENT_TYPE> <log_time_ms> <field1>=<value1> <field2>=<value2> ...\n"
      "\n"
      "Example usage:\n"
      "./rtc_event_log_to_text <inputfile> <outputfile>\n"
      "./rtc_event_log_to_text <inputfile>\n"
      "If no output file is specified, the output is written to stdout\n");
  std::vector<char*> args = absl::ParseCommandLine(argc, argv);

  // Print RTC_LOG warnings and errors even in release builds.
  webrtc::LoggingConfig config;
  config.set_min_severity(webrtc::LS_WARNING);
  config.set_debug_severity(webrtc::LS_WARNING);
  webrtc::InitializeLogging(std::move(config));

  webrtc::ParsedRtcEventLog::UnconfiguredHeaderExtensions header_extensions =
      webrtc::ParsedRtcEventLog::UnconfiguredHeaderExtensions::kDontParse;
  if (absl::GetFlag(FLAGS_parse_unconfigured_header_extensions)) {
    header_extensions = webrtc::ParsedRtcEventLog::
        UnconfiguredHeaderExtensions::kAttemptWebrtcDefaultConfig;
  }

  std::string inputfile;
  FILE* output = nullptr;
  if (args.size() == 3) {
    inputfile = args[1];
    std::string outputfile = args[2];
    output = fopen(outputfile.c_str(), "w");
  } else if (args.size() == 2) {
    inputfile = args[1];
    output = stdout;
  } else {
    // Print usage information.
    absl::string_view usage = absl::ProgramUsageMessage();
    fwrite(usage.data(), usage.size(), 1, stderr);
    return 1;
  }

  bool success = webrtc::Convert(inputfile, output, header_extensions);

  return success ? 0 : 1;
}
