package com.github.skykai.view;

import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.OvershootInterpolator;
import android.widget.ImageView;
import android.widget.TextView;

import com.github.skykai.R;
import com.github.skykai.model.StickerItem;
import com.github.skykai.util.Utils;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.Random;
import io.codetail.animation.SupportAnimator;
import io.codetail.animation.ViewAnimationUtils;
import io.codetail.widget.RevealFrameLayout;

/**
 * Created by sky on 2015/6/11.
 */
public class StickerRecyclerView extends RecyclerView {

    private static final long[] delayList = {400, 500, 600, 700, 800, 900};

    private Context mContext;
    private ArrayList<StickerItem> mStickerList;
    private StickerAdapter stickerAdapter;
    private SupportAnimator mAnimator;


    public StickerRecyclerView(Context context, ArrayList<StickerItem> chartList) {
        super(context);
        this.mContext = context;
        this.mStickerList = chartList;

        init();

    }

    private void init() {
        setLayoutManager(new GridLayoutManager(mContext, 3));
        stickerAdapter = new StickerAdapter();
        stickerAdapter.setList(mStickerList);
        setAdapter(stickerAdapter);
    }


    private class StickerAdapter extends RecyclerView.Adapter<ViewHolder> {

        private ArrayList<StickerItem> items = new ArrayList<StickerItem>();
        private int lastPosition = -1;

        public void setList(ArrayList<StickerItem> list) {
            if (items.size() > 0) {
                items.clear();
            }
            items.addAll(list);
        }



        @Override
        public void onViewAttachedToWindow(final ViewHolder holder) {
            super.onViewAttachedToWindow(holder);
            final long delayTime = delayList[new Random().nextInt(5)];
            holder.card.setVisibility(View.INVISIBLE);

            if (holder.getPosition() > lastPosition) {
                holder.card.getHandler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        holder.card.setVisibility(View.VISIBLE);
                        ObjectAnimator alpha = ObjectAnimator.ofFloat(holder.card, "alpha", 0f, 1f);
                        ObjectAnimator scaleY = ObjectAnimator.ofFloat(holder.card, "scaleY", 0f, 1f);
                        ObjectAnimator scaleX = ObjectAnimator.ofFloat(holder.card, "scaleX", 0f, 1f);
                        AnimatorSet animSet = new AnimatorSet();
                        animSet.play(alpha).with(scaleY).with(scaleX);
                        animSet.setInterpolator(new OvershootInterpolator());
                        animSet.setDuration(400);
                        animSet.start();

                    }
                }, delayTime);

                lastPosition = holder.getPosition();
            } else {
                holder.card.setVisibility(View.VISIBLE);
            }
        }


        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_sticker, viewGroup, false);
            return new ViewHolder(v);
        }

        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position) {

            final StickerItem stickerItem = items.get(position);
            ImageLoader.getInstance().displayImage(stickerItem.getThumbnail2(), holder.chartlet
                    , Utils.getInst().buildDefaultOptions());
            holder.download.setText("下载");
            holder.download.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(final View v) {

                        final View myView = holder.card;
                        int cx = (myView.getLeft() + myView.getRight()) / 2;
                        int cy = (myView.getTop() + myView.getBottom()) / 2;
                        float finalRadius = hypo(myView.getWidth(), myView.getHeight());
                        mAnimator = ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
                        mAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
                        mAnimator.setDuration(1000);
                        mAnimator.start();

                }
            });
        }

        @Override
        public int getItemCount() {
            return items.size();
        }
    }


    //Viewholder
    public static class ViewHolder extends RecyclerView.ViewHolder {

        private TextView download;
        private ImageView chartlet;
        private CardView card;
        RevealFrameLayout mReveal;

        public ViewHolder(View contentView) {
            super(contentView);
            card = (CardView) contentView.findViewById(R.id.card);
            chartlet = (ImageView) contentView.findViewById(R.id.chartlet_review);
            download = (TextView) contentView.findViewById(R.id.download_btn);
            mReveal = (RevealFrameLayout) card.getParent();

        }
    }

    static float hypo(int a, int b) {
        return (float) Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
    }

}