// Copyright 2020 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/native/CreatePipelineAsyncTask.h"

#include <utility>

#include "dawn/native/AsyncTask.h"
#include "dawn/native/ComputePipeline.h"
#include "dawn/native/Device.h"
#include "dawn/native/RenderPipeline.h"
#include "dawn/native/utils/WGPUHelpers.h"
#include "dawn/platform/DawnPlatform.h"
#include "dawn/platform/tracing/TraceEvent.h"

namespace dawn::native {

    CreatePipelineAsyncCallbackTaskBase::CreatePipelineAsyncCallbackTaskBase(
        std::string errorMessage,
        void* userdata)
        : mErrorMessage(errorMessage), mUserData(userdata) {
    }

    CreateComputePipelineAsyncCallbackTask::CreateComputePipelineAsyncCallbackTask(
        Ref<ComputePipelineBase> pipeline,
        std::string errorMessage,
        WGPUCreateComputePipelineAsyncCallback callback,
        void* userdata)
        : CreatePipelineAsyncCallbackTaskBase(errorMessage, userdata),
          mPipeline(std::move(pipeline)),
          mCreateComputePipelineAsyncCallback(callback) {
    }

    void CreateComputePipelineAsyncCallbackTask::Finish() {
        ASSERT(mCreateComputePipelineAsyncCallback != nullptr);

        if (mPipeline.Get() != nullptr) {
            mCreateComputePipelineAsyncCallback(WGPUCreatePipelineAsyncStatus_Success,
                                                ToAPI(mPipeline.Detach()), "", mUserData);
        } else {
            mCreateComputePipelineAsyncCallback(WGPUCreatePipelineAsyncStatus_Error, nullptr,
                                                mErrorMessage.c_str(), mUserData);
        }
    }

    void CreateComputePipelineAsyncCallbackTask::HandleShutDown() {
        ASSERT(mCreateComputePipelineAsyncCallback != nullptr);

        mCreateComputePipelineAsyncCallback(WGPUCreatePipelineAsyncStatus_DeviceDestroyed, nullptr,
                                            "Device destroyed before callback", mUserData);
    }

    void CreateComputePipelineAsyncCallbackTask::HandleDeviceLoss() {
        ASSERT(mCreateComputePipelineAsyncCallback != nullptr);

        mCreateComputePipelineAsyncCallback(WGPUCreatePipelineAsyncStatus_DeviceLost, nullptr,
                                            "Device lost before callback", mUserData);
    }

    CreateRenderPipelineAsyncCallbackTask::CreateRenderPipelineAsyncCallbackTask(
        Ref<RenderPipelineBase> pipeline,
        std::string errorMessage,
        WGPUCreateRenderPipelineAsyncCallback callback,
        void* userdata)
        : CreatePipelineAsyncCallbackTaskBase(errorMessage, userdata),
          mPipeline(std::move(pipeline)),
          mCreateRenderPipelineAsyncCallback(callback) {
    }

    void CreateRenderPipelineAsyncCallbackTask::Finish() {
        ASSERT(mCreateRenderPipelineAsyncCallback != nullptr);

        if (mPipeline.Get() != nullptr) {
            mCreateRenderPipelineAsyncCallback(WGPUCreatePipelineAsyncStatus_Success,
                                               ToAPI(mPipeline.Detach()), "", mUserData);
        } else {
            mCreateRenderPipelineAsyncCallback(WGPUCreatePipelineAsyncStatus_Error, nullptr,
                                               mErrorMessage.c_str(), mUserData);
        }
    }

    void CreateRenderPipelineAsyncCallbackTask::HandleShutDown() {
        ASSERT(mCreateRenderPipelineAsyncCallback != nullptr);

        mCreateRenderPipelineAsyncCallback(WGPUCreatePipelineAsyncStatus_DeviceDestroyed, nullptr,
                                           "Device destroyed before callback", mUserData);
    }

    void CreateRenderPipelineAsyncCallbackTask::HandleDeviceLoss() {
        ASSERT(mCreateRenderPipelineAsyncCallback != nullptr);

        mCreateRenderPipelineAsyncCallback(WGPUCreatePipelineAsyncStatus_DeviceLost, nullptr,
                                           "Device lost before callback", mUserData);
    }

    CreateComputePipelineAsyncTask::CreateComputePipelineAsyncTask(
        Ref<ComputePipelineBase> nonInitializedComputePipeline,
        WGPUCreateComputePipelineAsyncCallback callback,
        void* userdata)
        : mComputePipeline(std::move(nonInitializedComputePipeline)),
          mCallback(callback),
          mUserdata(userdata) {
        ASSERT(mComputePipeline != nullptr);
    }

    void CreateComputePipelineAsyncTask::Run() {
        const char* eventLabel = utils::GetLabelForTrace(mComputePipeline->GetLabel().c_str());

        DeviceBase* device = mComputePipeline->GetDevice();
        TRACE_EVENT_FLOW_END1(device->GetPlatform(), General,
                              "CreateComputePipelineAsyncTask::RunAsync", this, "label",
                              eventLabel);
        TRACE_EVENT1(device->GetPlatform(), General, "CreateComputePipelineAsyncTask::Run", "label",
                     eventLabel);

        MaybeError maybeError = mComputePipeline->Initialize();
        std::string errorMessage;
        if (maybeError.IsError()) {
            mComputePipeline = nullptr;
            errorMessage = maybeError.AcquireError()->GetMessage();
        }

        device->AddComputePipelineAsyncCallbackTask(mComputePipeline, errorMessage, mCallback,
                                                    mUserdata);
    }

    void CreateComputePipelineAsyncTask::RunAsync(
        std::unique_ptr<CreateComputePipelineAsyncTask> task) {
        DeviceBase* device = task->mComputePipeline->GetDevice();

        const char* eventLabel =
            utils::GetLabelForTrace(task->mComputePipeline->GetLabel().c_str());

        // Using "taskPtr = std::move(task)" causes compilation error while it should be supported
        // since C++14:
        // https://docs.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp?view=msvc-160
        auto asyncTask = [taskPtr = task.release()] {
            std::unique_ptr<CreateComputePipelineAsyncTask> innnerTaskPtr(taskPtr);
            innnerTaskPtr->Run();
        };

        TRACE_EVENT_FLOW_BEGIN1(device->GetPlatform(), General,
                                "CreateComputePipelineAsyncTask::RunAsync", task.get(), "label",
                                eventLabel);
        device->GetAsyncTaskManager()->PostTask(std::move(asyncTask));
    }

    CreateRenderPipelineAsyncTask::CreateRenderPipelineAsyncTask(
        Ref<RenderPipelineBase> nonInitializedRenderPipeline,
        WGPUCreateRenderPipelineAsyncCallback callback,
        void* userdata)
        : mRenderPipeline(std::move(nonInitializedRenderPipeline)),
          mCallback(callback),
          mUserdata(userdata) {
        ASSERT(mRenderPipeline != nullptr);
    }

    void CreateRenderPipelineAsyncTask::Run() {
        const char* eventLabel = utils::GetLabelForTrace(mRenderPipeline->GetLabel().c_str());

        DeviceBase* device = mRenderPipeline->GetDevice();
        TRACE_EVENT_FLOW_END1(device->GetPlatform(), General,
                              "CreateRenderPipelineAsyncTask::RunAsync", this, "label", eventLabel);
        TRACE_EVENT1(device->GetPlatform(), General, "CreateRenderPipelineAsyncTask::Run", "label",
                     eventLabel);

        MaybeError maybeError = mRenderPipeline->Initialize();
        std::string errorMessage;
        if (maybeError.IsError()) {
            mRenderPipeline = nullptr;
            errorMessage = maybeError.AcquireError()->GetMessage();
        }

        device->AddRenderPipelineAsyncCallbackTask(mRenderPipeline, errorMessage, mCallback,
                                                   mUserdata);
    }

    void CreateRenderPipelineAsyncTask::RunAsync(
        std::unique_ptr<CreateRenderPipelineAsyncTask> task) {
        DeviceBase* device = task->mRenderPipeline->GetDevice();

        const char* eventLabel = utils::GetLabelForTrace(task->mRenderPipeline->GetLabel().c_str());

        // Using "taskPtr = std::move(task)" causes compilation error while it should be supported
        // since C++14:
        // https://docs.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp?view=msvc-160
        auto asyncTask = [taskPtr = task.release()] {
            std::unique_ptr<CreateRenderPipelineAsyncTask> innerTaskPtr(taskPtr);
            innerTaskPtr->Run();
        };

        TRACE_EVENT_FLOW_BEGIN1(device->GetPlatform(), General,
                                "CreateRenderPipelineAsyncTask::RunAsync", task.get(), "label",
                                eventLabel);
        device->GetAsyncTaskManager()->PostTask(std::move(asyncTask));
    }
}  // namespace dawn::native
