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

#include "chrome/browser/android/chrome_backup_agent.h"

#include <string>

#include "base/android/jni_string.h"
#include "base/json/json_string_value_serializer.h"
#include "base/values.h"
#include "components/prefs/android/pref_service_android.h"
#include "components/prefs/pref_service.h"
#include "components/signin/public/base/gaia_id_hash.h"
#include "components/sync/base/data_type.h"
#include "components/sync/service/sync_prefs.h"

// Must come after all headers that specialize FromJniType() / ToJniType().
#include "chrome/android/chrome_jni_headers/ChromeBackupAgentImpl_jni.h"

static_assert(14 == static_cast<int>(syncer::UserSelectableType::kLastType),
              "When adding a new selectable type, add its pref to"
              "ChromeBackupAgentImpl.BACKUP_NATIVE_SYNC_TYPE_BOOL_PREFS if the"
              "type exists on Android");

void JNI_ChromeBackupAgentImpl_CommitPendingPrefWrites(
    JNIEnv* env,
    PrefService* pref_service) {
  // TODO(crbug.com/332710541): This currently doesn't wait for the commit to
  // complete (it passes the default value for the reply_callback param). Wait
  // for the commit to complete, here or in Java.
  pref_service->CommitPendingWrite();
}

std::string JNI_ChromeBackupAgentImpl_GetSerializedDict(
    JNIEnv* env,
    PrefService* pref_service,
    std::string& pref_name) {
  return chrome_backup_agent::GetSerializedDict(pref_service, pref_name);
}

void JNI_ChromeBackupAgentImpl_SetDict(JNIEnv* env,
                                       PrefService* pref_service,
                                       std::string& pref_name,
                                       std::string& serialized_dict) {
  chrome_backup_agent::SetDict(pref_service, pref_name, serialized_dict);
}

void JNI_ChromeBackupAgentImpl_MigrateGlobalDataTypePrefsToAccount(
    JNIEnv* env,
    PrefService* pref_service,
    std::string& gaia_id) {
  syncer::SyncPrefs sync_prefs(pref_service);
  sync_prefs.MigrateGlobalDataTypePrefsToAccount(
      pref_service, signin::GaiaIdHash::FromGaiaId(gaia_id));
}

namespace chrome_backup_agent {

std::string GetSerializedDict(PrefService* pref_service,
                              const std::string& pref_name) {
  std::string serialized_dict;
  const bool serializer_result =
      JSONStringValueSerializer(&serialized_dict)
          .Serialize(pref_service->GetDict(pref_name));
  CHECK(serializer_result);
  return serialized_dict;
}

void SetDict(PrefService* pref_service,
             const std::string& pref_name,
             const std::string& serialized_dict) {
  std::unique_ptr<base::Value> dict =
      JSONStringValueDeserializer(serialized_dict)
          .Deserialize(/*error_code=*/nullptr, /*error_message=*/nullptr);
  if (!dict || !dict->is_dict()) {
    // This should only happen if there was a bug when backing up the data, or
    // if data was corrupted. It's not appropriate to crash for the latter, so
    // just no-op.
    return;
  }
  pref_service->SetDict(pref_name, dict->GetDict().Clone());
}

}  // namespace chrome_backup_agent
