package com.novelbook.android.netutils;

import android.app.ProgressDialog;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;

import org.json.JSONObject;

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

import javax.net.ssl.SSLHandshakeException;

import io.reactivex.observers.DisposableObserver;
import okhttp3.HttpUrl;
import okhttp3.ResponseBody;
import retrofit2.HttpException;
import retrofit2.Response;

/**
 * Created by 眼神 on 2018/3/27.
 * 用于在Http请求开始时,自动显示一个ProgressDialog
 * 在Http请求结束是,关闭ProgressDialog
 * 调用者自己对请求数据进行处理   成功时 通过result是否等于1分别回调onSuccess和onFault,默认处理了401错误转登录。
 * 回调结果为String,需要手动序列化
 */

public class OnSuccessAndFaultSub extends DisposableObserver<ResponseBody>
    implements ProgressCancelListener {
    private static final String TAG= OnSuccessAndFaultSub.class.getSimpleName();
    /**
     * 是否需要显示默认Loading
     */
    private boolean showProgress = true;
    private OnSuccessAndFaultListener mOnSuccessAndFaultListener;

    private Context context;
    private ProgressDialog progressDialog;


    /**
     * @param mOnSuccessAndFaultListener 成功回调监听
     */
    public OnSuccessAndFaultSub(OnSuccessAndFaultListener mOnSuccessAndFaultListener) {
        this.mOnSuccessAndFaultListener = mOnSuccessAndFaultListener;
    }


    /**
     * @param mOnSuccessAndFaultListener 成功回调监听
     * @param context 上下文
     */
    public OnSuccessAndFaultSub(OnSuccessAndFaultListener mOnSuccessAndFaultListener, Context context) {
        this.mOnSuccessAndFaultListener = mOnSuccessAndFaultListener;
        if(context!=null) {
            this.context = context;
            progressDialog = new ProgressDialog(context);
        }
    }


    /**
     * @param mOnSuccessAndFaultListener 成功回调监听
     * @param context 上下文
     * @param showProgress 是否需要显示默认Loading
     */
    public OnSuccessAndFaultSub(OnSuccessAndFaultListener mOnSuccessAndFaultListener, Context context, boolean showProgress) {
        this.mOnSuccessAndFaultListener = mOnSuccessAndFaultListener;
        this.context = context;
        progressDialog = new ProgressDialog(context);
        this.showProgress = showProgress;
    }


    private void showProgressDialog() {
        if (showProgress && null != progressDialog) {
            progressDialog.setMessage("正在请求网络");
          //  progressDialog.show();
        }
    }


    private void dismissProgressDialog() {
        if (showProgress && null != progressDialog) {
            progressDialog.dismiss();
        }
    }


    /**
     * 订阅开始时调用
     * 显示ProgressDialog
     */
    @Override
    public void onStart() {
        showProgressDialog();
    }


    /**
     * 完成,隐藏ProgressDialog
     */
    @Override public void onComplete() {
        dismissProgressDialog();
        progressDialog = null;
    }


    /**
     * 对错误进行统一处理
     * 隐藏ProgressDialog
     */
    @Override
    public void onError(Throwable e) {
        try {

            if (e instanceof SocketTimeoutException) {
                mOnSuccessAndFaultListener.onFault("网络连接超时");
                //请求超时
            } else if (e instanceof ConnectException) {//网络连接超时
                //                ToastManager.showShortToast("网络连接超时");
                mOnSuccessAndFaultListener.onFault("网络连接超时");
            } else if (e instanceof SSLHandshakeException) {//安全证书异常
                //                ToastManager.showShortToast("安全证书异常");
                mOnSuccessAndFaultListener.onFault("安全证书异常");
            } else if (e instanceof HttpException) {//请求的地址不存在
                int code = ((HttpException) e).code();

                Response<?> response = ((HttpException) e).response();
                HttpUrl url=  response.raw().request().url();
                String host = url.host();
                String key = url.query();





                if (code == 504) {
                    Toast.makeText(context,"网络异常,请检查您的网络状态",Toast.LENGTH_LONG).show();
                    mOnSuccessAndFaultListener.onFault("网络异常,请检查您的网络状态");
                } else if (code == 404) {
                    //                    ToastManager.showShortToast("请求的地址不存在");
                    mOnSuccessAndFaultListener.onFault("请求的地址不存在");
                } else if (code == 401) {
                    //                    ToastManager.showShortToast("请求的地址不存在");
                    mOnSuccessAndFaultListener.onFault("权限验证错误");
                } else if(code == 500) {
                   // Toast.makeText(context,"网关错误 ,请检查您的网络状态",Toast.LENGTH_LONG).show();
                    mOnSuccessAndFaultListener.onFault("服务错误");
                } else if(code == 503) {
                    // Toast.makeText(context,"网关错误 ,请检查您的网络状态",Toast.LENGTH_LONG).show();
                    //sleep 200
                    mOnSuccessAndFaultListener.onFault("服务限制");
                }else if(code == 502) {
                //    HttpMethods.getInstance().changeBaseUrl(); //更新基本信息
                    try {
                        Toast.makeText(context, "服务器开小差了,请重试", Toast.LENGTH_LONG).show();
                    }catch (Exception e3){
                        Log.e(TAG, "prepare book onError: ",e3);
                    }
                    mOnSuccessAndFaultListener.onFault("服务器开小差了,请重试");
                }else {
                    //                    ToastManager.showShortToast("请求失败");
                    mOnSuccessAndFaultListener.onFault("请求失败");
                }
            } else if (e instanceof UnknownHostException) {//域名解析失败
                //                ToastManager.showShortToast("域名解析失败");
                mOnSuccessAndFaultListener.onFault("域名解析失败");
            } else {
                //                ToastManager.showShortToast("error:" + e.getMessage());
                mOnSuccessAndFaultListener.onFault("error:" + e.getMessage());
            }
        } catch (Exception e2) {
            Log.e(TAG, "prepare book onError: ",e );
        } finally {
            Log.e("OnSuccessAndFaultSub", "error:" + e);
            //            mOnSuccessAndFaultListener.onFault("error:" + e.getMessage());
            dismissProgressDialog();
            progressDialog = null;

        }

    }


    /**
     * 当result等于1回调给调用者,否则自动显示错误信息,若错误信息为401跳转登录页面。
     * ResponseBody  body = response.body();//获取响应体
     * InputStream inputStream = body.byteStream();//获取输入流
     * byte[] bytes = body.bytes();//获取字节数组
     * String str = body.string();//获取字符串数据
     */
    @Override
    public void onNext(ResponseBody body) {
        try {
         //   final String result = CompressUtils.decompress(body.byteStream());
            final String result =body.string();
           // Log.e("body", result);
            JSONObject jsonObject = new JSONObject(result);
            int resultCode = jsonObject.getInt("code");
            if (resultCode == 0) {
                mOnSuccessAndFaultListener.onSuccess(jsonObject.getString("data"));
            } else {
                String errorMsg = jsonObject.getString("message");
                mOnSuccessAndFaultListener.onFault(errorMsg);
                 Log.e("OnSuccessAndFaultSub", "errorMsg: " + errorMsg);
            }
        } catch (Exception e) {
            Log.e(TAG, "prepare book error: ",e );
            e.printStackTrace();
          //  Toast.makeText(context,"出错了" + e.getMessage(),Toast.LENGTH_LONG);
        }
    }


    /**
     * 取消ProgressDialog的时候,取消对observable的订阅,同时也取消了http请求
     */
    @Override
    public void onCancelProgress() {
        if (!this.isDisposed()) {
            this.dispose();
        }
    }
}