// Copyright 2017 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 CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_H_
#define CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_H_

#include <memory>

#include "base/scoped_observer.h"
#include "base/timer/elapsed_timer.h"
#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/prefs/pref_service.h"

namespace user_prefs {
class PrefRegistrySyncable;
}  // namespace user_prefs

namespace feature_engagement {

// The SessionDurationUpdater tracks the total amount of observed time across
// Chrome restarts. Observed time in this context is active session time that
// occurs while there is a FeatureTracker whose active session time requirement
// has not been satisfied. This allows subclasses of FeatureTracker to check how
// much active time has passed, and decide whether to show their respective
// promos accordingly.
//
// When an active session is closed, DesktopSessionDurationTracker calls
// OnSessionEnded and the observed time is incremented and persisted. Then,
// OnSessionEnded is called on all of Features observing SessionDurationUpdater.
// If the feature has its time limit exceeded, it should remove itself as an
// observer of SessionDurationUpdater. If SessionDurationUpdater has no
// observers, it means that the time limits of all the observing features has
// been exceeded, so the SessionDurationUpdater removes itself as an observer of
// DesktopSessionDurationTracker and stops updating observed session time.
//
// If all observers are removed, SessionDurationUpdater doesn't continue
// updating the observed session time. However, if another feature is added as
// an observer later, SessionDurationUpdater starts incrementing the observed
// session time again.

class SessionDurationUpdater
    : public metrics::DesktopSessionDurationTracker::Observer,
      public KeyedService {
 public:
  // The methods for the observer will be called on the UI thread.
  class Observer {
   public:
    virtual ~Observer() = default;
    virtual void OnSessionEnded(base::TimeDelta total_session_time) = 0;
  };

  explicit SessionDurationUpdater(PrefService* pref_service,
                                  const char* observed_session_time_pref_key);
  ~SessionDurationUpdater() override;

  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);

  // Returns the total amount of observed active session time of the current
  // session plus the previously recorded observed session time. The resulting
  // value should be cumulative session time across all Chrome restarts.
  base::TimeDelta GetCumulativeElapsedSessionTime();

  // Gets the recorded observed session time which is cumulative for all
  // previous sessions.
  base::TimeDelta GetRecordedObservedSessionTime();

  // For observing the status of the session tracker.
  void AddObserver(Observer* observer);
  void RemoveObserver(Observer* observer);

  // metrics::DesktopSessionDurationtracker::Observer:
  void OnSessionStarted(base::TimeTicks delta) override;
  void OnSessionEnded(base::TimeDelta delta) override;

 private:
  // Adds the DesktopSessionDurationTracker observer.
  void AddDurationTrackerObserver();
  // Removes the DesktopSessionDurationTracker observer.
  void RemoveDurationTrackerObserver();
  // Returns the pref service associated with this SessionDurationUpdater.
  virtual PrefService* GetPrefs();

  // Observes the DesktopSessionDurationTracker and notifies when a desktop
  // session starts and ends.
  ScopedObserver<metrics::DesktopSessionDurationTracker,
                 metrics::DesktopSessionDurationTracker::Observer>
      duration_tracker_observer_;

  // Owned by Profile manager.
  PrefService* const pref_service_;

  // The profile dict key of kObservedSessionTime that tracks the observed
  // session time for an In-Product Help feature.
  const char* observed_session_time_dict_key_;

  // Tracks the elapsed active session time while the browser is open.
  std::unique_ptr<base::ElapsedTimer> current_session_timer_;

  base::ObserverList<Observer> observer_list_;

  DISALLOW_COPY_AND_ASSIGN(SessionDurationUpdater);
};

}  // namespace feature_engagement

#endif  // CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_H_
