package com.yxz.alitop;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.os.Build;
import android.support.annotation.Nullable;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.webkit.JavascriptInterface;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

import com.alibaba.baichuan.android.trade.AlibcTrade;
import com.alibaba.baichuan.android.trade.callback.AlibcTradeCallback;
import com.alibaba.baichuan.android.trade.model.AlibcShowParams;
import com.alibaba.baichuan.android.trade.model.OpenType;
import com.alibaba.baichuan.android.trade.page.AlibcBasePage;
import com.alibaba.baichuan.android.trade.page.AlibcMyOrdersPage;
import com.alibaba.baichuan.trade.biz.context.AlibcResultType;
import com.alibaba.baichuan.trade.biz.context.AlibcTradeResult;
import com.alibaba.baichuan.trade.biz.login.AlibcLogin;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.events.RCTEventEmitter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by wangfaguo on 2018/7/18.
 */

public class ItemOrderViewManager extends ViewGroupManager<WebView> {
    private static final String REACT_CLASS = "RCTItemOrderView";

    private ThemedReactContext mReactContext;
    private WebViewClient webViewClient;
    private WebChromeClient webChromeClient;
    private String itemId;
    private WebView webView;
    public String getName() {
        return REACT_CLASS;
    }


    public WebView createViewInstance(ThemedReactContext context) {
        mReactContext = context;
        WebView webView =  new WebView(context);
        setListeners(webView);
        showOrderView(webView);
        this.webView = webView;
        return webView;
    }

    @ReactProp(name="itemId")
    public void setItemId(WebView webView, String itemId) {
        this.itemId = itemId;
    }
//    @JavascriptInterface
//    public void showSource(String html) {
//        System.out.println("====>html====" + html);
//        if(html.length() > 0){
//            WritableMap writableMap = Arguments.createMap();
//            writableMap.putString("html", html);
//            sendEvent(this.webView,"onChangHtml",writableMap);
//        }
//    }
    @SuppressLint("SetJavaScriptEnabled")
    private void setListeners(final WebView webView) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            webView.getSettings().setSafeBrowsingEnabled(false);
        }
        // 开启JavaScript支持
        webView.getSettings().setJavaScriptEnabled(true);

        webView.addJavascriptInterface(new InJavaScriptLocalObj(webView), "java_obj");
        WebViewClient webViewClient = new WebViewClient(){
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                return super.shouldOverrideUrlLoading(view, request);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                view.loadUrl("javascript:window.java_obj.showSource("
                        + "document.getElementsByTagName('body')[0].innerHTML);");
                super.onPageFinished(view, url);
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
            }

            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                return super.shouldInterceptRequest(view, request);
            }
        };
        WebChromeClient webChromeClient = new WebChromeClient(){
            /**
             * 当网页调用alert()来弹出alert弹出框前回调，用以拦截alert()函数
             */
            public boolean onJsAlert(WebView view, String url, String message,JsResult result){
             return true;
            }

            /**
             * 当网页调用confirm()来弹出confirm弹出框前回调，用以拦截confirm()函数
             */
            public boolean onJsConfirm(WebView view, String url, String message,JsResult result){
                return true;

            }
            /**
             * 当网页调用prompt()来弹出prompt弹出框前回调，用以拦截prompt()函数
             */
            public boolean onJsPrompt(WebView view, String url, String message,String defaultValue, JsPromptResult result){
                return true;

            }
            /**
             * 打印 console 信息
             */
            public boolean onConsoleMessage(ConsoleMessage consoleMessage){
                return true;

            }
            /**
             * 通知程序当前页面加载进度
             */
            public void onProgressChanged(WebView view, int newProgress){

            }
        };

        webView.setWebViewClient(webViewClient);
        webView.setWebChromeClient(webChromeClient);
        this.webViewClient = webViewClient;
        this.webChromeClient = webChromeClient;

    }

    private void showOrderView(final WebView webView){

        final AlibcLogin alibcLogin = AlibcLogin.getInstance();
        if(!alibcLogin.isLogin()){
            WritableMap params = Arguments.createMap();
            params.putString("html", "");
            params.putString("openId", "");
            this.sendEvent(webView,"onChangeHtml",params);
            return;
        }
        //获取当前Activity
        final Activity activity = MyActivityManager.getInstance().getCurrentActivity();
        if (activity == null) {
            return;
        }
        AlibcShowParams showParams = new AlibcShowParams();
        showParams.setOpenType(OpenType.Auto);
        showParams.setOpenType(OpenType.H5);
        showParams.setBackUrl("tbopen23140447");
        Map<String, String> exParams = new HashMap<>();
        AlibcBasePage itemOrderPage = new AlibcMyOrdersPage(0,false);
        AlibcTrade.show(activity, webView, this.webViewClient, this.webChromeClient, itemOrderPage, showParams, null, exParams, new AlibcTradeCallback() {
            @Override
            public void onTradeSuccess(AlibcTradeResult alibcTradeResult) {

            }

            @Override
            public void onFailure(int i, String s) {

            }
        });

    }
    public final class InJavaScriptLocalObj{

        WebView webView;
        InJavaScriptLocalObj(WebView webView){
            this.webView = webView;
        }
        @JavascriptInterface
        public void showSource(String html) {
            final AlibcLogin alibcLogin = AlibcLogin.getInstance();
            if(html.length() > 0){
                WritableMap writableMap = Arguments.createMap();
                writableMap.putString("html", html);
                writableMap.putString("openId", alibcLogin.getSession().openId);
                sendEvent(this.webView,"onChangHtml",writableMap);
            }
            System.out.println("====>html====" + html);
//            WritableMap params = Arguments.createMap();
//            params.putString("html", html);
//            params.putString("openId", "");
//            this.sendEvent(webView,"onChangeHtml",params);
        }

    }
        /**
         *
         * @param eventName
         * @param params
         */
    private void sendEvent(WebView webView, String eventName, @Nullable WritableMap params) {
        WritableMap event = Arguments.createMap();
        event.putMap("params", params);
        event.putString("type", eventName);
        mReactContext
                .getJSModule(RCTEventEmitter.class)
                .receiveEvent(webView.getId(),
                        "topChange",
                        event);
    }

}
