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

#ifndef CHROME_UPDATER_CONFIGURATOR_H_
#define CHROME_UPDATER_CONFIGURATOR_H_

#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <vector>

#include "base/containers/flat_map.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "chrome/updater/event_logger.h"
#include "components/update_client/configurator.h"

class GURL;
class PrefService;

namespace base {
class Version;
}  // namespace base

namespace crx_file {
enum class VerifierFormat;
}

namespace update_client {
class NetworkFetcherFactory;
class CrxCache;
class CrxDownloaderFactory;
class ProtocolHandlerFactory;
}  // namespace update_client

namespace updater {

class ExternalConstants;
class PersistedData;
class PolicyService;
class UpdaterPrefs;
enum class UpdaterScope;

class Configurator : public update_client::Configurator {
 public:
  Configurator(scoped_refptr<UpdaterPrefs> prefs,
               scoped_refptr<ExternalConstants> external_constants,
               UpdaterScope scope);
  Configurator(const Configurator&) = delete;
  Configurator& operator=(const Configurator&) = delete;

  // Overrides for update_client::Configurator.
  base::TimeDelta InitialDelay() const override;
  base::TimeDelta NextCheckDelay() const override;
  base::TimeDelta OnDemandDelay() const override;
  base::TimeDelta UpdateDelay() const override;
  std::vector<GURL> UpdateUrl() const override;
  std::vector<GURL> PingUrl() const override;
  std::string GetProdId() const override;
  base::Version GetBrowserVersion() const override;
  std::string GetChannel() const override;
  std::string GetLang() const override;
  std::string GetOSLongName() const override;
  base::flat_map<std::string, std::string> ExtraRequestParams() const override;
  std::string GetDownloadPreference() const override;
  scoped_refptr<update_client::NetworkFetcherFactory> GetNetworkFetcherFactory()
      override;
  scoped_refptr<update_client::CrxDownloaderFactory> GetCrxDownloaderFactory()
      override;
  scoped_refptr<update_client::UnzipperFactory> GetUnzipperFactory() override;
  scoped_refptr<update_client::PatcherFactory> GetPatcherFactory() override;
  bool EnabledBackgroundDownloader() const override;
  bool EnabledCupSigning() const override;
  PrefService* GetPrefService() const override;
  update_client::PersistedData* GetPersistedData() const override;
  bool IsPerUserInstall() const override;
  std::unique_ptr<update_client::ProtocolHandlerFactory>
  GetProtocolHandlerFactory() const override;
  std::optional<bool> IsMachineExternallyManaged() const override;
  update_client::UpdaterStateProvider GetUpdaterStateProvider() const override;
  scoped_refptr<update_client::CrxCache> GetCrxCache() const override;
  bool IsConnectionMetered() const override;

  scoped_refptr<PersistedData> GetUpdaterPersistedData() const;
  scoped_refptr<UpdaterEventLogger> GetEventLogger() const;
  virtual GURL CrashUploadURL() const;

  base::TimeDelta ServerKeepAliveTime() const;
  scoped_refptr<PolicyService> GetPolicyService() const;
  crx_file::VerifierFormat GetCrxVerifierFormat() const;
  std::optional<std::vector<uint8_t>> GetCrxPublicKeyHash() const;
  base::TimeDelta MinimumEventLoggingCooldown() const;

 private:
  friend class base::RefCountedThreadSafe<Configurator>;
  ~Configurator() override;

  SEQUENCE_CHECKER(sequence_checker_);
  scoped_refptr<UpdaterPrefs> prefs_;
  scoped_refptr<ExternalConstants> external_constants_;
  scoped_refptr<PersistedData> persisted_data_;
  scoped_refptr<PolicyService> policy_service_;
  scoped_refptr<update_client::NetworkFetcherFactory> network_fetcher_factory_;
  scoped_refptr<update_client::CrxDownloaderFactory> crx_downloader_factory_;
  scoped_refptr<update_client::UnzipperFactory> unzip_factory_;
  scoped_refptr<update_client::PatcherFactory> patch_factory_;
  scoped_refptr<update_client::CrxCache> crx_cache_;
  scoped_refptr<UpdaterEventLogger> event_logger_;
  const std::optional<bool> is_managed_device_;
};

}  // namespace updater

#endif  // CHROME_UPDATER_CONFIGURATOR_H_
