package com.hjhrq1991.library.tbs;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.KeyEvent;

import com.tencent.smtt.export.external.interfaces.ClientCertRequest;
import com.tencent.smtt.export.external.interfaces.HttpAuthHandler;
import com.tencent.smtt.export.external.interfaces.SslError;
import com.tencent.smtt.export.external.interfaces.SslErrorHandler;
import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
import com.tencent.smtt.export.external.interfaces.WebResourceResponse;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

/**
 * @author hjhrq1991 created at 8/22/16 14 41.
 */
public class BridgeWebViewClient extends WebViewClient {
    private TbsBridgeWebView webView;
    /**
     * 是否重定向,避免web为渲染即跳转导致系统未调用onPageStarted就调用onPageFinished方法引起的js桥初始化失败
     */
    private boolean isRedirected;
    /**
     * onPageStarted连续调用次数,避免渲染立马跳转可能连续调用onPageStarted多次并且调用shouldOverrideUrlLoading后不调用onPageStarted引起的js桥未初始化问题
     */
    private int onPageStartedCount = 0;
    private BridgeWebViewClientListener bridgeWebViewClientListener;

    public BridgeWebViewClient(TbsBridgeWebView webView) {
        this.webView = webView;
    }

    public void setBridgeWebViewClientListener(BridgeWebViewClientListener bridgeWebViewClientListener) {
        this.bridgeWebViewClientListener = bridgeWebViewClientListener;
    }

    public void removeListener() {
        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener = null;
        }
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        //modify:hjhrq1991,web为渲染即跳转导致系统未调用onPageStarted就调用onPageFinished方法引起的js桥初始化失败
        if (onPageStartedCount < 2) {
            isRedirected = true;
        }
        onPageStartedCount = 0;

        try {
            url = URLDecoder.decode(url, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        if (url.startsWith(BridgeUtil.YY_RETURN_DATA)) { // 如果是返回数据
            webView.handlerReturnData(url);
            return true;
        } else if (url.startsWith(BridgeUtil.YY_OVERRIDE_SCHEMA)) { //
            webView.flushMessageQueue();
            return true;
        } else {
            if (bridgeWebViewClientListener != null) {
                return bridgeWebViewClientListener.shouldOverrideUrlLoading(view, url);
            } else {
                return super.shouldOverrideUrlLoading(view, url);
            }
        }
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        //modify:hjhrq1991,web为渲染即跳转导致系统未调用onPageStarted就调用onPageFinished方法引起的js桥初始化失败
        isRedirected = false;
        onPageStartedCount++;

        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.onPageStarted(view, url, favicon);
        }
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        //modify:hjhrq1991,web为渲染即跳转导致系统未调用onPageStarted就调用onPageFinished方法引起的js桥初始化失败
        if (BridgeConfig.toLoadJs != null && !url.contains("about:blank") && !isRedirected) {
            BridgeUtil.webViewLoadLocalJs(view, BridgeConfig.toLoadJs, BridgeConfig.defaultJs, BridgeConfig.customJs);
        }

        if (webView.getStartupMessage() != null) {
            for (Message m : webView.getStartupMessage()) {
                webView.dispatchMessage(m);
            }
            webView.setStartupMessage(null);
        }

        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.onPageFinished(view, url);
        }
    }

    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.onReceivedError(view, errorCode, description, failingUrl);
        }
    }

    @Override
    public void onLoadResource(WebView webView, String s) {
        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.onLoadResource(webView, s);
        }
    }

    @Override
    public void onReceivedHttpError(WebView webView, WebResourceRequest webResourceRequest, WebResourceResponse webResourceResponse) {
        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.onReceivedHttpError(webView, webResourceRequest, webResourceResponse);
        }
    }

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView webView, String s) {
        if (bridgeWebViewClientListener != null) {
            return bridgeWebViewClientListener.shouldInterceptRequest(webView, s);
        } else {
            return super.shouldInterceptRequest(webView, s);
        }
    }

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest) {
        if (bridgeWebViewClientListener != null) {
            return bridgeWebViewClientListener.shouldInterceptRequest(webView, webResourceRequest);
        } else {
            return super.shouldInterceptRequest(webView, webResourceRequest);
        }
    }

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest, Bundle bundle) {
        if (bridgeWebViewClientListener != null) {
            return bridgeWebViewClientListener.shouldInterceptRequest(webView, webResourceRequest, bundle);
        } else {
            return super.shouldInterceptRequest(webView, webResourceRequest, bundle);
        }
    }

    @Override
    public void doUpdateVisitedHistory(WebView webView, String s, boolean b) {
        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.doUpdateVisitedHistory(webView, s, b);
        }
    }

    @Override
    public void onFormResubmission(WebView webView, android.os.Message message, android.os.Message message1) {
        boolean interrupt = false;
        if (bridgeWebViewClientListener != null) {
            interrupt = bridgeWebViewClientListener.onFormResubmission(webView, message, message1);
        }
        if (!interrupt) {
            super.onFormResubmission(webView, message, message1);
        }
    }

    @Override
    public void onReceivedHttpAuthRequest(WebView webView, HttpAuthHandler httpAuthHandler, String s, String s1) {
        boolean interrupt = false;
        if (bridgeWebViewClientListener != null) {
            interrupt = bridgeWebViewClientListener.onReceivedHttpAuthRequest(webView, httpAuthHandler, s, s1);
        }
        if (!interrupt) {
            super.onReceivedHttpAuthRequest(webView, httpAuthHandler, s, s1);
        }
    }

    @Override
    public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) {
        boolean interrupt = false;
        if (bridgeWebViewClientListener != null) {
            interrupt = bridgeWebViewClientListener.onReceivedSslError(webView, sslErrorHandler, sslError);
        }
        if (!interrupt) {
            super.onReceivedSslError(webView, sslErrorHandler, sslError);
        }
    }

    @Override
    public void onReceivedClientCertRequest(WebView webView, ClientCertRequest clientCertRequest) {
        boolean interrupt = false;
        if (bridgeWebViewClientListener != null) {
            interrupt = bridgeWebViewClientListener.onReceivedClientCertRequest(webView, clientCertRequest);
        }
        if (!interrupt) {
            super.onReceivedClientCertRequest(webView, clientCertRequest);
        }
    }

    @Override
    public void onScaleChanged(WebView webView, float v, float v1) {
        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.onScaleChanged(webView, v, v1);
        }
    }

    @Override
    public void onUnhandledKeyEvent(WebView webView, KeyEvent keyEvent) {
        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.onUnhandledKeyEvent(webView, keyEvent);
        }
    }

    @Override
    public boolean shouldOverrideKeyEvent(WebView webView, KeyEvent keyEvent) {
        if (bridgeWebViewClientListener != null) {
            return bridgeWebViewClientListener.shouldOverrideKeyEvent(webView, keyEvent);
        } else {
            return super.shouldOverrideKeyEvent(webView, keyEvent);
        }
    }

    @Override
    public void onTooManyRedirects(WebView webView, android.os.Message message, android.os.Message message1) {
        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.onTooManyRedirects(webView, message, message1);
        }
    }

    @Override
    public void onReceivedLoginRequest(WebView webView, String s, String s1, String s2) {
        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.onReceivedLoginRequest(webView, s, s1, s2);
        }
    }

    @Override
    public void onDetectedBlankScreen(String s, int i) {
        if (bridgeWebViewClientListener != null) {
            bridgeWebViewClientListener.onDetectedBlankScreen(s, i);
        }
    }
}