#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::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 aos::logging
