package com.cooleshow.base.rx;

import com.cooleshow.base.data.net.ApiException;
import com.cooleshow.base.data.net.BaseResponse;
import com.cooleshow.base.presenter.view.BaseView;

import io.reactivex.rxjava3.observers.DisposableObserver;


public abstract class BaseObserver<T> extends DisposableObserver<BaseResponse<T>> {
    private BaseView baseView;

    public BaseObserver() {

    }


    public BaseObserver(BaseView baseView) {
        this.baseView = baseView;
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    public void onNext(BaseResponse<T> baseResponse) {
        int errcode = baseResponse.getErrorCode();
        String errmsg = baseResponse.getErrorMsg();

        if (errcode == 200) {
            T data = baseResponse.getData();
            // 将服务端获取到的正常数据传递给上层调用方
            onSuccess(data);
        } else {
            onError(new ApiException(errcode, errmsg));
        }
    }

    /**
     * 回调正常数据
     * @param data
     */
    protected abstract void onSuccess(T data);

    /**
     * 进度回调
     * @param progress
     */
    public void onProgress(long total , long progress) {}

    /**
     * 异常处理，包括两方面数据：
     * (1) 服务端没有没有返回数据，HttpException，如网络异常，连接超时;
     * (2) 服务端返回了数据，但 errcode!=0,即服务端返回的data为空，如 密码错误,App登陆超时,token失效
     */
    @Override
    public void onError(Throwable e) {
        if (baseView != null) {
            baseView.onError(e);
        }
        if (baseView != null) {
            baseView.hideLoading();
        }
    }

    @Override
    public void onComplete() {
        if (baseView != null) {
            baseView.hideLoading();
        }

    }
}
