package com.taopao.tiktok.tests;

import android.net.ParseException;
import android.util.Log;
import android.widget.Toast;

import com.google.gson.JsonIOException;
import com.google.gson.JsonParseException;
import com.taopao.tiktok.tests.response.BaseResponse;

import org.json.JSONException;

import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

import io.reactivex.observers.DisposableObserver;
import retrofit2.HttpException;

/**
 * @Author:淘跑
 * @Date: 018/9/19 0019 10:26
 * @Use:
 */
public abstract class RxErrorSubscriber<T> extends DisposableObserver<T> {
    @Override
    public void onComplete() {
        Log.e("RxErrorSubscriber", "=================================onComplete");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.e("RxErrorSubscriber", "=================================onStart");
//        if (!NetworkUtil.isNetworkAvailable(AppLifecyclesImpl.getContext())) {
//            TipsUtils.showShortTips("无网络,请检查网络设置");
//            onComplete();
//        }
    }

    @Override
    public void onNext(T t) {
        Log.e("RxErrorSubscriber", "=================================onNext");
        if (t instanceof BaseResponse) {
            BaseResponse baseResponse = (BaseResponse) t;
            // 判断是否请求错误,出错直接转到onError()
            if (!baseResponse.isSuccess()) {
                if (baseResponse.getErrorCode() == Api.RequestFailure_login) {
                    onLoginFailure(baseResponse);
                }
                onShowTips(baseResponse);
                return;
            }
        }
        //显示加载成功的界面
        onResult(t);
    }

    /**
     * 提示错误信息
     * 如果不想提示就重写此方法
     *
     * @param baseResponse
     */
    public void onShowTips(BaseResponse baseResponse) {
//        MaterialDialogUtils.showLoginDialog(AppLifecyclesImpl.getContext(), "撒大声地");
        //普通错误只需显示Toast即可
        switch (baseResponse.getErrorCode()) {
            case 400://Bad Request 请求出现语法错误, 一般是请求参数不对
            case 404://Not Found 无法找到指定位置的资源
            case 403://Forbidden 资源不可用
            case 500://服务器内部错误, 请联系Java后台开发人员 !!!
            case 401://Unauthorized 访问被拒绝
            case 10000://服务器忙
//                TipsUtils.showShortTips(baseResponse.getErrorMsg());
                break;
            case Api.RequestFailure_login://登录失效 不处理
//                onLoginFailure(baseResponse);
                break;
            default:
//                TipsUtils.showShortTips(baseResponse.getErrorMsg());
        }
    }

    /**
     * 登录失效的回调
     * 不想弹出登录失效的dialog 想自己处理就重写此方法
     *
     * @param baseResponse
     */
    public void onLoginFailure(BaseResponse baseResponse) {

//        MaterialDialogUtils.showLogin(baseResponse.getErrorMsg());
    }

    public abstract void onResult(T t);

    @Override
    public void onError(Throwable t) {
        //这里不光只能打印错误, 还可以根据不同的错误做出不同的逻辑处理


        //这里只是对几个常用错误进行简单的处理, 展示这个类的用法, 在实际开发中请您自行对更多错误进行更严谨的处理
        String msg = "未知错误";
        if (t instanceof UnknownHostException) {
            msg = "网络不可用";
        } else if (t instanceof SocketTimeoutException) {
            msg = "请求网络超时";
        } else if (t instanceof HttpException) {
            HttpException httpException = (HttpException) t;
            msg = convertStatusCode(httpException);
        } else if (t instanceof JsonParseException || t instanceof ParseException || t instanceof JSONException || t instanceof JsonIOException) {
            msg = "数据解析错误";
        }
//        ArmsUtils.snackbarText(msg);
        Log.e("TAG", msg);
        Log.e("============", t.getMessage());
    }

    private String convertStatusCode(HttpException httpException) {
        String msg;
        if (httpException.code() == 500) {
            msg = "服务器发生错误";
        } else if (httpException.code() == 404) {
            msg = "请求地址不存在";
        } else if (httpException.code() == 403) {
            msg = "请求被服务器拒绝";
        } else if (httpException.code() == 307) {
            msg = "请求被重定向到其他页面";
        } else {
            msg = httpException.message();
        }
        return msg;
    }
}