// Copyright 2016 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_METRICS_DATA_USE_TRACKER_H_
#define COMPONENTS_METRICS_DATA_USE_TRACKER_H_

#include <string>

#include "base/callback.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"

namespace metrics {

typedef base::Callback<void(const std::string&, int, bool)>
    UpdateUsagePrefCallbackType;

// Records the data use of user traffic and UMA traffic in user prefs. Taking
// into account those prefs it can verify whether certain UMA log upload is
// allowed.
class DataUseTracker {
 public:
  explicit DataUseTracker(PrefService* local_state);
  ~DataUseTracker();

  // Returns an instance of |DataUseTracker| with provided |local_state| if
  // users data use should be tracked and null pointer otherwise.
  static std::unique_ptr<DataUseTracker> Create(PrefService* local_state);

  // Registers data use prefs using provided |registry|.
  static void RegisterPrefs(PrefRegistrySimple* registry);

  // Updates data usage tracking prefs with the specified values.
  void UpdateMetricsUsagePrefs(const std::string& service_name,
                               int message_size,
                               bool is_cellular);

  // Returns whether a log with provided |log_bytes| can be uploaded according
  // to data use ratio and UMA quota provided by variations.
  bool ShouldUploadLogOnCellular(int log_bytes);

 private:
  FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckUpdateUsagePref);
  FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckRemoveExpiredEntries);
  FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckComputeTotalDataUse);
  FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckCanUploadUMALog);

  // Updates provided |pref_name| for a current date with the given message
  // size.
  void UpdateUsagePref(const std::string& pref_name, int message_size);

  // Removes entries from the all data use  prefs.
  void RemoveExpiredEntries();

  // Removes entries from the given |pref_name| if they are more than 7 days
  // old.
  void RemoveExpiredEntriesForPref(const std::string& pref_name);

  // Computes data usage according to all the entries in the given dictionary
  // pref.
  int ComputeTotalDataUse(const std::string& pref_name);

  // Returns the weekly allowed quota for UMA data use.
  virtual bool GetUmaWeeklyQuota(int* uma_weekly_quota_bytes) const;

  // Returns the allowed ratio for UMA data use over overall data use.
  virtual bool GetUmaRatio(double* ratio) const;

  // Returns the current date for measurement.
  virtual base::Time GetCurrentMeasurementDate() const;

  // Returns the current date as a string with a proper formatting.
  virtual std::string GetCurrentMeasurementDateAsString() const;

  PrefService* local_state_;

  base::ThreadChecker thread_checker_;

  DISALLOW_COPY_AND_ASSIGN(DataUseTracker);
};

}  // namespace metrics
#endif  // COMPONENTS_METRICS_DATA_USE_TRACKER_H_
