// 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 <atomic>

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

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

namespace {
void DefaultLogUnhandledException(Dart_Handle, Dart_Handle) {}
std::atomic<DartError::UnhandledExceptionReporter> log_unhandled_exception =
    DefaultLogUnhandledException;

void ReportUnhandledException(Dart_Handle exception_handle,
                              Dart_Handle stack_trace_handle) {
  log_unhandled_exception.load()(exception_handle, stack_trace_handle);
}
}  // namespace

void SetUnhandledExceptionReporter(
    DartError::UnhandledExceptionReporter reporter) {
  log_unhandled_exception.store(reporter);
}

bool CheckAndHandleError(Dart_Handle handle) {
  // Specifically handle UnhandledExceptionErrors first. These exclude fatal
  // errors that are shutting down the vm and compilation errors in source code.
  if (Dart_IsUnhandledExceptionError(handle)) {
    Dart_Handle exception_handle = Dart_ErrorGetException(handle);
    Dart_Handle stack_trace_handle = Dart_ErrorGetStackTrace(handle);

    ReportUnhandledException(exception_handle, stack_trace_handle);
    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
