// 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 "dawn/dawn_proc.h"
#include "src/dawn_node/binding/Flags.h"
#include "src/dawn_node/binding/GPU.h"

namespace {
    Napi::Value CreateGPU(const Napi::CallbackInfo& info) {
        const auto& env = info.Env();

        std::tuple<std::vector<std::string>> args;
        auto res = wgpu::interop::FromJS(info, args);
        if (res != wgpu::interop::Success) {
            Napi::Error::New(env, res.error).ThrowAsJavaScriptException();
            return env.Undefined();
        }

        wgpu::binding::Flags flags;

        // Parse out the key=value flags out of the input args array
        for (const auto& arg : std::get<0>(args)) {
            const size_t sep_index = arg.find("=");
            if (sep_index == std::string::npos) {
                Napi::Error::New(env, "Flags expected argument format is <key>=<value>")
                    .ThrowAsJavaScriptException();
                return env.Undefined();
            }
            flags.Set(arg.substr(0, sep_index), arg.substr(sep_index + 1));
        }

        // Construct a wgpu::interop::GPU interface, implemented by wgpu::bindings::GPU.
        return wgpu::interop::GPU::Create<wgpu::binding::GPU>(env, std::move(flags));
    }

}  // namespace

// Initialize() initializes the Dawn node module, registering all the WebGPU
// types into the global object, and adding the 'create' function on the exported
// object.
Napi::Object Initialize(Napi::Env env, Napi::Object exports) {
    // Begin by setting the Dawn procedure function pointers.
    dawnProcSetProcs(&dawn_native::GetProcs());

    // Register all the interop types
    wgpu::interop::Initialize(env);

    // Export function that creates and returns the wgpu::interop::GPU interface
    exports.Set(Napi::String::New(env, "create"), Napi::Function::New<CreateGPU>(env));

    return exports;
}

NODE_API_MODULE(addon, Initialize)
