// 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 "err.h"

#include <lib/syslog/cpp/macros.h>
#include <stdarg.h>

#include "src/developer/debug/shared/status.h"
#include "src/lib/fxl/strings/string_printf.h"
#include "src/lib/unwinder/error.h"

namespace zxdb {

Err::Err() = default;

Err::Err(ErrType type, const std::string& msg) : type_(type), msg_(msg) {}

Err::Err(const std::string& msg) : type_(ErrType::kGeneral), msg_(msg) {}

Err::Err(const debug::Status& debug_status) {
  switch (debug_status.type()) {
    case debug::Status::kSuccess:
      type_ = ErrType::kNone;
      break;
    case debug::Status::kGenericError:
    case debug::Status::kPlatformError:
      // We currently don't preserve the platform error code, but assume that it's been
      // stringified into a reasonable message.
      type_ = ErrType::kGeneral;
      msg_ = debug_status.message();
      break;
    case debug::Status::kNotSupported:
      type_ = ErrType::kNotSupported;
      msg_ = debug_status.message();
      break;
    case debug::Status::kNotFound:
      type_ = ErrType::kNotFound;
      msg_ = debug_status.message();
      break;
    case debug::Status::kAlreadyExists:
      type_ = ErrType::kAlreadyExists;
      msg_ = debug_status.message();
      break;
    case debug::Status::kNoResources:
      type_ = ErrType::kNoResources;
      msg_ = debug_status.message();
      break;
    case debug::Status::kLast:
      FX_NOTREACHED();
      type_ = ErrType::kGeneral;
      break;
  }
}

Err::Err(const char* fmt, ...) : type_(ErrType::kGeneral) {
  va_list ap;
  va_start(ap, fmt);
  msg_ = fxl::StringVPrintf(fmt, ap);
  va_end(ap);
}

Err::~Err() = default;

bool Err::operator==(const Err& other) const { return type_ == other.type_ && msg_ == other.msg_; }

std::string Err::ToString() const {
  std::string ret = ErrTypeToString(type());
  ret += ": ";
  ret += msg();
  return ret;
}

std::string ErrTypeToString(ErrType type) {
  switch (type) {
    case ErrType::kNone:
      return "Ok";
    case ErrType::kGeneral:
      return "General";
    case ErrType::kCanceled:
      return "Canceled";
    case ErrType::kNoConnection:
      return "NoConnection";
    case ErrType::kCorruptMessage:
      return "CorruptMessage";
    case ErrType::kClientApi:
      return "ClientApi";
    case ErrType::kNotSupported:
      return "NotSupported";
    case ErrType::kNotFound:
      return "NotFound";
    case ErrType::kAlreadyExists:
      return "AlreadyExists";
    case ErrType::kNoResources:
      return "NoResources";
    case ErrType::kInput:
      return "Input";
    case ErrType::kOptimizedOut:
      return "OptimizedOut";
    case ErrType::kUnsupported:
      return "Unsupported";
  }
}

unwinder::Error ErrToUnwinderError(const Err& err) {
  if (err.ok()) {
    return unwinder::Success();
  }

  return unwinder::Error(err.msg());
}
}  // namespace zxdb
