package com.nickming.tbs_webview_module;

import android.app.Activity;
import android.graphics.Bitmap;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;

import java.util.Map;

import javax.annotation.Nullable;

/**
 * class description here
 *
 * @author nickming
 * @version 1.0.0
 * @since 2017-07-23 下午9:16
 * Copyright (c) 2017 nickming All right reserved.
 */

public class TbsWebViewManager extends SimpleViewManager<WebView> {

    private static final String TBS_WEBVIEW = "TBSWebView";

    private String BLANK_URL = "http://www.baidu.com";

    public static final int GO_BACK = 1;

    public static final int GO_FORWARD = 2;

    public static final int RELOAD = 3;

    public static final int POST_MESSAGE = 4;

    private String mInterceptUrl = "";

    protected ReactApplicationContext mReactApplicationContext;

    public TbsWebViewManager(ReactApplicationContext reactApplicationContext) {
        this.mReactApplicationContext = reactApplicationContext;
    }

    @Override
    public String getName() {
        return TBS_WEBVIEW;
    }

    @Override
    protected WebView createViewInstance(final ThemedReactContext reactContext) {
        WebView webView = new WebView(reactContext);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageStarted(WebView webView, String s, Bitmap bitmap) {
                super.onPageStarted(webView, s, bitmap);
            }

            @Override
            public void onPageFinished(WebView webView, String s) {
                super.onPageFinished(webView, s);
            }

            @Override
            public void onReceivedError(WebView webView, int i, String s, String s1) {
                super.onReceivedError(webView, i, s, s1);
            }


            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String s) {
                WritableMap writableMap = Arguments.createMap();
                writableMap.putString("currentUrl", s);
                reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
                        webView.getId(), "shouldOverrideUrlLoading", writableMap);
                if (s.equals(mInterceptUrl)) {
                    return true;
                }
                return false;
            }
        });
        return webView;
    }

    @Override
    public void onDropViewInstance(WebView view) {
        super.onDropViewInstance(view);
        view.destroy();
    }

    @ReactProp(name = "url")
    public void setUrl(final WebView webView, final String url) {
        Activity activity = mReactApplicationContext.getCurrentActivity();
        if (activity != null) {
            if (url != null) {
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        webView.loadUrl(url);
                    }
                });
            } else {
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        webView.loadUrl(BLANK_URL);
                    }
                });
            }
        }
    }

//    @ReactProp(name = "javaScriptEnabled")
//    public void setJavaScriptEnabled(WebView webView, boolean enabled) {
//        WebSettings webSettings = webView.getSettings();
//        webSettings.setJavaScriptEnabled(enabled);
//    }

    @Nullable
    @Override
    public Map<String, Integer> getCommandsMap() {
        return super.getCommandsMap();
    }

    @Override
    public void receiveCommand(WebView root, int commandId, @Nullable ReadableArray args) {
        super.receiveCommand(root, commandId, args);
    }

    @Nullable
    @Override
    public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
        return super.getExportedCustomBubblingEventTypeConstants();
    }

//    @ReactProp(name = "blankUrl")
//    public void setBlankUrl(WebView webView, String url) {
//        this.BLANK_URL = url;
//    }
//
//    @ReactProp(name = "interceptUrl")
//    public void setInterceptUrl(WebView webView, String url) {
//        mInterceptUrl = url;
//    }


}
