// Copyright (c) 2014 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_BROWSER_WATCHER_WATCHER_METRICS_PROVIDER_WIN_H_
#define COMPONENTS_BROWSER_WATCHER_WATCHER_METRICS_PROVIDER_WIN_H_

#include "base/callback.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
#include "base/task_runner.h"
#include "components/metrics/metrics_provider.h"

namespace browser_watcher {

// Provides stability data captured by the Chrome Watcher, namely the browser
// process exit codes.
class WatcherMetricsProviderWin : public metrics::MetricsProvider {
 public:
  // A callback that provides product name, version number and channel name.
  using GetExecutableDetailsCallback =
      base::Callback<void(base::string16*, base::string16*, base::string16*)>;

  static const char kBrowserExitCodeHistogramName[];

  // Initializes the reporter.
  WatcherMetricsProviderWin(const base::string16& registry_path,
                            const base::FilePath& user_data_dir,
                            const base::FilePath& crash_dir,
                            const GetExecutableDetailsCallback& exe_details_cb);
  ~WatcherMetricsProviderWin() override;

  // metrics::MetricsProvider implementation.
  void AsyncInit(const base::Closure& done_callback) override;
  void OnRecordingEnabled() override;
  void OnRecordingDisabled() override;
  // Note: this function collects metrics, some of which are related to the
  // previous run's version and some to the current version. Doing the correct
  // attribution on upgrade is difficult, and currently ignored. Metrics
  // clearing is one mechanism to avoid misattribution, but is not used in this
  // case (ClearSavedStabilityMetrics is not overridden) as version
  // misattribution is preferred to data loss. Metrics will likely be attributed
  // to the previous run's version, unless no initial log is sent, in which case
  // they should be attributed to the current version (though they may actually
  // be attributed to still another following version).
  // TODO(manzagop): proper metric version attribution on upgrade.
  void ProvideStabilityMetrics(
      metrics::SystemProfileProto* system_profile_proto) override;

 private:
  // TODO(manzagop): avoid collecting reports for clean exits from the fast exit
  // path.
  void CollectPostmortemReportsImpl();

  bool recording_enabled_;
  bool cleanup_scheduled_;
  const base::string16 registry_path_;
  const base::FilePath user_data_dir_;
  const base::FilePath crash_dir_;
  GetExecutableDetailsCallback exe_details_cb_;

  // Used for collecting postmortem reports and clearing leftover data in
  // registry if metrics reporting is disabled.
  scoped_refptr<base::TaskRunner> task_runner_;

  base::WeakPtrFactory<WatcherMetricsProviderWin> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(WatcherMetricsProviderWin);
};

}  // namespace browser_watcher

#endif  // COMPONENTS_BROWSER_WATCHER_WATCHER_METRICS_PROVIDER_WIN_H_
