#include "aos/logging/implementations.h"

#include <algorithm>
#include <chrono>
#include <cinttypes>
#include <cstdarg>

#include "aos/logging/printf_formats.h"
#include "aos/time/time.h"

namespace aos {
namespace logging {
namespace internal {
namespace {

namespace chrono = ::std::chrono;

void FillInMessageBase(log_level level, std::string_view name,
                       monotonic_clock::time_point monotonic_now,
                       LogMessage *message) {
  Context *context = Context::Get();

  message->level = level;
  message->source = context->source;
  memcpy(message->name, name.data(), name.size());
  message->name_length = name.size();

  message->seconds =
      chrono::duration_cast<chrono::seconds>(monotonic_now.time_since_epoch())
          .count();
  message->nseconds =
      chrono::duration_cast<chrono::nanoseconds>(
          monotonic_now.time_since_epoch() - chrono::seconds(message->seconds))
          .count();

  message->sequence = context->sequence++;
}

}  // namespace

void FillInMessage(log_level level, std::string_view name,
                   monotonic_clock::time_point monotonic_now,
                   const char *format, va_list ap, LogMessage *message) {
  FillInMessageBase(level, name, monotonic_now, message);

  message->message_length =
      ExecuteFormat(message->message, sizeof(message->message), format, ap);
}

void PrintMessage(FILE *output, const LogMessage &message) {
  fprintf(output, AOS_LOGGING_BASE_FORMAT "%.*s",
          AOS_LOGGING_BASE_ARGS(message.name_length, message.name,
                                static_cast<int32_t>(message.source),
                                message.sequence, message.level,
                                message.seconds, message.nseconds),
          static_cast<int>(message.message_length), message.message);
}

}  // namespace internal

void HandleMessageLogImplementation::DoLog(log_level level, const char *format,
                                           va_list ap) {
  LogMessage message;
  internal::FillInMessage(level, MyName(), monotonic_now(), format, ap,
                          &message);
  HandleMessage(message);
}

StreamLogImplementation::StreamLogImplementation(FILE *stream)
    : stream_(stream) {}

void StreamLogImplementation::HandleMessage(const LogMessage &message) {
  internal::PrintMessage(stream_, message);
}

void SetImplementation(std::shared_ptr<LogImplementation> implementation) {
  internal::Context *context = internal::Context::Get();
  context->implementation = std::move(implementation);
}

std::shared_ptr<LogImplementation> GetImplementation() {
  internal::Context *context = internal::Context::Get();
  return context->implementation;
}

}  // namespace logging
}  // namespace aos
