// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_SYNC_ENGINE_COMMIT_H_
#define COMPONENTS_SYNC_ENGINE_COMMIT_H_

#include <stddef.h>

#include <map>
#include <memory>
#include <string>

#include "components/sync/base/extensions_activity.h"
#include "components/sync/base/model_type.h"
#include "components/sync/base/syncer_error.h"
#include "components/sync/engine/commit_contribution.h"
#include "components/sync/engine/cycle/nudge_tracker.h"
#include "components/sync/protocol/sync.pb.h"

namespace syncer {

class ActiveDevicesInvalidationInfo;
class CommitProcessor;
class StatusController;
class SyncCycle;

// This class wraps the actions related to building and executing a single
// commit operation.
//
// This class' most important responsibility is to manage the ContributionsMap.
// This class serves as a container for those objects.  Although it would have
// been acceptable to let this class be a dumb container object, it turns out
// that there was no other convenient place to put the Init() and
// PostAndProcessCommitResponse() functions.  So they ended up here.
class Commit {
 public:
  using ContributionMap =
      std::map<ModelType, std::unique_ptr<CommitContribution>>;

  Commit(ContributionMap contributions,
         const sync_pb::ClientToServerMessage& message,
         ExtensionsActivity::Records extensions_activity_buffer);

  Commit(const Commit&) = delete;
  Commit& operator=(const Commit&) = delete;

  ~Commit();

  // |extensions_activity| may be null.
  static std::unique_ptr<Commit> Init(
      ModelTypeSet enabled_types,
      bool proxy_tabs_datatype_enabled,
      size_t max_entries,
      const std::string& account_name,
      const std::string& cache_guid,
      bool cookie_jar_mismatch,
      const ActiveDevicesInvalidationInfo& active_devices_invalidation_info,
      CommitProcessor* commit_processor,
      ExtensionsActivity* extensions_activity);

  // |extensions_activity| may be null.
  SyncerError PostAndProcessResponse(NudgeTracker* nudge_tracker,
                                     SyncCycle* cycle,
                                     StatusController* status,
                                     ExtensionsActivity* extensions_activity);

  ModelTypeSet GetContributingDataTypes() const;

 private:
  // Report commit failure to each contribution.
  void ReportFullCommitFailure(SyncerError syncer_error);

  ContributionMap contributions_;

  sync_pb::ClientToServerMessage message_;
  ExtensionsActivity::Records extensions_activity_buffer_;
};

}  // namespace syncer

#endif  // COMPONENTS_SYNC_ENGINE_COMMIT_H_
