package com.u9porn.ui.porn9forum.browse9forum;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.widget.SwipeRefreshLayout;
import android.text.InputType;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.orhanobut.logger.Logger;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
import com.sdsmdg.tastytoast.TastyToast;
import com.u9porn.R;
import com.u9porn.data.model.F9PronItem;
import com.u9porn.data.model.HostJsScope;
import com.u9porn.ui.MvpActivity;
import com.u9porn.ui.images.viewimage.PictureViewerActivity;
import com.u9porn.utils.AppCacheUtils;
import com.u9porn.utils.AppUtils;
import com.u9porn.utils.StringUtils;
import com.u9porn.constants.Keys;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

import javax.inject.Inject;

import butterknife.BindView;
import butterknife.ButterKnife;
import cn.pedant.SafeWebViewBridge.InjectedChromeClient;

/**
 * @author flymegoc
 */
public class Browse9PForumActivity extends MvpActivity<Browse9View, Browse9Presenter> implements Browse9View, SwipeRefreshLayout.OnRefreshListener {

    private static final String TAG = Browse9PForumActivity.class.getSimpleName();
    @BindView(R.id.webview)
    WebView mWebView;
    @BindView(R.id.swipe_layout)
    SwipeRefreshLayout swipeLayout;
    @BindView(R.id.fab_function)
    FloatingActionButton fabFunction;
    private F9PronItem f9PronItem;
    private ArrayList<String> imageList;
    private Stack<Long> historyIdStack;
    @Inject
    protected Browse9Presenter browse9Presenter;

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_browse9_porn);
        ButterKnife.bind(this);
        historyIdStack = new Stack<>();
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setAppCachePath(AppCacheUtils.getRxCacheDir(context).getAbsolutePath());
        mWebView.setWebChromeClient(
                new InjectedChromeClient("HostApp", HostJsScope.class)
        );
        mWebView.setBackgroundColor(0);
        mWebView.setBackgroundResource(0);
        mWebView.setVisibility(View.INVISIBLE);
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url.contains("tid=")) {
                    int starIndex = url.indexOf("tid=");
                    String tidStr = StringUtils.subString(url, starIndex + 4, starIndex + 10);
                    if (!TextUtils.isEmpty(tidStr) && TextUtils.isDigitsOnly(tidStr)) {
                        Long id = Long.parseLong(tidStr);
                        presenter.loadContent(id);
                        historyIdStack.push(id);
                    } else {
                        Logger.t(TAG).d(tidStr);
                        showMessage("暂不支持直接打开此链接", TastyToast.INFO);
                    }
                }
                return true;
            }
        });
        AppUtils.setColorSchemeColors(context, swipeLayout);
        f9PronItem = (F9PronItem) getIntent().getSerializableExtra(Keys.KEY_INTENT_BROWSE_FORUM_9PORN_ITEM);
        presenter.loadContent(f9PronItem.getTid());
        historyIdStack.push(f9PronItem.getTid());
        imageList = new ArrayList<>();
        boolean needShowTip = presenter.isNeedShowTipFirstViewForum9Content();
        if (needShowTip) {
            showTipDialog();
        }

        fabFunction.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showOpenNewForum();
            }
        });
    }

    private void showOpenNewForum() {
        final QMUIDialog.EditTextDialogBuilder builder = new QMUIDialog.EditTextDialogBuilder(this);
        builder.setTitle("打开新帖子");
        builder.setPlaceholder("请输入帖子Tid");
        builder.setInputType(InputType.TYPE_CLASS_NUMBER);
        builder.addAction("打开", new QMUIDialogAction.ActionListener() {
            @Override
            public void onClick(QMUIDialog dialog, int index) {
                String tidStr = builder.getEditText().getText().toString().trim();
                if (!TextUtils.isEmpty(tidStr) && TextUtils.isDigitsOnly(tidStr) && tidStr.length() <= 6) {
                    Long id = Long.parseLong(tidStr);
                    presenter.loadContent(id);
                    historyIdStack.push(id);
                    dialog.dismiss();
                } else {
                    showMessage("请输入正确的帖子tid", TastyToast.INFO);
                }
            }
        });
        builder.addAction("返回", new QMUIDialogAction.ActionListener() {
            @Override
            public void onClick(QMUIDialog dialog, int index) {
                dialog.dismiss();
            }
        });
        builder.show();
    }

    private void showTipDialog() {
        QMUIDialog.MessageDialogBuilder builder = new QMUIDialog.MessageDialogBuilder(this);
        builder.setTitle("温馨提示");
        builder.setMessage("1. 如果你看不到网页内容或者报错了,说明当前页面结构还不支持解析\n" +
                "2. 在你网速慢或者图片较大或者服务器响应慢的情况下,你会只看到少少的几行文字,这是正常的,你可以多刷新几次试试\n" +
                "3. 你可以点击某一张图进入浏览图片模式\n" +
                "4. 目前不支持查看评论及部分网页未适配屏幕宽度");
        builder.addAction("我知道了", new QMUIDialogAction.ActionListener() {
            @Override
            public void onClick(QMUIDialog dialog, int index) {
                presenter.setNeedShowTipFirstViewForum9Content(false);
                dialog.dismiss();
            }
        });
        builder.show();
    }


    @Override
    protected void onStart() {
        super.onStart();
        HostJsScope.setOnImageClick(onImageClick);
    }

    @Override
    protected void onStop() {
        super.onStop();
        HostJsScope.removeOnImageClick();
    }

    private HostJsScope.OnImageClick onImageClick = new HostJsScope.OnImageClick() {
        @Override
        public void onClick(String imageUrl) {
            Intent intent = new Intent(Browse9PForumActivity.this, PictureViewerActivity.class);
            intent.putExtra(Keys.KEY_INTENT_PICTURE_VIEWER_CURRENT_IMAGE_POSITION, imageList.indexOf(imageUrl));
            intent.putStringArrayListExtra(Keys.KEY_INTENT_PICTURE_VIEWER_IMAGE_ARRAY_LIST, imageList);
            startActivityWithAnimation(intent);
        }
    };

    @NonNull
    @Override
    public Browse9Presenter createPresenter() {
        return browse9Presenter;
    }

    @Override
    public void showLoading(boolean pullToRefresh) {
        swipeLayout.setRefreshing(pullToRefresh);
    }

    @Override
    public void showContent() {
        swipeLayout.setRefreshing(false);
    }

    @Override
    public void showMessage(String msg, int type) {
        super.showMessage(msg, type);
    }

    @Override
    public void showError(String message) {
        swipeLayout.setRefreshing(false);
        showMessage(message, TastyToast.ERROR);
    }

    @Override
    public void loadContentSuccess(String contentHtml, List<String> contentImageList, boolean isNightModel) {
        imageList.clear();
        imageList.addAll(contentImageList);
        //mWebView.loadUrl("about:blank");;
        String html = AppUtils.buildHtml(AppUtils.buildTitle(f9PronItem.getTitle(), f9PronItem.getAuthor(), f9PronItem.getAuthorPublishTime()) + contentHtml, isNightModel);

        mWebView.loadDataWithBaseURL("", html, "text/html", "utf-8", null);
        //mWebView.loadData(StringEscapeUtils.escapeHtml4(f9PornContent.getContent()), "text/html", "UTF-8");
        mWebView.setVisibility(View.VISIBLE);
    }

    @Override
    public void onRefresh() {
        presenter.loadContent(f9PronItem.getTid());
    }

    @Override
    protected void onDestroy() {
        if (mWebView != null) {

            // 如果先调用destroy()方法,则会命中if (isDestroyed()) return;这一行代码,需要先onDetachedFromWindow(),再
            // destory()
            ViewParent parent = mWebView.getParent();
            if (parent != null) {
                ((ViewGroup) parent).removeView(mWebView);
            }

            mWebView.stopLoading();
            // 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错
            mWebView.getSettings().setJavaScriptEnabled(false);
            mWebView.clearHistory();
            mWebView.loadUrl("about:blank");
            mWebView.clearView();
            mWebView.removeAllViews();
            mWebView.destroy();

        }
        super.onDestroy();
    }

    @Override
    public void onBackPressed() {
        if (!historyIdStack.empty()) {
            historyIdStack.pop();
        }
        if (!historyIdStack.empty()) {
            presenter.loadContent(historyIdStack.peek());
            return;
        }
        super.onBackPressed();
    }
}