package com.yang.keyboard.emoticon.bean;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import com.yang.keyboard.R;
import com.yang.keyboard.emoticon.EmoticonSetBean;
import com.yang.keyboard.emoticon.util.EmoticonsKeyboardBuilder;
import com.yang.keyboard.utils.Utils;
import com.yang.keyboard.utils.EmoticonLoader;
/**
 * Created by yangjiang on 2017/04/07.
 * E-Mail:[email protected]
 * Description:[表情类别 选择指示器]
 **/
public class EmoticonsToolBarView extends RelativeLayout {

    private Context mContext;
    private HorizontalScrollView hsv_toolbar;
    private LinearLayout ly_tool;

    private List<EmoticonSetBean> mEmoticonSetBeanList;
    private ArrayList<ImageView> mToolBtnList = new ArrayList<>();
    private int mBtnWidth = 60;

    public EmoticonsToolBarView(Context context) {
        this(context, null);
    }

    public EmoticonsToolBarView(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.emoticonstoolbar_view, this);
        this.mContext = context;
        findView();
    }

    private void findView() {
        hsv_toolbar = (HorizontalScrollView) findViewById(R.id.hsv_toolbar);
        ly_tool = (LinearLayout) findViewById(R.id.ly_tool);
    }

    private void scrollToBtnPosition(final int position) {
        int childCount = ly_tool.getChildCount();
        if (position < childCount) {
            hsv_toolbar.post(new Runnable() {
                @Override
                public void run() {
                    int mScrollX = hsv_toolbar.getScrollX();

                    //todo test adding many views
                    int childX = ly_tool.getChildAt(position).getLeft();
                    if (childX < mScrollX) {
                        hsv_toolbar.scrollTo(childX, 0);
                        return;
                    }

                    int childWidth = (int) ly_tool.getChildAt(position).getWidth();
                    int hsvWidth = hsv_toolbar.getWidth();
                    int childRight = childX + childWidth;
                    int scrollRight = mScrollX + hsvWidth;

                    if (childRight > scrollRight) {
                        hsv_toolbar.scrollTo(childRight - scrollRight, 0);
                    }
                }
            });
        }
    }

    public void setToolBtnSelect(int select) {
        scrollToBtnPosition(select);
        for (int i = 0; i < mToolBtnList.size(); i++) {
            if (select == i) {
                mToolBtnList.get(i).setBackgroundColor(getResources().getColor(R.color.toolbar_btn_select));
            } else {
                mToolBtnList.get(i).setBackgroundColor(getResources().getColor(R.color.toolbar_btn_nomal));
            }
        }
    }

    public void setBtnWidth(int width) {
        mBtnWidth = width;
    }

    public void addData(int rec) {
        if (ly_tool != null) {
            View toolBtnView = inflate(mContext, R.layout.emoticonstoolbar_item, null);
            ImageView iv_icon = (ImageView) toolBtnView.findViewById(R.id.iv_icon);
            iv_icon.setImageResource(rec);
            LinearLayout.LayoutParams imgParams = new LinearLayout.LayoutParams(Utils.dip2px(mContext, mBtnWidth), LayoutParams.MATCH_PARENT);
            iv_icon.setLayoutParams(imgParams);
            ly_tool.addView(toolBtnView);
            final int position = mToolBtnList.size();
            mToolBtnList.add(iv_icon);
            iv_icon.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (mItemClickListeners != null && !mItemClickListeners.isEmpty()) {
                        for (OnToolBarItemClickListener listener : mItemClickListeners) {
                            listener.onToolBarItemClick(position);
                        }
                    }
                }
            });
        }
    }

    private int getIdValue() {
        int childCount = getChildCount();
        int id = 1;
        if (childCount == 0) {
            return id;
        }
        boolean isKeep = true;
        while (isKeep) {
            isKeep = false;
            Random random = new Random();
            id = random.nextInt(100);
            for (int i = 0; i < childCount; i++) {
                if (getChildAt(i).getId() == id) {
                    isKeep = true;
                    break;
                }
            }
        }
        return id;
    }

    public void addFixedView(View view, boolean isRight) {
        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
        LayoutParams hsvParams = (LayoutParams) hsv_toolbar.getLayoutParams();
        if (view.getId() <= 0) {
            view.setId(getIdValue());
        }
        if (isRight) {
            params.addRule(ALIGN_PARENT_RIGHT);
            hsvParams.addRule(LEFT_OF, view.getId());
        } else {
            params.addRule(ALIGN_PARENT_LEFT);
            hsvParams.addRule(RIGHT_OF, view.getId());
        }
        addView(view, params);
        hsv_toolbar.setLayoutParams(hsvParams);
    }

    public void setEmoticonContents(EmoticonsKeyboardBuilder builder) {
        mEmoticonSetBeanList = builder.builder == null ? null : builder.builder.getEmoticonSetBeanList();
        if (mEmoticonSetBeanList == null) {
            return;
        }

        int i = 0;
        for (EmoticonSetBean bean : mEmoticonSetBeanList) {
            View toolBtnView = inflate(mContext, R.layout.emoticonstoolbar_item, null);
            ImageView iv_icon = (ImageView) toolBtnView.findViewById(R.id.iv_icon);
            LinearLayout.LayoutParams imgParams = new LinearLayout.LayoutParams(Utils.dip2px(mContext, mBtnWidth), LayoutParams.MATCH_PARENT);
            iv_icon.setLayoutParams(imgParams);
            ly_tool.addView(toolBtnView);

            iv_icon.setImageDrawable(EmoticonLoader.getInstance(mContext).getDrawable(bean.getIconUri()));

            mToolBtnList.add(iv_icon);

            final int finalI = i;
            iv_icon.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (mItemClickListeners != null && !mItemClickListeners.isEmpty()) {
                        for (OnToolBarItemClickListener listener : mItemClickListeners) {
                            listener.onToolBarItemClick(finalI);
                        }
                    }
                }
            });
            i++;
        }
        setToolBtnSelect(0);
    }

    private List<OnToolBarItemClickListener> mItemClickListeners;

    public interface OnToolBarItemClickListener {
        void onToolBarItemClick(int position);
    }

    public void addOnToolBarItemClickListener(OnToolBarItemClickListener listener) {
        if (mItemClickListeners == null) {
            mItemClickListeners = new ArrayList<OnToolBarItemClickListener>();
        }
        mItemClickListeners.add(listener);
    }

    public void setOnToolBarItemClickListener(OnToolBarItemClickListener listener) {
        addOnToolBarItemClickListener(listener);
    }
}