package com.sheep.gamegroup.view.activity;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.View;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.sheep.gamegroup.absBase.IJumpWeb;
import com.sheep.gamegroup.util.CommonUtil;
import com.sheep.gamegroup.util.LogUtil;
import com.sheep.gamegroup.util.TestUtil;
import com.sheep.gamegroup.util.ViewUtil;
import com.sheep.gamegroup.util.js.BaseActWeb;
import com.sheep.gamegroup.util.js.KFZSJs;
import com.sheep.jiuyan.samllsheep.BuildConfig;
import com.sheep.jiuyan.samllsheep.R;
import com.sheep.jiuyan.samllsheep.utils.G;
import com.sheep.jiuyan.samllsheep.utils.TitleBarUtils;
import com.yalantis.ucrop.util.FileUtils;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import butterknife.BindView;
import okhttp3.Call;


/**
 * web页面--含有所有js及url后添加authorization
 * Created by zengjiebin on 2018/4/27.
 */
public class ActWeb extends BaseActWeb {

    @BindView(R.id.webview)
    WebView mWebView;
    @BindView(R.id.layout_navigationBar)
    View layout_navigationBar;

    private String title;//title为空时，不显示整个标题栏
    private boolean needJsInteract;//是否需要js交互,有js交互的会对url进行操作：拼接token到后面
    private WebSettings webViewSettings;

    @Override
    protected int getLayoutId() {
        return R.layout.act_web_x5;
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    public void initView() {
        Intent intent = getIntent();
        String url = intent.getStringExtra(IJumpWeb.KEY_URL);
        title = intent.getStringExtra(IJumpWeb.KEY_TITLE);//title为空时，不显示整个标题栏
        needJsInteract = intent.getBooleanExtra(IJumpWeb.KEY_NEEDJSINTERACT, false);
        String jsUrl = intent.getStringExtra(IJumpWeb.KEY_JSURL);
        if (!TextUtils.isEmpty(url)) {
            url = url.trim();
        }
        TitleBarUtils
                .getInstance()
                .setTitle(this, TextUtils.isEmpty(title) ? "加载中" : title)
                .setTitleFinish(this);
        initWebViewSettings(mWebView);
        webViewSettings = mWebView.getSettings();
        webViewSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        try {
            if (TestUtil.isTest())
                WebView.setWebContentsDebuggingEnabled(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webViewSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        if (TextUtils.isEmpty(jsUrl)) {
            loadUrl(url);
        } else {
            initJsData(url, jsUrl);
        }
    }

    //初始化js代码数据
    private void initJsData(final String url, String jsUrl) {
        OkHttpUtils.get()
                .url(jsUrl)
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        G.showToast(R.string.service_data_error);
                    }

                    @Override
                    public void onResponse(String response, int id) {
                        js = response;
                        loadUrl(url);
                    }
                });
    }

    @Override
    public void initListener() {
        CommonUtil.getInstance().setDownloadListener(this, mWebView);
    }

    public static void initWebViewSettings(WebView webView) {
        webView.setClickable(true);
        WebSettings webSetting = webView.getSettings();
        webSetting.setJavaScriptEnabled(true);
        webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
        webSetting.setAllowFileAccess(true);
        webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
//        webSetting.setSupportZoom(true);
//        webSetting.setBuiltInZoomControls(true);
        webSetting.setUseWideViewPort(true);
        webSetting.setSupportMultipleWindows(true);
        // webSetting.setLoadWithOverviewMode(true);
        webSetting.setAppCacheEnabled(true);
        // webSetting.setDatabaseEnabled(true);
        webSetting.setDomStorageEnabled(true);
        webSetting.setGeolocationEnabled(true);
        webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
        // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
        webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
        // webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
        webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);

        // this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
        // settings 的设计
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mWebView != null) {
            mWebView.setVisibility(View.GONE);
            mWebView.removeAllViews();
            mWebView.destroy();
        }
    }

    /**
     *
     */
    public static final int INPUT_FILE_REQUEST_CODE = 1;
    private ValueCallback<Uri> mUploadMessage;
    private final static int FILECHOOSER_RESULTCODE = 2;
    private ValueCallback<Uri[]> mFilePathCallback;

    private String mCameraPhotoPath;

    private void loadUrl(final String url) {

        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                if (ActWeb.this.title == null)
                    TitleBarUtils
                            .getInstance()
                            .setTitle(ActWeb.this, title);
            }

            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
                if (mFilePathCallback != null) {
                    mFilePathCallback.onReceiveValue(null);
                }
                mFilePathCallback = filePathCallback;

                /*PhotoPicker.builder()
                        .setPhotoCount(1)
                        .setShowCamera(true)
                        .setShowGif(false)
                        .setPreviewEnabled(true)
                        .start(ActWeb.this, PhotoPicker.REQUEST_CODE);*/
                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                    // Create the File where the photo should go
                    File photoFile;
                    photoFile = createImageFile();
                    takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath);

                    // Continue only if the File was successfully created
                    if (photoFile != null) {
                        mCameraPhotoPath = "file:" + photoFile.getAbsolutePath();
                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                                Uri.fromFile(photoFile));
                    } else {
                    }
                }

                Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
                contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
                contentSelectionIntent.setType("image/*");

                Intent[] intentArray;
                takePictureIntent = null;//步调用相机
                if (takePictureIntent != null) {
                    intentArray = new Intent[]{takePictureIntent};
                } else {
                    intentArray = new Intent[0];
                }

                Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
                chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
                chooserIntent.putExtra(Intent.EXTRA_TITLE, "图片选择");
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);

                startActivityForResult(chooserIntent, INPUT_FILE_REQUEST_CODE);

                return /*super.onShowFileChooser(webView, filePathCallback, fileChooserParams)*/true;
            }

            //For Android 4.1
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                ActWeb.this.startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILECHOOSER_RESULTCODE);

            }

            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress == 100) {
                    String action = "javascript:imgsrc('" + url + "')";
                    runWebviewUrl(action);
                }
                super.onProgressChanged(view, newProgress);
            }
        });
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                LogUtil.println("ActWeb", "shouldOverrideUrlLoading", url);
                //微信H5支付核心代码
                if (url.startsWith("weixin://wap/pay?")) {
                    try {
                        Intent intent = new Intent();
                        intent.setAction(Intent.ACTION_VIEW);
                        intent.setData(Uri.parse(url));
                        startActivity(intent);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return true;
                } else if (url.startsWith("alipays:") || url.startsWith("alipay")) {
                    try {
                        startActivity(new Intent("android.intent.action.VIEW", Uri.parse(url)));
                    } catch (Exception e) {
                        new AlertDialog.Builder(ActWeb.this)
                                .setMessage("未检测到支付宝客户端，请安装后重试。")
                                .setPositiveButton("立即安装", new DialogInterface.OnClickListener() {

                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Uri alipayUrl = Uri.parse("https://d.alipay.com");
                                        startActivity(new Intent("android.intent.action.VIEW", alipayUrl));
                                    }
                                }).setNegativeButton("取消", null).show();
                    }
                    return true;
                } else if (url.contains("17xmy.com")) {
                    Map<String, String> extraHeaders = new HashMap<>();
                    extraHeaders.put("Referer", "http://17xmy.com");
                    view.loadUrl(url, extraHeaders);
                    return true;
                } else if (url.contains("kfzs.com") || (url.startsWith("http://10.8.") && TestUtil.isDev())) {
                    Map<String, String> extraHeaders = new HashMap<>();
                    extraHeaders.put("Referer", "http://kfzs.com");
                    view.loadUrl(url, extraHeaders);
                    return true;
                } else {
                    return false;
                }
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                LogUtil.println("ActWeb", "onPageStarted", url);
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                LogUtil.println("ActWeb", "onPageFinished", url);
                super.onPageFinished(view, url);
                imgReset();
                loadJs();
            }
        });
        webViewSettings.setJavaScriptEnabled(true);
        if (needJsInteract) {
            mWebView.addJavascriptInterface(new KFZSJs(this), "kfzsjs");
            String loadUrl = addUrlToken(url);
            LogUtil.println("ActWeb loadUrl = " + loadUrl);
            if (CommonUtil.getInstance().judgeUrlPicture(url)) {
                runWebviewUrl("file:///android_asset/loadImg.html");
            } else {
                mWebView.loadUrl(loadUrl);
            }
        } else {
            if (CommonUtil.getInstance().judgeUrlPicture(url)) {
                runWebviewUrl("file:///android_asset/loadImg.html");
            } else {
                mWebView.loadUrl(url);
            }
        }
    }

    //在sdcard卡创建缩略图
    //createImageFileInSdcard
    @SuppressLint("SdCardPath")
    private File createImageFile() {
        //mCameraPhotoPath="/mnt/sdcard/tmp.png";
        File file = new File(Environment.getExternalStorageDirectory() + "/", "tmp.png");
        mCameraPhotoPath = file.getAbsolutePath();
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }

    /**
     * 是否响应返回键
     */
    private boolean responseBack = true;

    @Override
    public void onBackPressed() {
        if (responseBack)
            super.onBackPressed();
        else {
            loadJs("onBackPressed()");
        }
    }

    @Override
    public void loadJs(String js) {
        ViewUtil.loadJs(mWebView, js);
    }

    @Override
    public void finish() {
        if (mWebView != null && mWebView.canGoBack()) {
            mWebView.goBack();
            return;
        }
        super.finish();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == mUploadMessage) return;
            Uri result = data == null || resultCode != RESULT_OK ? null
                    : data.getData();
            if (result != null) {
                String imagePath = FileUtils.getPath(this, result);
                if (!TextUtils.isEmpty(imagePath)) {
                    result = Uri.parse("file:///" + imagePath);
                }
            }
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        } else if (requestCode == INPUT_FILE_REQUEST_CODE && mFilePathCallback != null) {
            // 5.0的回调
            Uri[] results = null;

            // Check that the response is a good one
            if (resultCode == Activity.RESULT_OK) {
                if (data == null) {
                    // If there is not data, then we may have taken a photo
                    if (mCameraPhotoPath != null) {
                        results = new Uri[]{Uri.parse(mCameraPhotoPath)};
                    }
                } else {
                    String dataString = data.getDataString();
                    if (dataString != null) {
                        results = new Uri[]{Uri.parse(dataString)};
                    }
                }
            }

            mFilePathCallback.onReceiveValue(results);
            mFilePathCallback = null;
        } else {
            super.onActivityResult(requestCode, resultCode, data);
            return;
        }
    }

    private void imgReset() {
        ViewUtil.loadJs(mWebView, "(function(){" +
                "var objs = document.getElementsByTagName('img'); " +
                "for(var i=0;i<objs.length;i++)  " +
                "{"
                + "var img = objs[i];   " +
                " img.style.maxWidth = '100%';" +
                "}" +
                "})()");
    }

    private void runWebviewUrl(final String url) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mWebView != null && !TextUtils.isEmpty(url)) {
                    mWebView.loadUrl(url);
                }
            }
        });
    }

    // 注入js函数监听
    public void loadJs() {
        if (TextUtils.isEmpty(js))
            return;
        ViewUtil.loadJs(mWebView, getJs());
        LogUtil.println("ActWeb", "loadJs", js);
    }

    private String js;

    private String getJs() {
        String testJsStart = "alert('成功注入');";
        return BuildConfig.DEBUG ? testJsStart + "\n" + js : js;
    }

    @Override
    public boolean isResponseBack() {
        return responseBack;
    }

    @Override
    public void setResponseBack(boolean responseBack) {
        this.responseBack = responseBack;
    }

    @Override
    public void clearWebView() {
        mWebView = null;
    }

    @Override
    public void showTitleBar(boolean isShow) {
        ViewUtil.setVisibility(layout_navigationBar, isShow);
    }
}
