// 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.

#ifndef COMPONENTS_UPDATE_CLIENT_UPDATE_CLIENT_INTERNAL_H_
#define COMPONENTS_UPDATE_CLIENT_UPDATE_CLIENT_INTERNAL_H_

#include <memory>
#include <set>
#include <string>
#include <vector>

#include "base/containers/circular_deque.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list.h"
#include "base/sequence_checker.h"
#include "components/update_client/crx_downloader.h"
#include "components/update_client/update_checker.h"
#include "components/update_client/update_client.h"

namespace update_client {

class Configurator;
class PingManager;
class Task;
class UpdateEngine;
enum class Error;

class UpdateClientImpl : public UpdateClient {
 public:
  UpdateClientImpl(scoped_refptr<Configurator> config,
                   scoped_refptr<PingManager> ping_manager,
                   UpdateChecker::Factory update_checker_factory,
                   CrxDownloader::Factory crx_downloader_factory);

  // Overrides for UpdateClient.
  void AddObserver(Observer* observer) override;
  void RemoveObserver(Observer* observer) override;
  void Install(const std::string& id,
               CrxDataCallback crx_data_callback,
               Callback callback) override;
  void Update(const std::vector<std::string>& ids,
              CrxDataCallback crx_data_callback,
              bool is_foreground,
              Callback callback) override;
  bool GetCrxUpdateState(const std::string& id,
                         CrxUpdateItem* update_item) const override;
  bool IsUpdating(const std::string& id) const override;
  void Stop() override;
  void SendUninstallPing(const std::string& id,
                         const base::Version& version,
                         int reason,
                         Callback callback) override;

 private:
  ~UpdateClientImpl() override;

  void RunTask(scoped_refptr<Task> task);
  void OnTaskComplete(Callback callback, scoped_refptr<Task> task, Error error);

  void NotifyObservers(Observer::Events event, const std::string& id);

  SEQUENCE_CHECKER(sequence_checker_);

  // True if Stop method has been called.
  bool is_stopped_ = false;

  scoped_refptr<Configurator> config_;

  // Contains the tasks that are pending. In the current implementation,
  // only update tasks (background tasks) are queued up. These tasks are
  // pending while they are in this queue. They have not been picked up yet
  // by the update engine.
  base::circular_deque<scoped_refptr<Task>> task_queue_;

  // Contains all tasks in progress. These are the tasks that the update engine
  // is executing at one moment. Install tasks are run concurrently, update
  // tasks are always serialized, and update tasks are queued up if install
  // tasks are running. In addition, concurrent install tasks for the same id
  // are not allowed.
  std::set<scoped_refptr<Task>> tasks_;
  scoped_refptr<PingManager> ping_manager_;
  scoped_refptr<UpdateEngine> update_engine_;
  base::ObserverList<Observer>::Unchecked observer_list_;

  DISALLOW_COPY_AND_ASSIGN(UpdateClientImpl);
};

}  // namespace update_client

#endif  // COMPONENTS_UPDATE_CLIENT_UPDATE_CLIENT_INTERNAL_H_
