// Copyright 2025 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/storage_collection_synchronizer_android.h"

#include "base/android/callback_android.h"
#include "base/memory/ptr_util.h"
#include "chrome/browser/android/collection_storage_observer_factory_android.h"
#include "chrome/browser/android/storage_restore_orchestrator_factory_android.h"
#include "chrome/browser/android/tab_state_storage_service_factory.h"
#include "components/tab_groups/tab_group_id.h"
#include "components/tabs/public/android/jni_conversion.h"
#include "third_party/jni_zero/jni_zero.h"

// Must come after all headers that specialize FromJniType() / ToJniType().
// This JNI header is generated from StorageCollectionSynchronizer.java.
#include "chrome/browser/tab/jni_headers/StorageCollectionSynchronizer_jni.h"

namespace tabs {

StorageCollectionSynchronizerAndroid::StorageCollectionSynchronizerAndroid(
    Profile* profile,
    tabs::TabStripCollection* collection)
    : synchronizer_(collection,
                    TabStateStorageServiceFactory::GetForProfile(profile)) {}

StorageCollectionSynchronizerAndroid::~StorageCollectionSynchronizerAndroid() =
    default;

void StorageCollectionSynchronizerAndroid::FullSave(
    JNIEnv* env,
    base::OnceClosure callback) {
  synchronizer_.FullSave(std::move(callback));
}

void StorageCollectionSynchronizerAndroid::CancelRestore(JNIEnv* env) {
  synchronizer_.CancelRestore();
}

void StorageCollectionSynchronizerAndroid::SaveTab(JNIEnv* env,
                                                   TabAndroid* tab) {
  synchronizer_.SaveTab(tab);
}

void StorageCollectionSynchronizerAndroid::SaveTabGroupPayload(
    JNIEnv* env,
    base::Token group_id) {
  synchronizer_.SaveTabGroupPayload(
      tab_groups::TabGroupId::FromRawToken(group_id));
}

void StorageCollectionSynchronizerAndroid::ConsumeRestoreOrchestratorFactory(
    JNIEnv* env,
    const jni_zero::JavaRef<jobject>& j_object) {
  synchronizer_.SetCollectionObserver(
      StorageRestoreOrchestratorFactoryAndroid::Build(env, j_object));
}

void StorageCollectionSynchronizerAndroid::ConsumeCollectionObserverFactory(
    JNIEnv* env,
    const jni_zero::JavaRef<jobject>& j_object) {
  synchronizer_.SetCollectionObserver(
      CollectionStorageObserverFactoryAndroid::Build(env, j_object));
}

static int64_t JNI_StorageCollectionSynchronizer_Init(
    JNIEnv* env,
    const jni_zero::JavaRef<jobject>& j_object,
    Profile* profile,
    tabs::TabStripCollection* collection) {
  StorageCollectionSynchronizerAndroid* tracker =
      new StorageCollectionSynchronizerAndroid(profile, collection);
  return reinterpret_cast<intptr_t>(tracker);
}

void StorageCollectionSynchronizerAndroid::Destroy(JNIEnv* env) {
  delete this;
}

}  // namespace tabs

DEFINE_JNI(StorageCollectionSynchronizer)
