// Copyright 2016 The Chromium OS 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 LOGIN_MANAGER_CUMULATIVE_USE_TIME_METRIC_H_
#define LOGIN_MANAGER_CUMULATIVE_USE_TIME_METRIC_H_

#include <stdint.h>

#include <memory>
#include <string>

#include <base/files/file_path.h>
#include <base/memory/weak_ptr.h>
#include <base/time/clock.h>
#include <base/time/tick_clock.h>
#include <base/time/time.h>
#include <base/timer/timer.h>

class MetricsLibraryInterface;

namespace login_manager {

// Used to to track usage time metric. The tracked usage time is updated in
// regular intervals (and backed to a local file, to persist the value across
// reboots). The metric is sent to UMA at most once a day. It is ensured that
// sent usage time reflects only usage of the current OS version - on OS version
// update any accumulated time persisted for previous OS version will be
// discarded.
class CumulativeUseTimeMetric {
 public:
  // |metric_name|: The name for the metric.
  // |metrics_lib|: Metrics library used for sending metric value to UMA.
  // |metrics_files_dir|: Path to directory in which files backing the metric
  //     state should be stored.
  // |time_clock|: Clock used to track current time (and determining whether the
  //     stats should be uploaded).
  // |time_tick_clock|: Clock used to track elapsed time ticks since last value
  //     update and calculate the amount by which the metric value should be
  //     increased.
  CumulativeUseTimeMetric(const std::string& metric_name,
                          MetricsLibraryInterface* metrics_lib,
                          const base::FilePath& metrics_files_dir,
                          std::unique_ptr<base::Clock> time_clock,
                          std::unique_ptr<base::TickClock> time_tick_clock);
  ~CumulativeUseTimeMetric();

  // Initializes the metric state according to the last persisted value. The
  // value will be sent to UMA if sufficient time has passed.
  // |os_version_string|: Current OS version. If the version does not match the
  //     OS version of the last persistent metric value, the metric will be
  //     reset.
  void Init(const std::string& os_version_string);

  // Starts tracking usage time, increasing the usage metric value in regular
  // intervals.
  void Start();

  // Stops tracking usage time.
  void Stop();

  // Helper methods for exposing internal constants that define update and
  // upload intervals (useful for avoiding hard-coding of constants in tests).
  base::TimeDelta GetMetricsUpdateCycle() const;
  base::TimeDelta GetMetricsUploadCycle() const;
  base::FilePath GetMetricsFileForTest() const;

 private:
  // Representation of the cumulative usage metric value backed by a file on the
  // file system.
  class AccumulatedActiveTime;

  // Calculates the time elapsed since the last update and increases the usage
  // time metric (using |IncreaseActiveTimeAndSendUmaIfNeeded|).
  void UpdateStats();

  // Increases the usage time metric by |additional_time|, and sends the
  // new value to UMA if needed. Note that the metric value will be reset if it
  // is sent to UMA.
  void IncreaseActiveTimeAndSendUmaIfNeeded(
      const base::TimeDelta& additional_time);

  MetricsLibraryInterface* metrics_lib_;

  const std::string metric_name_;

  base::TimeTicks last_update_time_;
  std::unique_ptr<AccumulatedActiveTime> accumulated_active_time_;

  std::unique_ptr<base::Clock> time_clock_;
  std::unique_ptr<base::TickClock> time_tick_clock_;

  // Whether the usage time metric has been initialized.
  bool initialized_ = false;

  // Timer for scheduling tasks that update usage time metric.
  base::RepeatingTimer update_stats_timer_;

  DISALLOW_COPY_AND_ASSIGN(CumulativeUseTimeMetric);
};

}  // namespace login_manager

#endif  // LOGIN_MANAGER_CUMULATIVE_USE_TIME_METRIC_H_
