// Copyright 2012 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_SYNC_ENGINE_IMPL_CYCLE_STATUS_CONTROLLER_H_
#define COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_STATUS_CONTROLLER_H_

#include <map>
#include <vector>

#include "base/logging.h"
#include "base/macros.h"
#include "base/time/time.h"
#include "components/sync/engine/cycle/model_neutral_state.h"
#include "components/sync/engine/model_safe_worker.h"

namespace syncer {

// StatusController handles all counter and status related number crunching and
// state tracking on behalf of a SyncCycle.
//
// This object may be accessed from many different threads.  It will be accessed
// most often from the syncer thread.  However, when update application is in
// progress it may also be accessed from the worker threads.  This is safe
// because only one of them will run at a time, and the syncer thread will be
// blocked until update application completes.
//
// This object contains only global state.  None of its members are per model
// type counters.
class StatusController {
 public:
  StatusController();
  ~StatusController();

  // The types included in the get updates and commit client to server requests.
  const ModelTypeSet get_updates_request_types() const;
  void set_get_updates_request_types(ModelTypeSet value);
  const ModelTypeSet commit_request_types() const;
  void set_commit_request_types(ModelTypeSet value);

  // Various conflict counters.
  int num_encryption_conflicts() const;
  int num_hierarchy_conflicts() const;
  int num_server_conflicts() const;

  // Aggregate sum of all conflicting items over all conflict types.
  int TotalNumConflictingItems() const;

  // Number of successfully applied updates.
  int num_updates_applied() const;

  int num_server_overwrites() const;
  int num_local_overwrites() const;

  // The time at which we started the most recent sync cycle.
  base::Time sync_start_time() const { return sync_start_time_; }

  // If a poll was performed in this cycle, the time at which it finished.
  // Not set if no poll was performed.
  base::Time poll_finish_time() const { return poll_finish_time_; }

  const ModelNeutralState& model_neutral_state() const {
    return model_neutral_;
  }

  SyncerError last_get_key_result() const;

  // Download counters.
  void increment_num_updates_downloaded_by(int value);
  void increment_num_tombstone_updates_downloaded_by(int value);
  void increment_num_reflected_updates_downloaded_by(int value);

  // Update application and conflict resolution counters.
  void increment_num_updates_applied_by(int value);
  void increment_num_encryption_conflicts_by(int value);
  void increment_num_hierarchy_conflicts_by(int value);
  void increment_num_server_conflicts();
  void increment_num_local_overwrites();
  void increment_num_server_overwrites();

  // Commit counters.
  void increment_num_successful_commits();
  void increment_num_successful_bookmark_commits();
  void set_num_successful_bookmark_commits(int value);

  // Server communication status tracking.
  void set_last_get_key_result(const SyncerError result);
  void set_last_download_updates_result(const SyncerError result);
  void set_commit_result(const SyncerError result);

  void UpdateStartTime();
  void UpdatePollTime();

 private:
  ModelNeutralState model_neutral_;

  // Time the last sync cycle began.
  base::Time sync_start_time_;

  // If a poll was performed, the time it finished. Not set if not poll was
  // performed.
  base::Time poll_finish_time_;

  DISALLOW_COPY_AND_ASSIGN(StatusController);
};

}  // namespace syncer

#endif  // COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_STATUS_CONTROLLER_H_
