package us.pinguo.edit.sdk.widget;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;

import us.pinguo.edit.sdk.R;
import us.pinguo.edit.sdk.base.view.IMenuItemView;

/**
 * Created by pinguo on 14-5-23.
 */
public class PGEditMenuItemView extends RelativeLayout
        implements View.OnClickListener, View.OnLongClickListener, IMenuItemView {

    protected Drawable mImageViewDrawable;
    protected String mTextViewText;

    protected ImageView mIconImageView;
    protected TextView mNameTextView;

    protected OnClickListener mOnCompositeClick;
    protected OnClickListener mOnShowScrollViewClick;
    protected OnClickListener mOnDeleteViewClick;
    protected OnLongClickListener mOnLongClickListener;

    protected ImageView mScrollView;
    protected View mDownLineView;
    protected ImageView mDeleteView;

    private View mDividerView;

    public PGEditMenuItemView(Context context) {
        super(context);

        init(context);
    }

    public PGEditMenuItemView(Context context, AttributeSet attrs) {
        super(context, attrs);

        init(context);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        if(mImageViewDrawable != null) {
            mIconImageView.setImageDrawable(mImageViewDrawable);
        }

        if(mTextViewText != null) {
            mNameTextView.setText(mTextViewText);
        }
    }

    protected void init(Context context){

        LayoutInflater.from(context).inflate(getLayoutResources(context), this, true);

        mIconImageView = (ImageView) findViewById(R.id.icon);
        mNameTextView = (TextView) findViewById(R.id.name);

        mScrollView = (ImageView) findViewById(R.id.effect_scroll);
        setOnClickListener(this);

        mDownLineView = findViewById(R.id.down_line);
        mDividerView = findViewById(R.id.divider);

        mDeleteView = (ImageView) findViewById(R.id.delete_view);

        if (null != mDeleteView) {
            mDeleteView.setOnClickListener(this);
        }

        setOnLongClickListener(this);

    }

    protected int getLayoutResources(Context context){
        return R.layout.menu_item;
    }

    public void setIconForImageUrl(String imageUrl){
        ImageLoaderView imageLoaderView = (ImageLoaderView)mIconImageView;
        imageLoaderView.getOptionsBuilder().displayer(new FadeInBitmapDisplayer(400));
        imageLoaderView.setImageUrl(imageUrl);
    }

    public void setIcon(int id){
        ImageLoaderView imageLoaderView = (ImageLoaderView)mIconImageView;
        imageLoaderView.setImageResource(id);
    }

    public void setIcon(Drawable icon) {
        if (null != mIconImageView) {
            mIconImageView.setImageDrawable(icon);
        }
    }

    public void setNameText(String str){
        mNameTextView.setText(str);
    }

    public void setNameTextColor(String color){
        mNameTextView.setTextColor(Color.parseColor(color));
    }

    public void setScrollViewBgColor(String color){
        if (null == color || "".equals(color)) {
            return;
        }

        if (null != mScrollView) {
            if (color.toLowerCase().startsWith("0x")) {
                String value = color.toLowerCase().replace("0x", "#b2");
                mScrollView.setBackgroundColor(Color.parseColor(value));
            } else {
                if (color.length() <= 7) {
                    char prefix = color.charAt(0);
                    String colorValue = color.substring(1, color.length());
                    String newColor = String.valueOf(prefix) + "b2" + colorValue;
                    mScrollView.setBackgroundColor(Color.parseColor(newColor));
                } else {
                    String alpha = color.substring(0, 3);
                    String newColor = color.replace(alpha, "#b2");
                    mScrollView.setBackgroundColor(Color.parseColor(newColor));
                }
            }
        }
    }

    public void setScrollViewDrawable(int drawableId){
        if (null != mScrollView) {
            mScrollView.setImageResource(drawableId);
        }
    }

    public void setNameBgColor(String color){
        if (null == color || "".equals(color)) {
            return;
        }

        if (color.toLowerCase().startsWith("0x")) {
            String value = color.toLowerCase().replace("0x", "#e5");
            mNameTextView.setBackgroundColor(Color.parseColor(value));
        } else {
            mNameTextView.setBackgroundColor(Color.parseColor(color));
        }
    }

    public void setOnCompositeClick(OnClickListener onClick){
        this.mOnCompositeClick = onClick;
    }

    public void setOnShowScrollViewClick(OnClickListener onClick){
        this.mOnShowScrollViewClick = onClick;
    }

    public void setOnItemLongClickListener(OnLongClickListener onClick) {
        this.mOnLongClickListener = onClick;
    }

    public void setOnDeleteViewClickListener(OnClickListener onClick) {
        this.mOnDeleteViewClick = onClick;
    }

    @Override
    public void onClick(View v) {

        if (mDeleteView == v) {

            clearAnimation();
            deleteViewWithAnimation(v);

            return;
        }

        if(null != mScrollView && mScrollView.getVisibility() == View.VISIBLE){
            mOnShowScrollViewClick.onClick(v);

        }else{
            if(null != mScrollView && mOnShowScrollViewClick != null){
                showScrollView();
            }

            if(mOnCompositeClick != null){
                mOnCompositeClick.onClick(v);
            }
        }
    }

    public void showScrollView() {

        if (null == mScrollView) {
            return;
        }

        AlphaAnimation animation = new AlphaAnimation(0, 1.0f);
        animation.setDuration(400);

        mScrollView.startAnimation(animation);
        mScrollView.setVisibility(View.VISIBLE);
    }

    public void hideScrollView(){
        if (null != mScrollView) {
            AlphaAnimation animation = new AlphaAnimation(1.0f, 0);
            animation.setDuration(400);
            mScrollView.startAnimation(animation);
            mScrollView.setVisibility(View.GONE);
        }
    }

    public OnClickListener getOnClickListener(){
        return this;
    }

    public void enableDivider(boolean enable) {
        if (enable) {
            if (null != mDividerView) {
                mDividerView.setVisibility(View.VISIBLE);
            }
            return;
        }

        if (null != mDividerView) {
            mDividerView.setVisibility(View.GONE);
        }
    }

    public void enableTitle(boolean enable) {
        if (enable) {
            mNameTextView.setVisibility(View.VISIBLE);
            return;
        }

        mNameTextView.setVisibility(View.GONE);
    }

    public void hideDownLine() {
        if (null != mDownLineView) {
            mDownLineView.setVisibility(View.INVISIBLE);
        }
    }

    public void showDownLine() {
        if (null != mDownLineView) {
            mDownLineView.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void setTag(Object tag) {
        super.setTag(tag);
        if (null != mDeleteView) {
            mDeleteView.setTag(tag);
        }
    }

    @Override
    public void setValue(String s) {

    }

    @Override
    public void hideValue() {

    }

    @Override
    public boolean onLongClick(View v) {
        if (null == mOnLongClickListener) {
            return false;
        }

        return mOnLongClickListener.onLongClick(v);
    }

    public void showDeleteView() {
        if (null != mDeleteView) {
            mDeleteView.setVisibility(View.VISIBLE);
        }
    }

    public void hideDeleteView() {
        if (null != mDeleteView) {
            mDeleteView.setVisibility(View.GONE);
        }
    }

    public void startRotateAnimation() {

    }

    private void deleteViewWithAnimation(final View v) {

        final ViewGroup parent = (ViewGroup) getParent();
        final int index = parent.indexOfChild(this);
        final int moveDis = getLayoutParams().width;
        float deleteViewMoveWidth = 0.25f * getLayoutParams().width;
        float deleteViewMoveHeight = 0.25f * getLayoutParams().height;

        ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 0.5f, 1f, 0.5f);
        scaleAnimation.setDuration(200l);
        TranslateAnimation translateAnimation = new TranslateAnimation(0f, deleteViewMoveWidth, 0f, deleteViewMoveHeight);
        translateAnimation.setDuration(200l);

        AnimationSet animationSet = new AnimationSet(true);
        animationSet.addAnimation(scaleAnimation);
        animationSet.addAnimation(translateAnimation);
        animationSet.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {

                parent.post(new Runnable() {
                    @Override
                    public void run() {
                        PGEditMenuItemView.this.setVisibility(View.INVISIBLE);
                    }
                });
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        this.startAnimation(animationSet);

        if (index == parent.getChildCount() - 1) {
            parent.post(new Runnable() {
                @Override
                public void run() {
                    parent.removeView(PGEditMenuItemView.this);
                    if (null != mOnDeleteViewClick) {
                        mOnDeleteViewClick.onClick(v);
                    }
                }
            });

            return;
        }

        for (int i = index + 1; i < parent.getChildCount(); i++) {
            final View childView = parent.getChildAt(i);
            childView.clearAnimation();
            TranslateAnimation leftTranslateAnimation = new TranslateAnimation(0f, -moveDis, 0f, 0f);
            leftTranslateAnimation.setDuration(300l);
            if (i == index + 1) {
                leftTranslateAnimation.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        parent.post(new Runnable() {
                            @Override
                            public void run() {
                                parent.removeView(PGEditMenuItemView.this);
                                if (null != mOnDeleteViewClick) {
                                    mOnDeleteViewClick.onClick(v);
                                }

                                ((PGEditMenuItemView) childView).startRotateAnimation();
                            }
                        });
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {

                    }
                });

            } else {
                leftTranslateAnimation.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        parent.post(new Runnable() {
                            @Override
                            public void run() {
                                ((PGEditMenuItemView) childView).startRotateAnimation();
                            }
                        });
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {

                    }
                });

            }

            childView.startAnimation(leftTranslateAnimation);

        }
    }

    public void setDownLineColor(String color) {
        if (null == color || "".equals(color)) {
            return;
        }

        if (null != mDownLineView) {
            if (color.toLowerCase().startsWith("0x")) {
                String value = color.toLowerCase().replace("0x", "#e5");
                mDownLineView.setBackgroundColor(Color.parseColor(value));
            } else {
                mDownLineView.setBackgroundColor(Color.parseColor(color));
            }
        }
    }
}
