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

#include "components/sync/engine/commit_util.h"

#include "components/sync/protocol/sync.pb.h"

namespace syncer::commit_util {

void AddExtensionsActivityToMessage(
    ExtensionsActivity* activity,
    ExtensionsActivity::Records* extensions_activity_buffer,
    sync_pb::CommitMessage* message) {
  // This isn't perfect, since the set of extensions activity may not correlate
  // exactly with the items being committed.  That's OK as long as we're looking
  // for a rough estimate of extensions activity, not an precise mapping of
  // which commits were triggered by which extension.
  //
  // We will push this list of extensions activity back into the
  // ExtensionsActivityMonitor if this commit fails.  That's why we must keep a
  // copy of these records in the cycle.
  activity->GetAndClearRecords(extensions_activity_buffer);

  const ExtensionsActivity::Records& records = *extensions_activity_buffer;
  for (const auto& [id, record] : records) {
    sync_pb::ChromiumExtensionsActivity* activity_message =
        message->add_extensions_activity();
    activity_message->set_extension_id(record.extension_id);
    activity_message->set_bookmark_writes_since_last_commit(
        record.bookmark_write_count);
  }
}

void AddClientConfigParamsToMessage(
    ModelTypeSet enabled_types,
    bool proxy_tabs_datatype_enabled,
    bool cookie_jar_mismatch,
    bool single_client,
    bool single_client_with_standalone_invalidations,
    bool single_client_with_old_invalidations,
    const std::vector<std::string>& all_fcm_registration_tokens,
    const std::vector<std::string>&
        fcm_registration_tokens_for_interested_clients,
    sync_pb::CommitMessage* message) {
  sync_pb::ClientConfigParams* config_params = message->mutable_config_params();
  DCHECK(Difference(enabled_types, ProtocolTypes()).Empty());
  for (ModelType type : enabled_types) {
    int field_number = GetSpecificsFieldNumberFromModelType(type);
    config_params->mutable_enabled_type_ids()->Add(field_number);
  }
  config_params->set_tabs_datatype_enabled(proxy_tabs_datatype_enabled);
  config_params->set_cookie_jar_mismatch(cookie_jar_mismatch);
  config_params->set_single_client(single_client);
  config_params->set_single_client_with_standalone_invalidations(
      single_client_with_standalone_invalidations);
  config_params->set_single_client_with_old_invalidations(
      single_client_with_old_invalidations);
  for (const std::string& token : all_fcm_registration_tokens) {
    *config_params->add_devices_fcm_registration_tokens() = token;
  }
  for (const std::string& token :
       fcm_registration_tokens_for_interested_clients) {
    config_params->add_fcm_registration_tokens_for_interested_clients(token);
  }
}

}  // namespace syncer::commit_util
