// 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 CHROME_BROWSER_UI_ACTIVE_TAB_TRACKER_H_
#define CHROME_BROWSER_UI_ACTIVE_TAB_TRACKER_H_

#include "base/logging.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "chrome/browser/idle.h"
#include "chrome/browser/ui/browser_list_observer.h"
#include "chrome/browser/ui/native_focus_tracker.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "url/gurl.h"

class Browser;

namespace content {
class WebContents;
}

// ActiveTabTracker persists the amount of time the user views a page to
// history. Only pages the user views for more than |kTimeBeforeCommitMS|
// milliseconds while the page is active are persisted.
class ActiveTabTracker : public chrome::BrowserListObserver,
                         public TabStripModelObserver,
                         public content::NotificationObserver,
                         public NativeFocusTrackerHost {
 public:
  ActiveTabTracker();
  virtual ~ActiveTabTracker();

  // TODO(sky): remove this when we have NativeFocusTracker for other platforms.
  bool is_valid() const { return native_focus_tracker_.get() != NULL; }

  // TabStripModelObserver:
  virtual void ActiveTabChanged(content::WebContents* old_contents,
                                content::WebContents* new_contents,
                                int index,
                                int reason) OVERRIDE;
  virtual void TabReplacedAt(TabStripModel* tab_strip_model,
                             content::WebContents* old_contents,
                             content::WebContents* new_contents,
                             int index) OVERRIDE;
  virtual void TabStripEmpty() OVERRIDE;

  // BrowserListObserver:
  virtual void OnBrowserRemoved(Browser* browser) OVERRIDE;

  // content::NotificationObserver:
  virtual void Observe(int type,
                       const content::NotificationSource& source,
                       const content::NotificationDetails& details) OVERRIDE;

  // NativeFocusTrackerHost:
  virtual void SetBrowser(Browser* browser) OVERRIDE;

 private:
  // Sets the active webcontents.
  void SetWebContents(content::WebContents* web_contents);

  // Sets the idle state.
  void SetIdleState(IdleState idle_state);

  // Starts the query for the idle state. Invokes SetIdleState() when idel state
  // is found.
  void QueryIdleState();

  // Returns the URL |web_contents_| is showing and needs to be tracked. Returns
  // an empty GURL() is no |web_contents_| or the |web_contents_| is not showing
  // a page that needs to be tracked.
  GURL GetURLFromWebContents() const;

  // If necessary commits the active time for the active tab.
  void CommitActiveTime();

  scoped_ptr<NativeFocusTracker> native_focus_tracker_;

  // The active Browser, or NULL if one is not active.
  Browser* browser_;

  // The active WebContents.
  content::WebContents* web_contents_;

  // Current idle state. Only valid if |browser_| is non-null and
  // |weak_ptr_factory_| is empty.
  IdleState idle_state_;

  // Time the |idle_state_| became IDLE_STATE_ACTIVE, or a tab changed.
  base::TimeTicks active_time_;

  // Timer used to query for idle state.
  base::Timer timer_;

  // The url of the active tab. Empty indicates not valid.
  GURL url_;

  content::NotificationRegistrar registrar_;

  // WeakPtrFactory used when querying for idle state.
  base::WeakPtrFactory<ActiveTabTracker> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(ActiveTabTracker);
};

#endif  // CHROME_BROWSER_UI_ACTIVE_TAB_TRACKER_H_
