package com.xg.navigation.delegates.bottom;

import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentationMagician;
import android.support.v7.widget.AppCompatImageView;
import android.support.v7.widget.AppCompatTextView;
import android.support.v7.widget.LinearLayoutCompat;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.xg.navigation.R;
import com.xg.navigation.delegates.NavigationDelegate;

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

import me.yokeyword.fragmentation.ISupportFragment;

/**
 * Created by yuanyuan on 18-1-18.
 * 首页最外层的父容器
 */

public abstract class BaseBottomDelegate extends NavigationDelegate implements View.OnClickListener{

    private final ArrayList<BottomTabBean> TAB_BEANS = new ArrayList<>();
    protected final ArrayList<BottomItemDelegate> ITEM_DELEGATES = new ArrayList<>();
    private final LinkedHashMap<BottomTabBean, BottomItemDelegate> ITEMS = new LinkedHashMap<>();
    private int mCurrentDelegate = 0;
    private int mIndexDelegate = 0;
    private int mClickedColor = Color.RED;
    private int mUnClickColor = Color.GRAY;

    private LinearLayoutCompat mBottomBar = null;

    public abstract LinkedHashMap<BottomTabBean, BottomItemDelegate> setItems(ItemBuilder builder);

    public ArrayList<BottomItemDelegate> getItemDelegates() {
        return ITEM_DELEGATES;
    }

    @Override
    public Object setLayout() {
        return R.layout.delegate_bottom;
    }

    public abstract int setIndexDelegate();

    @ColorInt
    public abstract int setClickedColor();

    @ColorInt
    public abstract int setUnClickColor();

    @ColorInt
    public abstract int setBarTintColor();

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mIndexDelegate = setIndexDelegate();
        if (setClickedColor() != 0) {
            mClickedColor = setClickedColor();
        }
        if (setUnClickColor() != 0) {
            mUnClickColor = setUnClickColor();
        }

        final ItemBuilder builder = ItemBuilder.builder();
        final LinkedHashMap<BottomTabBean, BottomItemDelegate> items = setItems(builder);
        ITEMS.putAll(items);
        for (Map.Entry<BottomTabBean, BottomItemDelegate> item: ITEMS.entrySet()) {
            final BottomTabBean key = item.getKey();
            final BottomItemDelegate value = item.getValue();
            TAB_BEANS.add(key);
            ITEM_DELEGATES.add(value);
        }
    }

    @Override
    public void onBindView(@Nullable Bundle savedInstanceState, @NonNull View rootView) {
        mBottomBar = $(R.id.bottom_bar);
        mBottomBar.setBackgroundColor(setBarTintColor());
        final int size = ITEMS.size();
        for (int i = 0; i < size; ++i) {
            LayoutInflater.from(getContext()).inflate(R.layout.bottom_item_icon_text_layout, mBottomBar);
            final RelativeLayout item = (RelativeLayout) mBottomBar.getChildAt(i);
            //设置每个item的点击事件
            item.setTag(i);
            item.setOnClickListener(this);
//            final AppCompatImageView itemIcon = (AppCompatImageView) item.getChildAt(0);
            final AppCompatImageView itemIcon = (AppCompatImageView) ((ViewGroup) item.getChildAt(0)).getChildAt(0);
            final AppCompatTextView itemTitle = (AppCompatTextView) item.getChildAt(1);
            final BottomTabBean bean = TAB_BEANS.get(i);
            //初始化数据
            Drawable icon = bean.getIcon();
            Drawable unSelectIcon = bean.getUnSelectedIcon();

            if (unSelectIcon != null) {
                itemIcon.setImageDrawable(unSelectIcon);
            }

            itemTitle.setText(bean.getTitle());
            if (i == mIndexDelegate) {
                itemTitle.setTextColor(mClickedColor);
                if (icon != null) {
                    itemIcon.setImageDrawable(icon);
                }
            } else {
                itemTitle.setTextColor(mUnClickColor);
            }
        }

        final ISupportFragment[] deledateArray = ITEM_DELEGATES.toArray(new ISupportFragment[size]);
        getSupportDelegate().loadMultipleRootFragment(R.id.bottom_bar_delegate_container, mIndexDelegate, deledateArray);
    }

    private void resetColor() {
        final int count = mBottomBar.getChildCount();
        for (int i = 0; i < count; ++i) {
            final RelativeLayout item = (RelativeLayout) mBottomBar.getChildAt(i);
            final AppCompatTextView itemTitle = (AppCompatTextView) item.getChildAt(1);
            itemTitle.setTextColor(mUnClickColor);
        }
    }

    private void resetIcon() {
        final int count = mBottomBar.getChildCount();
        for (int i = 0; i < count; ++i) {
            final RelativeLayout item = (RelativeLayout) mBottomBar.getChildAt(i);
            final AppCompatImageView itemIcon = (AppCompatImageView) ((ViewGroup) item.getChildAt(0)).getChildAt(0);
            final BottomTabBean bean = TAB_BEANS.get(i);
            Drawable unSelectIcon = bean.getUnSelectedIcon();
            if (unSelectIcon != null) {
                itemIcon.setImageDrawable(unSelectIcon);
            }
        }
    }

    public BottomItemDelegate getCurrentChildDelegate() {
        return ITEM_DELEGATES.get(mCurrentDelegate);
    }

    public void changeColor(int tabIndex) {
        resetColor();
        final RelativeLayout item = (RelativeLayout) mBottomBar.getChildAt(tabIndex);
        final AppCompatTextView itemTitle = (AppCompatTextView) item.getChildAt(1);
        itemTitle.setTextColor(mClickedColor);
    }

    public void changeIcon(int tabIndex) {
        resetIcon();
        final BottomTabBean bean = TAB_BEANS.get(tabIndex);
        final RelativeLayout item = (RelativeLayout) mBottomBar.getChildAt(tabIndex);
        final AppCompatImageView itemIcon = (AppCompatImageView) ((ViewGroup) item.getChildAt(0)).getChildAt(0);

        Drawable icon = bean.getIcon();
        if (icon != null) {
            itemIcon.setImageDrawable(icon);
        }
    }

    public void setNewIndex(int newIndex) {
        int size = ITEMS.size();
        if (newIndex < 0 || newIndex >= size) {
            return;
        }
        changeColor(newIndex);
        changeIcon(newIndex);
        getSupportDelegate().showHideFragment(ITEM_DELEGATES.get(newIndex), ITEM_DELEGATES.get(mCurrentDelegate));
        mCurrentDelegate = newIndex;
    }

    public void setTabBarItemBadgeValue(int tabIndex, final String tip) {

                final RelativeLayout item = (RelativeLayout) mBottomBar.getChildAt(tabIndex);

                final TextView tipText = (TextView) ((ViewGroup) item.getChildAt(0)).getChildAt(1);

                if (TextUtils.isEmpty(tip)|| "0".equals(tip)) {
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            tipText.setVisibility(View.GONE);
                        }
                    });
                } else {
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            tipText.setVisibility(View.VISIBLE);
                            tipText.setText(tip);
                        }
                    });
                }

    }

    @Override
    public void onClick(View v) {

        final int tabIndex = (int) v.getTag();
        changeColor(tabIndex);
        changeIcon(tabIndex);
        getSupportDelegate().showHideFragment(ITEM_DELEGATES.get(tabIndex), ITEM_DELEGATES.get(mCurrentDelegate));
        //注意先后顺序
        mCurrentDelegate = tabIndex;
    }

    /**
     * 获取子路由
     */
    public List<Fragment> getChildFragments() {
        return FragmentationMagician.getActiveFragments(getChildFragmentManager());
    }
}
