// Copyright 2019 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#ifndef SRC_DAWN_NATIVE_ERRORSCOPE_H_
#define SRC_DAWN_NATIVE_ERRORSCOPE_H_

#include <set>
#include <string>
#include <vector>

#include "dawn/native/AsyncTask.h"
#include "dawn/native/dawn_platform.h"

namespace dawn::native {

// An async task that may write to an error scope.
struct ErrorScopePendingAsyncTask {
    Ref<ErrorGeneratingAsyncTask> task;

    // The type of error that should be captured by the task. If the error generated by the
    // task does not match, it should be ignored.
    // An error type of Unknown implies that the task is blocking completion of an error scope but
    // the error should not be captured. An async task can write to different error scopes depending
    // on the type of error generated.
    wgpu::ErrorType captureErrorType;
};

class ErrorScope {
  public:
    ErrorScope(wgpu::ErrorType error, std::string_view message);

    wgpu::ErrorType GetErrorType() const;
    WGPUStringView GetErrorMessage() const;

    void CaptureError(wgpu::ErrorType type, std::string_view message);

    // This error scope may not be resolved until async tasks have completed.
    size_t GetPendingAsyncTaskCount() const { return mAsyncTasks.size(); }
    std::vector<ErrorScopePendingAsyncTask> AcquirePendingAsyncTasks();

  private:
    friend class ErrorScopeStack;
    explicit ErrorScope(wgpu::ErrorFilter errorFilter);

    wgpu::ErrorType mMatchedErrorType;
    wgpu::ErrorType mCapturedError = wgpu::ErrorType::NoError;
    std::string mErrorMessage = "";

    // Pending async tasks that may want to capture their errors in this scope.
    // Since the task can generate any kind of error, it may be matched with multiple error scopes.
    std::vector<ErrorScopePendingAsyncTask> mAsyncTasks;
};

class ErrorScopeStack {
  public:
    ErrorScopeStack();
    ~ErrorScopeStack();

    void Push(wgpu::ErrorFilter errorFilter);
    ErrorScope Pop();

    bool Empty() const;

    // Get the scope that a given error type should be written to. Returns a reference to an error
    // scope on the stack that is only valid until the next Push/Pop.
    ErrorScope* GetErrorScopeForErrorType(wgpu::ErrorType type);

    // Pass an error to the scopes in the stack. Returns true if one of the scopes
    // captured the error. Returns false if the error should be forwarded to the
    // uncaptured error callback.
    bool HandleError(wgpu::ErrorType type, std::string_view message);

    // Pass an async task to the scopes on the stack.
    // Returns the error types that will be captured by this error scope stack, any other errors
    // generated by the task should be forwarded to the uncaptured error callback.
    std::set<wgpu::ErrorType> HandleErrorGeneratingAsyncTask(Ref<ErrorGeneratingAsyncTask> task);

  private:
    bool HandleErrorGeneratingAsyncTaskErrorType(wgpu::ErrorType type,
                                                 Ref<ErrorGeneratingAsyncTask> task);

    std::vector<ErrorScope> mScopes;
};

}  // namespace dawn::native

#endif  // SRC_DAWN_NATIVE_ERRORSCOPE_H_
