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

#include "src/dawn_node/binding/GPURenderPassEncoder.h"

#include "src/dawn_node/binding/Converter.h"
#include "src/dawn_node/binding/GPUBindGroup.h"
#include "src/dawn_node/binding/GPUBuffer.h"
#include "src/dawn_node/binding/GPUQuerySet.h"
#include "src/dawn_node/binding/GPURenderBundle.h"
#include "src/dawn_node/binding/GPURenderPipeline.h"
#include "src/dawn_node/utils/Debug.h"

namespace wgpu::binding {

    ////////////////////////////////////////////////////////////////////////////////
    // wgpu::bindings::GPURenderPassEncoder
    ////////////////////////////////////////////////////////////////////////////////
    GPURenderPassEncoder::GPURenderPassEncoder(wgpu::RenderPassEncoder enc) : enc_(std::move(enc)) {
    }

    void GPURenderPassEncoder::setViewport(Napi::Env,
                                           float x,
                                           float y,
                                           float width,
                                           float height,
                                           float minDepth,
                                           float maxDepth) {
        enc_.SetViewport(x, y, width, height, minDepth, maxDepth);
    }

    void GPURenderPassEncoder::setScissorRect(Napi::Env,
                                              interop::GPUIntegerCoordinate x,
                                              interop::GPUIntegerCoordinate y,
                                              interop::GPUIntegerCoordinate width,
                                              interop::GPUIntegerCoordinate height) {
        enc_.SetScissorRect(x, y, width, height);
    }

    void GPURenderPassEncoder::setBlendConstant(Napi::Env env, interop::GPUColor color) {
        Converter conv(env);

        wgpu::Color c{};
        if (!conv(c, color)) {
            return;
        }

        enc_.SetBlendConstant(&c);
    }

    void GPURenderPassEncoder::setStencilReference(Napi::Env, interop::GPUStencilValue reference) {
        enc_.SetStencilReference(reference);
    }

    void GPURenderPassEncoder::beginOcclusionQuery(Napi::Env, interop::GPUSize32 queryIndex) {
        enc_.BeginOcclusionQuery(queryIndex);
    }

    void GPURenderPassEncoder::endOcclusionQuery(Napi::Env) {
        enc_.EndOcclusionQuery();
    }

    void GPURenderPassEncoder::executeBundles(
        Napi::Env env,
        std::vector<interop::Interface<interop::GPURenderBundle>> bundles_in) {
        Converter conv(env);

        wgpu::RenderBundle* bundles = nullptr;
        uint32_t bundleCount = 0;
        if (!conv(bundles, bundleCount, bundles_in)) {
            return;
        }

        enc_.ExecuteBundles(bundleCount, bundles);
    }

    void GPURenderPassEncoder::endPass(Napi::Env) {
        enc_.EndPass();
    }

    void GPURenderPassEncoder::setBindGroup(
        Napi::Env env,
        interop::GPUIndex32 index,
        interop::Interface<interop::GPUBindGroup> bindGroup,
        std::vector<interop::GPUBufferDynamicOffset> dynamicOffsets) {
        Converter conv(env);

        wgpu::BindGroup bg{};
        uint32_t* offsets = nullptr;
        uint32_t num_offsets = 0;
        if (!conv(bg, bindGroup) || !conv(offsets, num_offsets, dynamicOffsets)) {
            return;
        }

        enc_.SetBindGroup(index, bg, num_offsets, offsets);
    }

    void GPURenderPassEncoder::setBindGroup(Napi::Env env,
                                            interop::GPUIndex32 index,
                                            interop::Interface<interop::GPUBindGroup> bindGroup,
                                            interop::Uint32Array dynamicOffsetsData,
                                            interop::GPUSize64 dynamicOffsetsDataStart,
                                            interop::GPUSize32 dynamicOffsetsDataLength) {
        Converter conv(env);

        wgpu::BindGroup bg{};
        if (!conv(bg, bindGroup)) {
            return;
        }

        enc_.SetBindGroup(index, bg, dynamicOffsetsDataLength,
                          dynamicOffsetsData.Data() + dynamicOffsetsDataStart);
    }

    void GPURenderPassEncoder::pushDebugGroup(Napi::Env, std::string groupLabel) {
        enc_.PushDebugGroup(groupLabel.c_str());
    }

    void GPURenderPassEncoder::popDebugGroup(Napi::Env) {
        enc_.PopDebugGroup();
    }

    void GPURenderPassEncoder::insertDebugMarker(Napi::Env, std::string markerLabel) {
        enc_.InsertDebugMarker(markerLabel.c_str());
    }

    void GPURenderPassEncoder::setPipeline(
        Napi::Env env,
        interop::Interface<interop::GPURenderPipeline> pipeline) {
        Converter conv(env);
        wgpu::RenderPipeline rp{};
        if (!conv(rp, pipeline)) {
            return;
        }
        enc_.SetPipeline(rp);
    }

    void GPURenderPassEncoder::setIndexBuffer(Napi::Env env,
                                              interop::Interface<interop::GPUBuffer> buffer,
                                              interop::GPUIndexFormat indexFormat,
                                              interop::GPUSize64 offset,
                                              std::optional<interop::GPUSize64> size) {
        Converter conv(env);

        wgpu::Buffer b{};
        wgpu::IndexFormat f;
        uint64_t s = wgpu::kWholeSize;
        if (!conv(b, buffer) ||       //
            !conv(f, indexFormat) ||  //
            !conv(s, size)) {
            return;
        }
        enc_.SetIndexBuffer(b, f, offset, s);
    }

    void GPURenderPassEncoder::setVertexBuffer(Napi::Env env,
                                               interop::GPUIndex32 slot,
                                               interop::Interface<interop::GPUBuffer> buffer,
                                               interop::GPUSize64 offset,
                                               std::optional<interop::GPUSize64> size) {
        Converter conv(env);

        wgpu::Buffer b{};
        uint64_t s = wgpu::kWholeSize;
        if (!conv(b, buffer) || !conv(s, size)) {
            return;
        }
        enc_.SetVertexBuffer(slot, b, offset, s);
    }

    void GPURenderPassEncoder::draw(Napi::Env env,
                                    interop::GPUSize32 vertexCount,
                                    interop::GPUSize32 instanceCount,
                                    interop::GPUSize32 firstVertex,
                                    interop::GPUSize32 firstInstance) {
        enc_.Draw(vertexCount, instanceCount, firstVertex, firstInstance);
    }

    void GPURenderPassEncoder::drawIndexed(Napi::Env env,
                                           interop::GPUSize32 indexCount,
                                           interop::GPUSize32 instanceCount,
                                           interop::GPUSize32 firstIndex,
                                           interop::GPUSignedOffset32 baseVertex,
                                           interop::GPUSize32 firstInstance) {
        enc_.DrawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance);
    }

    void GPURenderPassEncoder::drawIndirect(Napi::Env env,
                                            interop::Interface<interop::GPUBuffer> indirectBuffer,
                                            interop::GPUSize64 indirectOffset) {
        Converter conv(env);

        wgpu::Buffer b{};
        uint32_t o = 0;

        if (!conv(b, indirectBuffer) ||  //
            !conv(o, indirectOffset)) {
            return;
        }
        enc_.DrawIndirect(b, o);
    }

    void GPURenderPassEncoder::drawIndexedIndirect(
        Napi::Env env,
        interop::Interface<interop::GPUBuffer> indirectBuffer,
        interop::GPUSize64 indirectOffset) {
        Converter conv(env);

        wgpu::Buffer b{};
        uint32_t o = 0;

        if (!conv(b, indirectBuffer) ||  //
            !conv(o, indirectOffset)) {
            return;
        }
        enc_.DrawIndexedIndirect(b, o);
    }

    std::optional<std::string> GPURenderPassEncoder::getLabel(Napi::Env) {
        UNIMPLEMENTED();
    }

    void GPURenderPassEncoder::setLabel(Napi::Env, std::optional<std::string> value) {
        UNIMPLEMENTED();
    }

}  // namespace wgpu::binding
