/*
 *  Copyright 2019 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.
 */
#ifndef TEST_LOGGING_LOG_WRITER_H_
#define TEST_LOGGING_LOG_WRITER_H_

#include <stdarg.h>
#include <memory>
#include <string>
#include <utility>

#include "api/rtc_event_log_output.h"
#include "rtc_base/strings/string_builder.h"

namespace webrtc {
template <class... Args>
inline void LogWriteFormat(RtcEventLogOutput* out_, const char* fmt, ...) {
  va_list args, copy;
  va_start(args, fmt);
  va_copy(copy, args);
  const int predicted_length = std::vsnprintf(nullptr, 0, fmt, copy);
  va_end(copy);

  RTC_DCHECK_GE(predicted_length, 0);
  std::string out_str(predicted_length, '\0');
  if (predicted_length > 0) {
    // Pass "+ 1" to vsnprintf to include space for the '\0'.
    const int actual_length =
        std::vsnprintf(&out_str.front(), predicted_length + 1, fmt, args);
    RTC_DCHECK_GE(actual_length, 0);
  }
  va_end(args);
  out_->Write(out_str);
}

class LogWriterFactoryInterface {
 public:
  virtual std::unique_ptr<RtcEventLogOutput> Create(std::string filename) = 0;
  virtual ~LogWriterFactoryInterface() = default;
};

class LogWriterFactoryAddPrefix : public LogWriterFactoryInterface {
 public:
  LogWriterFactoryAddPrefix(LogWriterFactoryInterface* base,
                            std::string prefix);
  std::unique_ptr<RtcEventLogOutput> Create(std::string filename) override;

 private:
  LogWriterFactoryInterface* const base_factory_;
  const std::string prefix_;
};

}  // namespace webrtc

#endif  // TEST_LOGGING_LOG_WRITER_H_
