// Copyright 2013 The Flutter 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 "tonic/logging/dart_error.h"

#include "tonic/common/macros.h"
#include "tonic/converter/dart_converter.h"

namespace tonic {
namespace DartError {
const char kInvalidArgument[] = "Invalid argument.";
}  // namespace DartError

bool LogIfError(Dart_Handle handle) {
  if (Dart_IsUnhandledExceptionError(handle)) {
    Dart_Handle exception_handle = Dart_ErrorGetException(handle);
    const std::string exception =
        tonic::StdStringFromDart(Dart_ToString(exception_handle));
    Dart_Handle stack_trace_handle = Dart_ErrorGetStackTrace(handle);
    const std::string stack_trace =
        tonic::StdStringFromDart(Dart_ToString(stack_trace_handle));
    tonic::Log("Dart Unhandled Exception: %s, stack trace: %s",
               exception.c_str(), stack_trace.c_str());
    return true;
  } else if (Dart_IsError(handle)) {
    tonic::Log("Dart Error: %s", Dart_GetError(handle));
    return true;
  } else {
    return false;
  }
}

DartErrorHandleType GetErrorHandleType(Dart_Handle handle) {
  if (Dart_IsCompilationError(handle)) {
    return kCompilationErrorType;
  } else if (Dart_IsApiError(handle)) {
    return kApiErrorType;
  } else if (Dart_IsError(handle)) {
    return kUnknownErrorType;
  } else {
    return kNoError;
  }
}

int GetErrorExitCode(Dart_Handle handle) {
  if (Dart_IsCompilationError(handle)) {
    return 254;  // dart::bin::kCompilationErrorExitCode
  } else if (Dart_IsApiError(handle)) {
    return 253;  // dart::bin::kApiErrorExitCode
  } else if (Dart_IsError(handle)) {
    return 255;  // dart::bin::kErrorExitCode
  } else {
    return 0;
  }
}

}  // namespace tonic
