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

#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::end(Napi::Env) {
    enc_.End();
}

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;
    }

    if (dynamicOffsetsDataStart > dynamicOffsetsData.ElementLength()) {
        Napi::RangeError::New(env, "dynamicOffsetsDataStart is out of bound of dynamicOffsetData")
            .ThrowAsJavaScriptException();
        return;
    }

    if (dynamicOffsetsDataLength > dynamicOffsetsData.ElementLength() - dynamicOffsetsDataStart) {
        Napi::RangeError::New(env,
                              "dynamicOffsetsDataLength + dynamicOffsetsDataStart is out of "
                              "bound of dynamicOffsetData")
            .ThrowAsJavaScriptException();
        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{};
    uint64_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{};
    uint64_t o = 0;

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

std::variant<std::string, interop::UndefinedType> GPURenderPassEncoder::getLabel(Napi::Env) {
    UNIMPLEMENTED();
}

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

}  // namespace wgpu::binding
