// Copyright 2015 The Chromium 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 "components/update_client/task_update.h"

#include <utility>

#include "base/bind.h"
#include "base/location.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/update_client/update_client.h"
#include "components/update_client/update_engine.h"

namespace update_client {

TaskUpdate::TaskUpdate(scoped_refptr<UpdateEngine> update_engine,
                       bool is_foreground,
                       const std::vector<std::string>& ids,
                       UpdateClient::CrxDataCallback crx_data_callback,
                       Callback callback)
    : update_engine_(update_engine),
      is_foreground_(is_foreground),
      ids_(ids),
      crx_data_callback_(std::move(crx_data_callback)),
      callback_(std::move(callback))
#if defined(STARBOARD)
      , is_completed_(false)
#endif
{
#if defined(STARBOARD)
    LOG(INFO) << "TaskUpdate::TaskUpdate";
#endif
}

TaskUpdate::~TaskUpdate() {
  DCHECK(thread_checker_.CalledOnValidThread());
#if defined(STARBOARD)
  LOG(INFO) << "TaskUpdate::~TaskUpdate";
#endif
}

void TaskUpdate::Run() {
  DCHECK(thread_checker_.CalledOnValidThread());
#if defined(STARBOARD)
  LOG(INFO) << "TaskUpdate::Run begin";
#endif

  if (ids_.empty()) {
    TaskComplete(Error::INVALID_ARGUMENT);
    return;
  }

#if defined(STARBOARD)
  update_engine_->Update(is_foreground_, ids_, std::move(crx_data_callback_),
                         base::BindOnce(&TaskUpdate::TaskComplete, this),
                         cancelation_closure_);
  LOG(INFO) << "TaskUpdate::Run end";
#else
  update_engine_->Update(is_foreground_, ids_, std::move(crx_data_callback_),
                         base::BindOnce(&TaskUpdate::TaskComplete, this));
#endif

}

void TaskUpdate::Cancel() {
  DCHECK(thread_checker_.CalledOnValidThread());

#if defined(STARBOARD)
  LOG(INFO) << "TaskUpdate::Cancel";
  if (cancelation_closure_) {  // The engine's picked up the task.
    std::move(cancelation_closure_).Run();
  }
#endif

  TaskComplete(Error::UPDATE_CANCELED);
}

std::vector<std::string> TaskUpdate::GetIds() const {
  return ids_;
}

void TaskUpdate::TaskComplete(Error error) {
  DCHECK(thread_checker_.CalledOnValidThread());
#if defined(STARBOARD)
  LOG(INFO) << "TaskUpdate::TaskComplete";

  // The callback is defined as OnceCallback and should not
  // be called multiple times.
  if(is_completed_) {
    LOG(INFO) << "TaskUpdate::TaskComplete already called";
    return;
  }

  is_completed_ = true;
#endif

  base::ThreadTaskRunnerHandle::Get()->PostTask(
      FROM_HERE, base::BindOnce(std::move(callback_),
                                scoped_refptr<TaskUpdate>(this), error));
}

}  // namespace update_client
