// Copyright 2021 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SRC_DAWN_NODE_BINDING_GPUQUEUE_H_
#define SRC_DAWN_NODE_BINDING_GPUQUEUE_H_

#include <memory>
#include <string>
#include <vector>

#include "dawn/native/DawnNative.h"
#include "dawn/webgpu_cpp.h"
#include "src/dawn/node/binding/AsyncRunner.h"
#include "src/dawn/node/interop/Napi.h"
#include "src/dawn/node/interop/WebGPU.h"

namespace wgpu::binding {

// GPUQueue is an implementation of interop::GPUQueue that wraps a wgpu::Queue.
class GPUQueue final : public interop::GPUQueue {
  public:
    GPUQueue(wgpu::Queue queue, std::shared_ptr<AsyncRunner> async);

    // interop::GPUQueue interface compliance
    void submit(Napi::Env,
                std::vector<interop::Interface<interop::GPUCommandBuffer>> commandBuffers) override;
    interop::Promise<void> onSubmittedWorkDone(Napi::Env) override;
    void writeBuffer(Napi::Env,
                     interop::Interface<interop::GPUBuffer> buffer,
                     interop::GPUSize64 bufferOffset,
                     interop::BufferSource data,
                     interop::GPUSize64 dataOffset,
                     std::optional<interop::GPUSize64> size) override;
    void writeTexture(Napi::Env,
                      interop::GPUImageCopyTexture destination,
                      interop::BufferSource data,
                      interop::GPUImageDataLayout dataLayout,
                      interop::GPUExtent3D size) override;
    void copyExternalImageToTexture(Napi::Env,
                                    interop::GPUImageCopyExternalImage source,
                                    interop::GPUImageCopyTextureTagged destination,
                                    interop::GPUExtent3D copySize) override;
    std::variant<std::string, interop::UndefinedType> getLabel(Napi::Env) override;
    void setLabel(Napi::Env, std::variant<std::string, interop::UndefinedType> value) override;

  private:
    wgpu::Queue queue_;
    std::shared_ptr<AsyncRunner> async_;
};

}  // namespace wgpu::binding

#endif  // SRC_DAWN_NODE_BINDING_GPUQUEUE_H_
