//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include <detail/context_impl.hpp>
#include <detail/handler_impl.hpp>
#include <detail/offload/offload_utils.hpp>
#include <detail/queue_impl.hpp>
#include <sycl/__impl/handler.hpp>

_LIBSYCL_BEGIN_NAMESPACE_SYCL

static void checkCommandGroupFunction(
    const std::function<std::shared_ptr<detail::EventImpl>()> &CGF,
    detail::ContextImpl &Context) {
  if (CGF) {
    throw sycl::exception(
        detail::createSyclObjFromImpl<context>(Context),
        sycl::make_error_code(sycl::errc::invalid),
        "Attempt to set multiple actions for the command group");
  }
}

void handler::submitKernelImpl(detail::DeviceKernelInfo &KernelInfo,
                               void *ArgData, size_t ArgSize) {
  checkCommandGroupFunction(MImpl.MCGF, MImpl.MQueue.getContext());
  MImpl.MArgData.resize(ArgSize);
  std::memcpy(MImpl.MArgData.data(), ArgData, ArgSize);
  MImpl.MCGF = [this, &KernelInfo]() {
    auto EventsImpl = detail::getSyclObjImpls(MDepEvents);
    MImpl.MQueue.setKernelLaunchParams(std::move(EventsImpl), MImpl.MRange);
    MImpl.MQueue.submitKernelImpl(KernelInfo, MImpl.MArgData.data(),
                                  MImpl.MArgData.size());
    return MImpl.MQueue.getLastEvent();
  };
}

void handler::setKernelRange(const detail::UnifiedRangeView &Range) {
  MImpl.MRange = convertToOlRange(Range);
}

void handler::memcpy(void *dest, const void *src, std::size_t numBytes) {
  checkCommandGroupFunction(MImpl.MCGF, MImpl.MQueue.getContext());
  MImpl.MCGF = [this, dest, src, numBytes]() {
    return MImpl.MQueue.memcpy(dest, src, numBytes,
                               detail::getSyclObjImpls(MDepEvents));
  };
}

std::shared_ptr<detail::EventImpl> handler::finalize() {
  if (MImpl.MCGF)
    return MImpl.MCGF();

  auto EventsImpl = detail::getSyclObjImpls(MDepEvents);
  return MImpl.MQueue.submitWait(EventsImpl);
}

_LIBSYCL_END_NAMESPACE_SYCL
