// 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_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_
#define COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_

#include <memory>

#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"

class PrefService;
class PrefRegistrySimple;

namespace network {
class SharedURLLoaderFactory;
}

namespace user_prefs {
class PrefRegistrySyncable;
}

namespace gcm {

class GCMChannelStatusRequest;
class GCMDriver;

namespace prefs {
// The GCM channel's enabled state.
extern const char kGCMChannelStatus[];
}  // namepsace prefs

// Syncing with the server for GCM channel status that controls if GCM
// functionality should be enabled or disabled.
class GCMChannelStatusSyncer {
 public:
  static void RegisterPrefs(PrefRegistrySimple* registry);
  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);

  GCMChannelStatusSyncer(
      GCMDriver* driver,
      PrefService* prefs,
      const std::string& channel_status_request_url,
      const std::string& user_agent,
      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
  ~GCMChannelStatusSyncer();

  void EnsureStarted();
  void Stop();

  bool gcm_enabled() const { return gcm_enabled_; }

  // For testing purpose.
  void set_delay_removed_for_testing(bool delay_removed) {
    delay_removed_for_testing_ = delay_removed;
  }
  base::TimeDelta current_request_delay_interval() const {
    return current_request_delay_interval_;
  }
  GCMChannelStatusRequest* request_for_testing() const {
    return request_.get();
  }
  static int first_time_delay_seconds();

 private:
  // Called when a request is completed.
  void OnRequestCompleted(bool update_received,
                          bool enabled,
                          int poll_interval_seconds);

  // Schedules next request to start after appropriate delay.
  void ScheduleRequest();

  // Creates and starts a request immediately.
  void StartRequest();

  // Computes and returns a delay with the fuzzing variation added if needed,
  // after which the request could start.
  base::TimeDelta GetRequestDelayInterval() const;

  // GCMDriver owns GCMChannelStatusSyncer instance.
  GCMDriver* driver_;
  PrefService* prefs_;
  const std::string channel_status_request_url_;
  const std::string user_agent_;

  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
  std::unique_ptr<GCMChannelStatusRequest> request_;

  bool started_;
  bool gcm_enabled_;
  int poll_interval_seconds_;
  base::Time last_check_time_;

  // If non-zero, |poll_interval_seconds_| is overriden by the command line
  // options for testing purpose. Each time when the custom poll interval is
  // used, this count is subtracted by one. When it reaches zero, the default
  // poll interval will be used instead.
  int custom_poll_interval_use_count_;

  // The flag that indicates if the delay, including fuzzing variation and poll
  // interval, is removed for testing purpose.
  bool delay_removed_for_testing_;

  // Tracked for testing purpose.
  base::TimeDelta current_request_delay_interval_;

  // Used to pass a weak pointer to a task.
  base::WeakPtrFactory<GCMChannelStatusSyncer> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(GCMChannelStatusSyncer);
};

}  // namespace gcm

#endif  // COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_
