package com.ttstd.dialer.livedata;

import androidx.annotation.MainThread;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;

/**
 * 通过版本号控制数据消费，避免旧数据倒灌
 */

/**
 * 带版本控制的LiveData，解决数据倒灌问题
 */
public class VersionedLiveData<T> extends LiveData<VersionedData<T>> {
    private int currentVersion; // 数据版本号（初始化为0）

    // 修正：父类构造器直接使用初始版本0，避免引用未初始化的currentVersion
    public VersionedLiveData() {
        super(new VersionedData<>(null, 0)); // 初始数据版本为0
        this.currentVersion = 0; // 初始化版本号（与父类初始数据一致）
    }

    /**
     * 修正：改名避免与父类setValue冲突（父类setValue参数为VersionedData<T>）
     * 更新数据并自动递增版本号
     */
    @MainThread
    public void setNewValue(T newValue) {
        currentVersion++; // 版本号递增
        // 调用父类的setValue，传入包装后的带版本数据
        super.setValue(new VersionedData<>(newValue, currentVersion));
    }

    /**
     * 注册带版本校验的观察者，仅接收新版本数据
     */
    public void observeWithVersion(LifecycleOwner owner, final VersionedObserver<T> observer) {
        observe(owner, new Observer<VersionedData<T>>() {
            private int lastHandledVersion = -1; // 记录上次处理的版本号

            @Override
            public void onChanged(VersionedData<T> newData) {
                if (newData == null) return;
                // 仅处理版本号高于上次的新数据
                if (newData.getVersion() > lastHandledVersion) {
                    lastHandledVersion = newData.getVersion();
                    observer.onNewData(newData.getData());
                }
            }
        });
    }

    /**
     * 版本化观察者接口，用于接收新数据
     */
    public interface VersionedObserver<T> {
        void onNewData(T data);
    }
}