// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <lib/syslog/global.h>
#include <lib/zx/process.h>

#include <memory>

#include "export.h"
#include "fx_logger.h"
#include "lib/syslog/logger.h"

namespace syslog_internal {

__WEAK bool HasStructuredBackend() { return false; }
}  // namespace syslog_internal

namespace {

fx_logger_t* MakeDefaultLogger() {
  char process_name[ZX_MAX_NAME_LEN] = "";
  const char* tag = process_name;

  zx_status_t status =
      zx::process::self()->get_property(ZX_PROP_NAME, process_name, sizeof(process_name));
  if (status != ZX_OK)
    process_name[0] = '\0';

  fx_logger_config_t config = {
      .min_severity = FX_LOG_SEVERITY_DEFAULT,
      .console_fd = -1,
      .tags = &tag,
      .num_tags = 1,
  };
  fx_logger_t* logger = NULL;
  status = fx_logger_create_internal(&config, &logger);
  // Making the default logger should never fail.
  ZX_DEBUG_ASSERT(status == ZX_OK);
  return logger;
}

}  // namespace

fx_logger_t* get_or_create_global_logger() {
  // Upon initialization, the default logger is either provided with a
  // socket connection, or a fallback file-descriptor (which it will use)
  // or it will be initialized to log to STDERR. This object is constructed on
  // the first call to this function and will be leaked on shutdown.
  static fx_logger_t* logger = MakeDefaultLogger();
  return logger;
}

SYSLOG_EXPORT
fx_logger_t* fx_log_get_logger() { return get_or_create_global_logger(); }

SYSLOG_EXPORT
zx_status_t fx_log_reconfigure(const fx_logger_config_t* config) {
  fx_logger_t* logger = get_or_create_global_logger();
  return logger->Reconfigure(
      config, (config->console_fd == -1 && config->log_sink_socket == ZX_HANDLE_INVALID));
}

SYSLOG_EXPORT
bool fx_log_is_enabled(fx_log_severity_t severity) {
  fx_logger_t* logger = fx_log_get_logger();
  return severity >= fx_logger_get_min_severity(logger);
}

SYSLOG_EXPORT
fx_log_severity_t fx_log_severity_from_verbosity(uint8_t verbosity) {
  // verbosity scale sits in the interstitial space between INFO and DEBUG
  fx_log_severity_t severity = FX_LOG_INFO - (verbosity * FX_LOG_VERBOSITY_STEP_SIZE);
  if (severity < FX_LOG_DEBUG + 1) {
    return FX_LOG_DEBUG + 1;
  }
  return severity;
}

SYSLOG_EXPORT
bool fx_vlog_is_enabled(uint8_t verbosity) {
  fx_logger_t* logger = fx_log_get_logger();
  return logger && fx_log_severity_from_verbosity(verbosity) >= fx_logger_get_min_severity(logger);
}
