
// Copyright 2021 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 "src/lib/util/status_builder.h"

#include "src/logging.h"
#include "src/public/lib/status.h"
#include "src/public/lib/status_codes.h"

namespace cobalt::util {

StatusBuilder::StatusBuilder(const Status& original_status, util::SourceLocation location)
    : location_(location) {
  SetCode(original_status.error_code());
  error_message_ << original_status.error_message();
  error_details_ << original_status.error_details();
}

StatusBuilder::StatusBuilder(StatusCode status_code, util::SourceLocation location)
    : location_(location) {
  SetCode(status_code);
}

StatusBuilder::StatusBuilder(StatusCode status_code, const std::string& initial_message,
                             util::SourceLocation location)
    : location_(location) {
  SetCode(status_code);
  error_message_ << initial_message;
}

#ifdef HAVE_GLOG

#define LOG_AT_LOC(location, severity) \
  ::google::LogMessage((location).file_name(), (location).line(), google::GLOG_##severity).stream()

#elif defined(__Fuchsia__)

#define LOG_AT_LOC(location, severity)                                                       \
  FX_LAZY_STREAM(                                                                            \
      ::fuchsia_logging::LogMessage(::fuchsia_logging::LOG_##severity, (location).file_name(), \
                                   (location).line(), nullptr, "core")                       \
          .stream(),                                                                         \
      FX_LOG_IS_ON(severity))

#else

#define LOG_AT_LOC(location, severity) LOG(severity).AtLocation(location)

#endif
Status StatusBuilder::Build() {
  if (code_ == StatusCode::OK) {
    return Status::OkStatus();
  }

  Status result = Status(code_, error_message_.str(), error_details_.str());

  switch (log_level_) {
    case LogLevel::ERROR:
      LOG_AT_LOC(location_, ERROR) << result;
      break;
    case LogLevel::WARNING:
      LOG_AT_LOC(location_, WARNING) << result;
      break;
    case LogLevel::INFO:
      LOG_AT_LOC(location_, INFO) << result;
      break;
    default:
      // No logging
      break;
  }

  return result;
}
#undef LOG_AT_LOC

}  // namespace cobalt::util
