// Copyright 2014 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_CHECKER_H_
#define COMPONENTS_UPDATE_CLIENT_UPDATE_CHECKER_H_

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

#include "base/callback.h"
#include "base/containers/flat_map.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/optional.h"
#include "components/update_client/component.h"
#include "components/update_client/protocol_parser.h"
#include "url/gurl.h"

namespace update_client {

class Configurator;
class PersistedData;

class UpdateChecker {
 public:
  using UpdateCheckCallback = base::OnceCallback<void(
      const base::Optional<ProtocolParser::Results>& results,
      ErrorCategory error_category,
      int error,
      int retry_after_sec)>;

  using Factory =
      std::unique_ptr<UpdateChecker> (*)(scoped_refptr<Configurator> config,
                                         PersistedData* persistent);

  virtual ~UpdateChecker() = default;

  // Initiates an update check for the components specified by their ids.
  // |additional_attributes| provides a way to customize the <request> element.
  // |is_foreground| controls the value of "X-Goog-Update-Interactivity"
  // header which is sent with the update check.
  // On completion, the state of |components| is mutated as required by the
  // server response received.
  virtual void CheckForUpdates(
      const std::string& session_id,
      const std::vector<std::string>& ids_to_check,
      const IdToComponentPtrMap& components,
      const base::flat_map<std::string, std::string>& additional_attributes,
      bool enabled_component_updates,
      UpdateCheckCallback update_check_callback) = 0;

  static std::unique_ptr<UpdateChecker> Create(
      scoped_refptr<Configurator> config,
      PersistedData* persistent);

#if defined(OS_STARBOARD)
  virtual PersistedData* GetPersistedData() = 0;
#endif

 protected:
  UpdateChecker() = default;

 private:
  DISALLOW_COPY_AND_ASSIGN(UpdateChecker);
};

}  // namespace update_client

#endif  // COMPONENTS_UPDATE_CLIENT_UPDATE_CHECKER_H_
