package com.rehome.sgbaxj.utils;

import android.app.Activity;
import android.content.Context;

import com.rehome.sgbaxj.R;
import com.yolanda.nohttp.NoHttp;
import com.yolanda.nohttp.download.DownloadQueue;
import com.yolanda.nohttp.rest.Request;
import com.yolanda.nohttp.rest.RequestQueue;

import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.CertificateFactory;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

/**
 * Nohttp工具类
 */
public class NohttpUtils {

    private static NohttpUtils sUtils;
    private RequestQueue mQueue;

    /**
     * 下载队列.
     */
    private static DownloadQueue downloadQueue;

    private NohttpUtils() {
        mQueue = NoHttp.newRequestQueue(8);
    }

    /**
     * DCL单例模式  双层锁
     *
     * @return
     */
    public static NohttpUtils getInstance() {
        if (sUtils == null) {
            synchronized (NohttpUtils.class) {
                if (sUtils == null) {
                    sUtils = new NohttpUtils();
                }
            }
        }
        return sUtils;
    }

    /**
     * 下载队列.
     */
    public static DownloadQueue getDownloadInstance() {
        if (downloadQueue == null)
            downloadQueue = NoHttp.newDownloadQueue(1);
        return downloadQueue;
    }


    /**
     * 添加请求
     *
     * @param mActivity activity
     * @param what      请求码，用来区分队列中的请求
     * @param request   请求
     * @param callback  请求回调
     * @param canCanel  是否可以取消请求
     * @param isLoading 是否弹出对话框
     * @param <T>
     */
    public <T> void add(Activity mActivity, int what, Request<T> request, HttpListener<T> callback, boolean canCanel, boolean isLoading, String msg) {
        mQueue.add(what, request, new HttpResponseListener<T>(mActivity, request, callback, canCanel, isLoading, msg));
    }


    public <T> void add(Activity mActivity, int what, Request<T> request, HttpListener<T> callback) {
        mQueue.add(what, request, new HttpResponseListener<T>(mActivity, request, callback, true, true, "加载中..."));
    }

    /**
     * 取消这个sign这个标记的所有请求
     *
     * @param sign
     */
    public void cancelBySign(Object sign) {
        mQueue.cancelBySign(sign);
    }

    /**
     * 取消队列中所有请求
     */
    public void cancelAll() {
        mQueue.cancelAll();
    }

    /**
     * 退出App停止所有请求
     */
    public void stopAll() {
        mQueue.stop();
    }

    public static SSLSocketFactory getSSLSocketFactory(Context context){
        try {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            String certificateAlias = Integer.toString(0);
            keyStore.setCertificateEntry(certificateAlias, certificateFactory.
                    generateCertificate(context.getResources().openRawResource(R.raw.ca1)));
            SSLContext sslContext = SSLContext.getInstance("TLS");
            final TrustManagerFactory trustManagerFactory =
                    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);
            sslContext.init
                    (
                            null,
                            trustManagerFactory.getTrustManagers(),
                            new SecureRandom()
                    );
            return sslContext.getSocketFactory();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
}