package com.rnboat.framework.widge;

import android.content.Context;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;


public class RNBoatWebView extends WebView {

    private static final String TAG = "RNBoatWebView";

    private Context mContext;

    private WebSettings mWebSettings;

    public RNBoatWebView(Context context) {
        super(context);
        init(context);
    }

    public RNBoatWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public RNBoatWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    /**
     * 初始化
     *
     * @param context
     */
    private void init(Context context) {
        mContext = context;
        initDefaultWebSettings();
        addJavascriptInterface(new JavascriptHandler(mContext), "webkit");
        setWebChromeClient(new WebChromeClient());
        setWebViewClient(new RNBoatWebViewClient());
    }

    /**
     * 初始化默认的WebSettings属性
     * 由于是继承了CordovaWebView，有部分属性已经在父类里设置（例如 支持JS，增加WebView缓存等）
     */
    private void initDefaultWebSettings() {
        mWebSettings = getSettings();
        // 不支持界面放大缩小
        mWebSettings.setSupportZoom(false);
        mWebSettings.setBuiltInZoomControls(false);
        mWebSettings.setDisplayZoomControls(false);
        // 将图片调整到合适WebView的大小
        mWebSettings.setUseWideViewPort(true);
        // 缩放至屏幕的大小
        mWebSettings.setLoadWithOverviewMode(true);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        mWebSettings.setJavaScriptEnabled(true);
        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
        mWebSettings.setSaveFormData(false);
        mWebSettings.setDomStorageEnabled(true);
        mWebSettings.setGeolocationEnabled(true);
        mWebSettings.setAppCacheEnabled(true);
    }

    /**
     * 暴露出WebSettings对象,方便调用者设置不同于默认属性的WebSettings的值
     *
     * @return WebSettings对象
     */
    public WebSettings getWebSettings() {
        return mWebSettings;
    }

    @Override
    public void loadUrl(String url) {
        //为url添加cookie 便于与H5统一校验sessionkey与uid
        CookieManager cookieManager = CookieManager.getInstance();
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            CookieSyncManager.createInstance(getContext());
        }
        if (!TextUtils.isEmpty(url)) {
            cookieManager.setAcceptCookie(true);
            cookieManager.setCookie(url, "app_client_type=android");
            cookieManager.setCookie(url, "app_version=" + "v1.0");

            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                CookieSyncManager.createInstance(getContext()).sync();
            } else {
                cookieManager.setAcceptThirdPartyCookies(this, true);
                cookieManager.flush();
            }
        }
        super.loadUrl(url);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (mScrollChangeListener != null) {
            mScrollChangeListener.onScrollChange(this, l, t, oldl, oldt);
        }
    }

    public interface OnScrollChangeListener {
        void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY);
    }

    private OnScrollChangeListener mScrollChangeListener;

    /**
     * 用于监听WebView的滚动
     * 当api版本>23时，可以直接使用系统提供的setOnScrollChangeListener函数
     *
     * @param l
     */
    public void setScrollChangeListener(OnScrollChangeListener l) {
        mScrollChangeListener = l;
    }

    class JavascriptHandler {
        private Context mContext;

        public JavascriptHandler(Context context) {
            mContext = context;
        }

        @JavascriptInterface
        public void push(String params) {
        }

        @JavascriptInterface
        public void pop(String params) {

        }

        @JavascriptInterface
        public void popToRoot(String params) {
        }

        @JavascriptInterface
        public void resetTo(String params) {
        }
    }
}
