package com.vinaysshenoy.okulusdemo.fragments;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.NetworkImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.ViewTarget;
import com.nostra13.universalimageloader.core.assist.ImageSize;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import com.vinaysshenoy.okulusdemo.DemoApplication;
import com.vinaysshenoy.okulusdemo.R;

/**
 * Fragment to display images in a ListView
 * <p/>
 * Created by vinaysshenoy on 04/12/14.
 */
public class NetworkFragment extends ListFragment {


    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        final DemoApplication application = (DemoApplication) getActivity().getApplication();
        setListAdapter(new ImageAdapter(getActivity(), "https://scontent-b-ams.xx.fbcdn.net/hphotos-xfp1/t31.0-8/10700409_10205008935044693_3621835106117173363_o.jpg", application.getRequestQueue(), application.getImageLoader(), application.getUniversalImageLoader()));

    }

    private static final class ImageAdapter extends BaseAdapter {

        private String mImageUrl;

        private ImageLoader mImageLoader;

        private RequestQueue mRequestQueue;

        private Context mContext;

        private com.nostra13.universalimageloader.core.ImageLoader mUniversalImageLoader;

        public ImageAdapter(final Context context, final String imageUrl, final RequestQueue requestQueue, final ImageLoader imageLoader, final com.nostra13.universalimageloader.core.ImageLoader universalImageLoader) {
            mContext = context;
            mImageUrl = imageUrl;
            mRequestQueue = requestQueue;
            mImageLoader = imageLoader;
            mUniversalImageLoader = universalImageLoader;
        }

        @Override
        public int getCount() {
            return 5;
        }

        @Override
        public Object getItem(int position) {
            return mImageUrl;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public int getViewTypeCount() {
            return 5;
        }

        @Override
        public int getItemViewType(int position) {

            return position % 5;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            final View view = createView(position, convertView, parent);
            loadImage((ImageView) view, position);
            return view;
        }

        private int dpToPx(int dp) {

            float density = mContext.getResources().getDisplayMetrics().density;
            return (int) (dp * density);
        }

        private void loadImage(final ImageView imageView, final int position) {

            final String imageurl = (String) getItem(position);
            switch (getItemViewType(position)) {

                //Volley - ImageRequest
                case 0: {
                    final ImageRequest request = new ImageRequest(
                            imageurl,
                            new Response.Listener<Bitmap>() {
                                @Override
                                public void onResponse(Bitmap response) {
                                    imageView.setImageBitmap(response);
                                }
                            },
                            dpToPx(128),
                            dpToPx(96),
                            null,
                            new Response.ErrorListener() {
                                @Override
                                public void onErrorResponse(VolleyError error) {

                                }
                            }
                    );

                    mRequestQueue.add(request);
                    break;
                }

                //Volley - NetworkImageView - In this case, NetworkImageView has been modified to extend OkulusImageView
                case 1: {

                    final NetworkImageView networkImageView = (NetworkImageView) imageView;
                    networkImageView.setImageUrl(imageurl, mImageLoader);
                    break;
                }

                //Picasso
                case 2: {

                    Picasso.with(imageView.getContext())
                            .load(imageurl)
                            .resize(dpToPx(128), dpToPx(96))
                            .centerCrop()
                            .into(new Target() {
                                @Override
                                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                                    imageView.setImageBitmap(bitmap);
                                }

                                @Override
                                public void onBitmapFailed(Drawable errorDrawable) {

                                }

                                @Override
                                public void onPrepareLoad(Drawable placeHolderDrawable) {

                                }
                            });
                    break;
                }

                //Glide
                case 3: {

                    Glide.with(imageView.getContext())
                            .load(imageurl)
                            .asBitmap()
                            //.override(dpToPx(128), dpToPx(96))
                            .centerCrop()
                            .into(new ViewTarget<ImageView, Bitmap>(imageView) {
                                @Override
                                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                                    imageView.setImageBitmap(resource);
                                }
                            });
                    break;
                }

                // Universal Image Loader
                case 4: {

                    ImageSize targetSize = new ImageSize(dpToPx(96), dpToPx(128));
                    mUniversalImageLoader.loadImage(imageurl, targetSize, new SimpleImageLoadingListener() {

                        @Override
                        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                            imageView.setImageBitmap(loadedImage);
                        }
                    });
                    break;
                }

            }
        }

        private View createView(int position, View convertView, ViewGroup parent) {

            if (convertView != null) {
                return convertView;
            } else {

                final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
                int resId;
                switch (getItemViewType(position)) {

                    case 0: {
                        resId = R.layout.layout_image_1;
                        break;
                    }

                    case 1: {
                        resId = R.layout.layout_image_2;
                        break;
                    }

                    case 2: {
                        resId = R.layout.layout_image_3;
                        break;
                    }

                    case 3: {
                        resId = R.layout.layout_image_4;
                        break;
                    }

                    case 4:
                    default: {
                        resId = R.layout.layout_image_5;
                        break;
                    }

                }
                return inflater.inflate(resId, parent, false);
            }
        }
    }
}