package com.ttstd.controller.base.mvvm;

import androidx.lifecycle.ViewModel;

import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Consumer;

/**
 * ViewModel 基类。
 *
 * 内置 CompositeDisposable：所有网络请求通过 {@link #execute} 订阅，
 * ViewModel 销毁（Activity finish / Service stop）时统一 dispose，
 * 从而实现请求随生命周期自动取消，杜绝内存泄漏与野线程回调。
 */
public class BaseViewModel extends ViewModel {

    private final CompositeDisposable disposables = new CompositeDisposable();

    /** 注册一个 Disposable，交由本 ViewModel 生命周期托管。 */
    protected void addDisposable(Disposable disposable) {
        if (disposable != null) {
            disposables.add(disposable);
        }
    }

    /**
     * 订阅一个 Single 并自动切回主线程，结果与异常都在主线程回调。
     */
    protected <T> void execute(Single<T> single, Consumer<T> onSuccess, Consumer<Throwable> onError) {
        addDisposable(single
                .observeOn(io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread())
                .subscribe(onSuccess, onError));
    }

    /**
     * 订阅一个 Observable 并自动切回主线程。
     */
    protected <T> void execute(Observable<T> observable, Consumer<T> onNext, Consumer<Throwable> onError) {
        addDisposable(observable
                .observeOn(io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread())
                .subscribe(onNext, onError));
    }

    /** 主动清空当前所有订阅（不影响后续再次订阅）。 */
    protected void clearDisposables() {
        disposables.clear();
    }

    @Override
    protected void onCleared() {
        disposables.clear();
        super.onCleared();
    }
}
