package com.time.cat.ui.modules.copy;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.BottomSheetBehavior;
import android.support.design.widget.BottomSheetDialog;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.time.cat.R;
import com.time.cat.data.Constants;
import com.time.cat.ui.modules.activity.TimeCatActivity;
import com.time.cat.ui.base.BaseActivity;
import com.time.cat.ui.widgets.arc_float_view.ArcTipViewController;
import com.time.cat.util.UrlCountUtil;
import com.time.cat.util.override.ToastUtil;
import com.time.cat.util.view.ViewUtil;
import com.timecat.commonjar.contentProvider.SPHelper;
import com.timecat.utils.StatusBarCompat;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

public class CopyActivity extends BaseActivity {
    private FrameLayout copyNodeViewContainer;
    private FloatingActionButton copyFab;
    private FloatingActionButton exitFab;
    private FloatingActionButton exitFullScreenFab;
    private Menu menu;
    private List<CopyNodeView> selectedNodes;
    private OnCopyNodeViewClickCallback mOnCopyNodeViewClickCallback;
    private int actionBarHeight = 0;
    private BottomSheetDialog bottomSheetDialog;
    private boolean actionModeDestroying = false;
    private boolean isFullScreen = false;

    private void addCopyNodeView(CopyNode copyNode, int height) {
        (new CopyNodeView(this, copyNode, mOnCopyNodeViewClickCallback)).addToFrameLayout(copyNodeViewContainer, height);
    }

    private void adjustActionBar(boolean showTitle, boolean hadSelection) {
        menu.setGroupVisible(R.id.copy_actions, hadSelection);
        if (isFullScreen) {
            if (hadSelection) {
                exitFab.show();
                copyFab.show();
                exitFullScreenFab.show();
            } else {
                exitFab.show();
                copyFab.hide();
                exitFullScreenFab.show();
            }
        }

        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            if (showTitle) {
                actionBar.setTitle(R.string.copy_title);
                actionBar.setSubtitle(R.string.copy_subtitle);
                actionBar.setHomeAsUpIndicator(R.mipmap.ic_close_white_24dp);
                return;
            }

            actionBar.setTitle(null);
            actionBar.setSubtitle(null);
            actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
        }

    }

    private void setSelectTextToClipboard(TextView textView) {
//        ClipboardUtils.setText(this,getSelectedTextViewText(var1));

        Intent intent = new Intent(this, TimeCatActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(TimeCatActivity.TO_SPLIT_STR, getSelectedTextViewText(textView));
        startActivity(intent);
    }


    private String getSelectedTextViewText(TextView textView) {
        if (textView == null) {
            return getSelectedText();
        } else {
            CharSequence text = textView.getText();
            if (textView.getSelectionStart() == textView.getSelectionEnd()) {
                return text.toString();
            } else {
                CharSequence selected = text.subSequence(textView.getSelectionStart(), textView.getSelectionEnd());
                return selected != null ? selected.toString() : text.toString();
            }
        }
    }

    private void fullScreenMode(boolean fullScreen) {
        ActionBar actionBar = getSupportActionBar();
        isFullScreen = fullScreen;
        if (fullScreen) {
            if (actionBar != null) {
                actionBar.hide();
            }

            adjustActionBarWrap();
        } else {
            if (actionBar != null) {
                actionBar.show();
            }

            copyFab.hide();
            exitFab.hide();
            exitFullScreenFab.hide();
        }
        SPHelper.save(Constants.IS_FULL_SCREEN_COPY, fullScreen);
    }

    private void showSelectedText() {
        actionModeDestroying = false;
        adjustActionBar(false, false);
        bottomSheetDialog = new BottomSheetDialog(this) {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                StatusBarCompat.setTranslucentStatus(getWindow(), true);
            }
        };
        View view = getLayoutInflater().inflate(R.layout.dialog_copy_text_editor, null);
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        view.setLayoutParams(layoutParams);
        TextView textView = view.findViewById(R.id.text);
        textView.setText(getSelectedText());
        textView.setCustomSelectionActionModeCallback(new MySelectionActionModeCallback(textView));
        view.findViewById(R.id.fab_copy).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setSelectTextToClipboard(null);
                bottomSheetDialog.dismiss();
                finish();
            }
        });
        bottomSheetDialog.setContentView(view);
        ((View) view.getParent()).setBackgroundColor(getResources().getColor(android.R.color.transparent));
        BottomSheetBehavior behavior = BottomSheetBehavior.from((View) view.getParent());
        bottomSheetDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });
        bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                adjustActionBarWrap();
            }
        });
        bottomSheetDialog.show();

    }

    private void adjustActionBarWrap() {
        boolean showTitle = true;
        boolean hadSelection;
        hadSelection = selectedNodes.size() > 0;

        if (hadSelection) {
            showTitle = false;
        }

        adjustActionBar(showTitle, hadSelection);
    }

    private String getSelectedText() {
        StringBuilder text = new StringBuilder();

        for (int i = 0; i < selectedNodes.size(); ++i) {
            text.append(selectedNodes.get(i).getText());
            if (i + 1 < selectedNodes.size()) {
                text.append("\n");
            }
        }

        return text.toString();
    }

    public int getStatusBarHeight() {
        int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        return resId > 0 ? getResources().getDimensionPixelSize(resId) : (int) Math.ceil((double) (25.0F * getResources().getDisplayMetrics().density));
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArcTipViewController.getInstance().showHideFloatImageView();

        setContentView(R.layout.activity_copy_overlay);
        Toolbar toolbar = findViewById(R.id.toolbar);
        if (toolbar != null) {

            try {
                setSupportActionBar(toolbar);
            } catch (Throwable e) {
                e.printStackTrace();
            }

            getSupportActionBar().setTitle(R.string.copy_title);
            getSupportActionBar().setSubtitle(R.string.copy_subtitle);
            getSupportActionBar().setHomeAsUpIndicator(R.mipmap.ic_close_white_24dp);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);


        }

        selectedNodes = new ArrayList();
        mOnCopyNodeViewClickCallback = new OnCopyNodeViewClickCallback() {
            @Override
            public void onCopyNodeViewLongClick(CopyNodeView nodeView, boolean status) {
                if (status) {
                    selectedNodes.add(nodeView);
                    adjustActionBarWrap();
                    showSelectedText();
                } else {
                    selectedNodes.remove(nodeView);
                    adjustActionBarWrap();
                }
            }

            @Override
            public void onCopyNodeViewClick(CopyNodeView nodeView, boolean status) {
                if (status) {
                    selectedNodes.add(nodeView);
                    adjustActionBarWrap();
                } else {
                    selectedNodes.remove(nodeView);
                    adjustActionBarWrap();
                }
            }
        };
        copyFab = findViewById(R.id.fab_copy_main);
        copyFab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_COPY_FAB);
                setSelectTextToClipboard(null);
                finish();
            }
        });
        exitFab = findViewById(R.id.exit_button);
        exitFab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT_FAB);
                finish();
            }
        });
        exitFullScreenFab = findViewById(R.id.exit_full_screen_button);
        exitFullScreenFab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT_FULLSCREEN_FAB);
                fullScreenMode(false);
            }
        });

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

        int statusBarHeight = getStatusBarHeight();
        int height = displayMetrics.heightPixels;
        copyNodeViewContainer = findViewById(R.id.overlay_root);
        TypedValue typedValue = new TypedValue();
        if (getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)) {
            actionBarHeight = TypedValue.complexToDimensionPixelSize(typedValue.data, getResources().getDisplayMetrics());
        }

        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            finish();
            return;
        }
        extras.setClassLoader(CopyNode.class.getClassLoader());

        String packageName = extras.getString("source_package");
        height = statusBarHeight;
        if (packageName != null) {
            height = statusBarHeight;
            if ("com.android.chrome".equals(packageName)) {
                height = actionBarHeight - statusBarHeight - ViewUtil.dp2px(7);
            }
        }

        ArrayList nodesList = extras.getParcelableArrayList("copy_nodes");
        if (nodesList != null && nodesList.size() > 0) {
            CopyNode[] nodes = (CopyNode[]) nodesList.toArray(new CopyNode[0]);
            Arrays.sort(nodes, new CopyNodeComparator());
            for (int i = 0; i < nodes.length; ++i) {
                addCopyNodeView(nodes[i], height);
            }
        } else {
            ToastUtil.e(R.string.error_in_copy);
            finish();
        }
        exitFab.postDelayed(new Runnable() {
            @Override
            public void run() {
                fullScreenMode(SPHelper.getBoolean(Constants.IS_FULL_SCREEN_COPY, false));
            }
        }, 10);
    }


    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.universal_copy, menu);
        this.menu = menu;
        return super.onCreateOptionsMenu(menu);
    }

    public boolean onOptionsItemSelected(MenuItem menuItem) {
        switch (menuItem.getItemId()) {
            case android.R.id.home:
                UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT);
                // TODO: 2016/11/19  
                if (selectedNodes.size() <= 0) {
                    UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT);
                    finish();
                    return true;
                }
                UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT_RETUN);
                Iterator iterator = selectedNodes.iterator();

                while (iterator.hasNext()) {
                    ((CopyNodeView) iterator.next()).setActiveState(false);
                }

                selectedNodes.clear();
                adjustActionBarWrap();
                return true;
            case R.id.action_full_screen:
                UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT_FULLSCREEN_ACTION);
                fullScreenMode(true);
                return true;
            case R.id.action_select_mode:
                UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EDIT);
                showSelectedText();
                return true;
            case R.id.action_select_all:
                UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_SELECT_ALL);
                selectAll();
                return true;
            case R.id.action_copy:
                UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_COPY_ACTION);
                setSelectTextToClipboard(null);
                finish();
                return true;
            default:
                return false;
        }
    }

    private void selectAll() {
        int length = copyNodeViewContainer.getChildCount();
        int nodeLength = 0;
        for (int i = 0; i < length; i++) {
            View view = copyNodeViewContainer.getChildAt(i);
            if (view instanceof CopyNodeView) {
                nodeLength++;
            }
        }
        if (selectedNodes.size() == nodeLength && nodeLength != 0) {
            selectedNodes.clear();
            for (int i = 0; i < length; i++) {
                View view = copyNodeViewContainer.getChildAt(i);
                if (view instanceof CopyNodeView) {
                    ((CopyNodeView) view).setActiveState(false);
                }
            }
        } else {
            for (int i = 0; i < length; i++) {
                View view = copyNodeViewContainer.getChildAt(i);
                if (view instanceof CopyNodeView) {
                    ((CopyNodeView) view).setActiveState(true);
                    if (!selectedNodes.contains(view)) {
                        selectedNodes.add((CopyNodeView) view);
                    }
                }
            }
        }
        adjustActionBarWrap();
    }

    public interface OnCopyNodeViewClickCallback {
        void onCopyNodeViewLongClick(CopyNodeView nodeView, boolean status);

        void onCopyNodeViewClick(CopyNodeView nodeView, boolean status);
    }

    public class CopyNodeComparator implements Comparator<CopyNode> {

        public int compare(CopyNode o1, CopyNode o2) {
            long o1Size = o1.caculateSize();
            long o2Size = o2.caculateSize();
            return o1Size < o2Size ? -1 : (o1Size == o2Size ? 0 : 1);
        }
    }

    private class MySelectionActionModeCallback implements ActionMode.Callback {
        private TextView textView;

        private MySelectionActionModeCallback(TextView view) {
            textView = view;
        }

        public boolean onActionItemClicked(ActionMode actionMode, MenuItem item) {
            switch (item.getItemId()) {
                case R.id.fab_copy:
                    UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_COPY_FAB);
                    setSelectTextToClipboard(textView);
                    finish();
                    return true;
                default:
                    return false;
            }
        }

        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            return true;
        }

        public void onDestroyActionMode(ActionMode actionMode) {
            if (CopyActivity.this.bottomSheetDialog != null && !CopyActivity.this.actionModeDestroying) {
                CopyActivity.this.actionModeDestroying = true;

                try {
                    CopyActivity.this.bottomSheetDialog.dismiss();
                } catch (IllegalArgumentException e) {
                }
            }

            CopyActivity.this.actionModeDestroying = false;
        }

        public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
            for (int i = 0; i < menu.size(); ++i) {
                menu.getItem(i).setVisible(false);
            }

            return false;
        }

    }
}