// Copyright 2019 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 DAWNWIRE_SERVER_SERVER_H_
#define DAWNWIRE_SERVER_SERVER_H_

#include "dawn_wire/ChunkedCommandSerializer.h"
#include "dawn_wire/server/ServerBase_autogen.h"

namespace dawn_wire::server {

    class Server;
    class MemoryTransferService;

    // CallbackUserdata and its derived classes are intended to be created by
    // Server::MakeUserdata<T> and then passed as the userdata argument for Dawn
    // callbacks.
    // It contains a pointer back to the Server so that the callback can call the
    // Server to perform operations like serialization, and it contains a weak pointer
    // |serverIsAlive|. If the weak pointer has expired, it means the server has
    // been destroyed and the callback must not use the Server pointer.
    // To assist with checking |serverIsAlive| and lifetime management of the userdata,
    // |ForwardToServer| (defined later in this file) can be used to acquire the userdata,
    // return early if |serverIsAlive| has expired, and then forward the arguments
    // to userdata->server->MyCallbackHandler.
    //
    // Example Usage:
    //
    // struct MyUserdata : CallbackUserdata { uint32_t foo; };
    //
    // auto userdata = MakeUserdata<MyUserdata>();
    // userdata->foo = 2;
    //
    // callMyCallbackHandler(
    //      ForwardToServer<&Server::MyCallbackHandler>,
    //      userdata.release());
    //
    // void Server::MyCallbackHandler(MyUserdata* userdata, Other args) { }
    struct CallbackUserdata {
        Server* const server;
        std::weak_ptr<bool> const serverIsAlive;

        CallbackUserdata() = delete;
        CallbackUserdata(Server* server, const std::shared_ptr<bool>& serverIsAlive)
            : server(server), serverIsAlive(serverIsAlive) {
        }
    };

    template <auto F>
    struct ForwardToServerHelper {
        template <typename _>
        struct ExtractedTypes;

        // An internal structure used to unpack the various types that compose the type of F
        template <typename Return, typename Class, typename Userdata, typename... Args>
        struct ExtractedTypes<Return (Class::*)(Userdata*, Args...)> {
            using UntypedCallback = Return (*)(Args..., void*);
            static Return Callback(Args... args, void* userdata) {
                // Acquire the userdata, and cast it to UserdataT.
                std::unique_ptr<Userdata> data(static_cast<Userdata*>(userdata));
                if (data->serverIsAlive.expired()) {
                    // Do nothing if the server has already been destroyed.
                    return;
                }
                // Forward the arguments and the typed userdata to the Server:: member function.
                (data->server->*F)(data.get(), std::forward<decltype(args)>(args)...);
            }
        };

        static constexpr typename ExtractedTypes<decltype(F)>::UntypedCallback Create() {
            return ExtractedTypes<decltype(F)>::Callback;
        }
    };

    template <auto F>
    constexpr auto ForwardToServer = ForwardToServerHelper<F>::Create();

    struct MapUserdata : CallbackUserdata {
        using CallbackUserdata::CallbackUserdata;

        ObjectHandle buffer;
        WGPUBuffer bufferObj;
        uint64_t requestSerial;
        uint64_t offset;
        uint64_t size;
        WGPUMapModeFlags mode;
    };

    struct ErrorScopeUserdata : CallbackUserdata {
        using CallbackUserdata::CallbackUserdata;

        ObjectHandle device;
        uint64_t requestSerial;
    };

    struct ShaderModuleGetCompilationInfoUserdata : CallbackUserdata {
        using CallbackUserdata::CallbackUserdata;

        ObjectHandle shaderModule;
        uint64_t requestSerial;
    };

    struct QueueWorkDoneUserdata : CallbackUserdata {
        using CallbackUserdata::CallbackUserdata;

        ObjectHandle queue;
        uint64_t requestSerial;
    };

    struct CreatePipelineAsyncUserData : CallbackUserdata {
        using CallbackUserdata::CallbackUserdata;

        ObjectHandle device;
        uint64_t requestSerial;
        ObjectId pipelineObjectID;
    };

    struct RequestAdapterUserdata : CallbackUserdata {
        using CallbackUserdata::CallbackUserdata;

        ObjectHandle instance;
        uint64_t requestSerial;
        ObjectId adapterObjectId;
    };

    struct RequestDeviceUserdata : CallbackUserdata {
        using CallbackUserdata::CallbackUserdata;

        ObjectHandle adapter;
        uint64_t requestSerial;
        ObjectId deviceObjectId;
    };

    class Server : public ServerBase {
      public:
        Server(const DawnProcTable& procs,
               CommandSerializer* serializer,
               MemoryTransferService* memoryTransferService);
        ~Server() override;

        // ChunkedCommandHandler implementation
        const volatile char* HandleCommandsImpl(const volatile char* commands,
                                                size_t size) override;

        bool InjectTexture(WGPUTexture texture,
                           uint32_t id,
                           uint32_t generation,
                           uint32_t deviceId,
                           uint32_t deviceGeneration);

        bool InjectSwapChain(WGPUSwapChain swapchain,
                             uint32_t id,
                             uint32_t generation,
                             uint32_t deviceId,
                             uint32_t deviceGeneration);

        bool InjectDevice(WGPUDevice device, uint32_t id, uint32_t generation);

        bool InjectInstance(WGPUInstance instance, uint32_t id, uint32_t generation);

        WGPUDevice GetDevice(uint32_t id, uint32_t generation);

        template <typename T,
                  typename Enable = std::enable_if<std::is_base_of<CallbackUserdata, T>::value>>
        std::unique_ptr<T> MakeUserdata() {
            return std::unique_ptr<T>(new T(this, mIsAlive));
        }

      private:
        template <typename Cmd>
        void SerializeCommand(const Cmd& cmd) {
            mSerializer.SerializeCommand(cmd);
        }

        template <typename Cmd, typename ExtraSizeSerializeFn>
        void SerializeCommand(const Cmd& cmd,
                              size_t extraSize,
                              ExtraSizeSerializeFn&& SerializeExtraSize) {
            mSerializer.SerializeCommand(cmd, extraSize, SerializeExtraSize);
        }

        void SetForwardingDeviceCallbacks(ObjectData<WGPUDevice>* deviceObject);
        void ClearDeviceCallbacks(WGPUDevice device);

        // Error callbacks
        void OnUncapturedError(ObjectHandle device, WGPUErrorType type, const char* message);
        void OnDeviceLost(ObjectHandle device, WGPUDeviceLostReason reason, const char* message);
        void OnLogging(ObjectHandle device, WGPULoggingType type, const char* message);
        void OnDevicePopErrorScope(ErrorScopeUserdata* userdata,
                                   WGPUErrorType type,
                                   const char* message);
        void OnBufferMapAsyncCallback(MapUserdata* userdata, WGPUBufferMapAsyncStatus status);
        void OnQueueWorkDone(QueueWorkDoneUserdata* userdata, WGPUQueueWorkDoneStatus status);
        void OnCreateComputePipelineAsyncCallback(CreatePipelineAsyncUserData* userdata,
                                                  WGPUCreatePipelineAsyncStatus status,
                                                  WGPUComputePipeline pipeline,
                                                  const char* message);
        void OnCreateRenderPipelineAsyncCallback(CreatePipelineAsyncUserData* userdata,
                                                 WGPUCreatePipelineAsyncStatus status,
                                                 WGPURenderPipeline pipeline,
                                                 const char* message);
        void OnShaderModuleGetCompilationInfo(ShaderModuleGetCompilationInfoUserdata* userdata,
                                              WGPUCompilationInfoRequestStatus status,
                                              const WGPUCompilationInfo* info);
        void OnRequestAdapterCallback(RequestAdapterUserdata* userdata,
                                      WGPURequestAdapterStatus status,
                                      WGPUAdapter adapter,
                                      const char* message);
        void OnRequestDeviceCallback(RequestDeviceUserdata* userdata,
                                     WGPURequestDeviceStatus status,
                                     WGPUDevice device,
                                     const char* message);

#include "dawn_wire/server/ServerPrototypes_autogen.inc"

        WireDeserializeAllocator mAllocator;
        ChunkedCommandSerializer mSerializer;
        DawnProcTable mProcs;
        std::unique_ptr<MemoryTransferService> mOwnedMemoryTransferService = nullptr;
        MemoryTransferService* mMemoryTransferService = nullptr;

        std::shared_ptr<bool> mIsAlive;
    };

    bool TrackDeviceChild(DeviceInfo* device, ObjectType type, ObjectId id);
    bool UntrackDeviceChild(DeviceInfo* device, ObjectType type, ObjectId id);

    std::unique_ptr<MemoryTransferService> CreateInlineMemoryTransferService();

}  // namespace dawn_wire::server

#endif  // DAWNWIRE_SERVER_SERVER_H_
