package com.bosong.largeimagegallerylib;

import android.support.annotation.DrawableRes;
import android.support.v4.view.PagerAdapter;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

import com.bosong.frescozoomablelib.zoomable.AbstractAnimatedZoomableController;
import com.bosong.frescozoomablelib.zoomable.DefaultZoomableController;
import com.bosong.frescozoomablelib.zoomable.DoubleTapGestureListener;
import com.bosong.frescozoomablelib.zoomable.ZoomableController;
import com.bosong.frescozoomablelib.zoomable.ZoomableDraweeView;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.drawable.ScalingUtils;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.interfaces.DraweeController;

import java.util.List;

/**
 * Created by boson on 2016/12/21.
 */

public class LargeImageGalleryAdapter extends PagerAdapter {
    private static final float SWIPE_DOWN_THRETHOLD = 100.F;

    List<String> mData;
    ZoomableDraweeView[] mImageViewList;

    private int mPlaceholderImageResId;
    private int mFailureImageResId;

    private View.OnClickListener mItemClickListener;
    private ZoomableController.OnSwipeDownListener mSwipeDownListener;

    public LargeImageGalleryAdapter(){
        this(null);
    }

    public LargeImageGalleryAdapter(List<String> data){
        setData(data);
    }

    public void setData(List<String> imageUrls){
        setData(imageUrls, 0, 0);
    }

    public void setData(List<String> imageUrls, @DrawableRes int placeholderImageResId, @DrawableRes int failureImageResId){
        if(imageUrls != null){
            mData = imageUrls;
            mImageViewList = new ZoomableDraweeView[mData.size()];
        }
        mPlaceholderImageResId = placeholderImageResId;
        mFailureImageResId = failureImageResId;
    }

    public void setOnItemClickListener(View.OnClickListener listener){
        this.mItemClickListener = listener;
    }

    public void setSwipeDownListener(ZoomableController.OnSwipeDownListener listener) {
        mSwipeDownListener = listener;
    }

    @Override
    public int getCount() {
        return mData != null ? mData.size() : 0;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(final ViewGroup container, int position) {
        if(mData != null && mData.size() > position){
            ZoomableDraweeView zoomableDraweeView = null;
            if(mImageViewList != null && mImageViewList.length > position && mImageViewList[position] != null){
                zoomableDraweeView = mImageViewList[position];

            }else{
                zoomableDraweeView = new ZoomableDraweeView(container.getContext());
                zoomableDraweeView.setAllowTouchInterceptionWhileZoomed(true);
                // needed for double tap to zoom
                zoomableDraweeView.setIsLongpressEnabled(false);
                zoomableDraweeView.setSwipeDownListener(mSwipeDownListener);
                final ZoomableDraweeView finalZoomableDraweeView = zoomableDraweeView;
                zoomableDraweeView.setTapListener(new DoubleTapGestureListener(finalZoomableDraweeView){
                    @Override
                    public boolean onSingleTapConfirmed(MotionEvent e) {
                        if(mItemClickListener != null){
                            mItemClickListener.onClick(finalZoomableDraweeView);
                        }
                        return super.onSingleTapConfirmed(e);
                    }
                });
                DraweeController controller = Fresco.newDraweeControllerBuilder()
                        .setUri(mData.get(position % mData.size()))
                        .build();
                zoomableDraweeView.setController(controller);
                GenericDraweeHierarchyBuilder builder =
                        new GenericDraweeHierarchyBuilder(container.getResources());
                GenericDraweeHierarchy hierarchy = builder
                        .setFadeDuration(300).setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER)
                        .build();
                if(mPlaceholderImageResId > 0){
                    hierarchy.setPlaceholderImage(mPlaceholderImageResId, ScalingUtils.ScaleType.FIT_CENTER);
                }
                if(mFailureImageResId > 0){
                    hierarchy.setFailureImage(mFailureImageResId, ScalingUtils.ScaleType.FIT_CENTER);
                }
                zoomableDraweeView.setHierarchy(hierarchy);

                mImageViewList[position] = zoomableDraweeView;
            }
            container.addView(zoomableDraweeView);

            return zoomableDraweeView;
        }

        return null;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        if(mImageViewList != null && mImageViewList.length > position && mImageViewList[position] != null){
            ZoomableDraweeView imageView = mImageViewList[position];
            container.removeView(imageView);
        }
    }

    public ZoomableDraweeView getItem(int position){
        if(position > -1 && mImageViewList != null && mImageViewList.length > position){
            return mImageViewList[position];
        }
        return null;
    }
}