// Copyright (c) 2013 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_VARIATIONS_VARIATIONS_REQUEST_SCHEDULER_H_
#define COMPONENTS_VARIATIONS_VARIATIONS_REQUEST_SCHEDULER_H_

#include "base/bind.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/time/time.h"
#include "base/timer/timer.h"

class PrefService;

namespace variations {

// A helper class that makes VariationsService requests at the correct times.
class VariationsRequestScheduler {
 public:
  virtual ~VariationsRequestScheduler();

  // Starts the task. This can be a repeated event or a one-off.
  virtual void Start();

  // Resets the scheduler if it is currently on a timer.
  virtual void Reset();

  // Schedules a fetch shortly, for example to re-try the initial request which
  // may have failed.
  void ScheduleFetchShortly();

  // Called when the application has been foregrounded. This may fetch a new
  // seed.
  virtual void OnAppEnterForeground();

  // Factory method for this class.
  static VariationsRequestScheduler* Create(const base::Closure& task,
                                            PrefService* local_state);

 protected:
  // |task| is the closure to call when the scheduler deems ready.
  explicit VariationsRequestScheduler(const base::Closure& task);

  // Returns the time interval between variations seed fetches.
  base::TimeDelta GetFetchPeriod() const;

  // Getter for derived classes.
  base::Closure task() const;

 private:
  FRIEND_TEST_ALL_PREFIXES(VariationsRequestSchedulerTest,
                           ScheduleFetchShortly);

  // The task scheduled by this class.
  base::Closure task_;

  // The timer used to repeatedly ping the server. Keep this as an instance
  // member so if VariationsRequestScheduler goes out of scope, the timer is
  // automatically canceled.
  base::RepeatingTimer timer_;

  // A one-shot timer used for scheduling out-of-band fetches.
  base::OneShotTimer one_shot_timer_;

  DISALLOW_COPY_AND_ASSIGN(VariationsRequestScheduler);
};

}  // namespace variations

#endif  // COMPONENTS_VARIATIONS_VARIATIONS_REQUEST_SCHEDULER_H_
