// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "missive/scheduler/enqueue_job.h"

#include <memory>
#include <string>
#include <utility>

#include <base/strings/strcat.h>
#include <base/strings/string_number_conversions.h>

#include "missive/proto/interface.pb.h"
#include "missive/scheduler/scheduler.h"
#include "missive/storage/storage_module_interface.h"
#include "missive/util/status.h"

namespace reporting {

EnqueueJob::EnqueueResponseDelegate::EnqueueResponseDelegate(
    std::unique_ptr<
        brillo::dbus_utils::DBusMethodResponse<EnqueueRecordResponse>> response)
    : response_(std::move(response)) {
  DCHECK(response_);
}

Status EnqueueJob::EnqueueResponseDelegate::Complete() {
  return SendResponse(Status::StatusOK());
}

Status EnqueueJob::EnqueueResponseDelegate::Cancel(Status status) {
  return SendResponse(status);
}

Status EnqueueJob::EnqueueResponseDelegate::SendResponse(Status status) {
  if (response_->IsResponseSent()) {
    return Status(error::INTERNAL, "Response has already been sent");
  }
  EnqueueRecordResponse response_body;
  status.SaveTo(response_body.mutable_status());
  response_->Return(response_body);
  return Status::StatusOK();
}

EnqueueJob::EnqueueJob(scoped_refptr<StorageModuleInterface> storage_module,
                       EnqueueRecordRequest request,
                       std::unique_ptr<EnqueueResponseDelegate> delegate)
    : Job(std::move(delegate)),
      storage_module_(storage_module),
      request_(std::move(request)) {}

void EnqueueJob::StartImpl() {
  storage_module_->AddRecord(
      request_.priority(), std::move(request_.record()),
      base::BindOnce(&EnqueueJob::Finish, base::Unretained(this)));
}

}  // namespace reporting
