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

#include "extensions/browser/preload_check_group.h"

#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/ref_counted.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/common/extension.h"

namespace extensions {

PreloadCheckGroup::PreloadCheckGroup() : PreloadCheck(nullptr) {}

PreloadCheckGroup::~PreloadCheckGroup() = default;

void PreloadCheckGroup::AddCheck(PreloadCheck* check) {
  DCHECK_EQ(0, running_checks_);
  checks_.push_back(check);
}

void PreloadCheckGroup::Start(ResultCallback callback) {
  DCHECK(thread_checker_.CalledOnValidThread());
  DCHECK_EQ(0, running_checks_);

  callback_ = std::move(callback);
  running_checks_ = checks_.size();
  for (extensions::PreloadCheck* check : checks_) {
    check->Start(base::BindOnce(&PreloadCheckGroup::OnCheckComplete,
                                weak_ptr_factory_.GetWeakPtr()));
    // Synchronous checks may fail immediately.
    if (running_checks_ == 0) {
      return;
    }
  }
}

void PreloadCheckGroup::OnCheckComplete(const Errors& errors) {
  DCHECK(thread_checker_.CalledOnValidThread());
  errors_.insert(errors.begin(), errors.end());
  running_checks_--;
  MaybeInvokeCallback();
}

void PreloadCheckGroup::MaybeInvokeCallback() {
  // Only invoke callback if all checks are complete, or if there was at least
  // one failure and |stop_on_first_error_| is true.
  if (running_checks_ > 0 && (errors_.empty() || !stop_on_first_error_)) {
    return;
  }

  // If we are failing fast, discard any pending results.
  weak_ptr_factory_.InvalidateWeakPtrs();
  running_checks_ = 0;

  DCHECK(callback_);
  // Ensure callback is called asynchronously
  content::GetUIThreadTaskRunner()->PostTask(
      FROM_HERE, base::BindOnce(std::move(callback_), errors_));
}

}  // namespace extensions
