package org.auie.ui;

import java.util.ArrayList;

import org.auie.image.UEImage;
import org.auie.utils.UEUnit;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

@SuppressLint("NewApi")
public class UIImageCarouselView extends RelativeLayout {
	
	private ViewPager mViewPager;
	private LinearLayout mIndexLayout;
	
	private ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();
	private ArrayList<ImageView> imageViews = new ArrayList<>();
	private ArrayList<View> indexViews = new ArrayList<>();
	private ImageCarouselAdapter adapter = new ImageCarouselAdapter();
	private ScaleType scaleType = ScaleType.FIT_XY;
	private LinearLayout.LayoutParams mIndexParams;
	private UEUnit mUnit;
	private int currentIndex = 0;
	private boolean loop = true;
	private boolean auto = true;
	private long carouseTime = 1800;
	private int indexSize = 8;
	private Drawable indexDefaultDrawable;
	private Drawable indexSelectDrawable;
	private int handlerIndex = 0;
	private Handler mHandler = new Handler();
	
	public UIImageCarouselView(Context context) {
		this(context, null);
	}

	public UIImageCarouselView(Context context, AttributeSet attrs, int defStyleAttr) {
		this(context, attrs, defStyleAttr, 0);
	}

	public UIImageCarouselView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public UIImageCarouselView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
		super(context, attrs, defStyleAttr, defStyleRes);
		init();
	}
	
	/**
	 * 设置图片源
	 * @param bitmaps
	 */
	public void setImages(ArrayList<Bitmap> bitmaps){
		this.bitmaps = bitmaps;
		createIndexs();
	}
	
	/**
	 * 设置图片原ID
	 * @param ids
	 */
	public void setImagesResource(ArrayList<Integer> ids){
		bitmaps.clear();
		for(int id :  ids){
			bitmaps.add(new UEImage(getResources(), id).toBitmap());
		}
		createIndexs();
	}
	
	/**
	 * 构造视图并初始化
	 */
	private void init(){
		mUnit = UEUnit.getInstance(getContext());
		mIndexParams = new LinearLayout.LayoutParams(mUnit.translatePX(indexSize), mUnit.translatePX(indexSize));
		mIndexParams.setMargins(mUnit.translatePX(8), 0, 0, 0);
		mViewPager = new ViewPager(getContext());
		mViewPager.setLayoutParams(new LayoutParams(-1, -1));
		mViewPager.setAdapter(adapter);
		mViewPager.setOnPageChangeListener(mPageChangeListener);
		RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(-2, -2);
		params.addRule(CENTER_HORIZONTAL, RelativeLayout.TRUE);
		params.addRule(ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
		params.setMargins(0, 0, 0, mUnit.translatePX(10));
		mIndexLayout = new LinearLayout(getContext());
		mIndexLayout.setLayoutParams(params);
		indexDefaultDrawable = UEImage.createBackground(Color.parseColor("#FFFFFF"), 50, mUnit.translatePX(6));
		indexSelectDrawable = UEImage.createBackground(Color.parseColor("#EEEEEE"), 255, mUnit.translatePX(6));
		addView(mViewPager);
		addView(mIndexLayout);
	}
	
	/**
	 * 创建ViewPager填充控件
	 * @return
	 */
	private ImageView createImageView(){
		ImageView iv = new ImageView(getContext());
		iv.setLayoutParams(new LayoutParams(-1, -1));
		iv.setScaleType(scaleType);
		return iv;
	}
	
	/**
	 * 创建索引视图
	 */
	@SuppressWarnings("deprecation")
	public void createIndexs(){
		imageViews.clear();
		indexViews.clear();
		mIndexLayout.removeAllViews();
		int length = bitmaps.size();
		for (int i = 0; i < length; i++) {
			View view = new View(getContext());
			view.setLayoutParams(mIndexParams);
			view.setBackgroundDrawable(indexDefaultDrawable);
			indexViews.add(view);
			mIndexLayout.addView(view);
		}
		length = loop ? bitmaps.size() + 2 : bitmaps.size();
		for (int i = 0; i < length; i++) {
			imageViews.add(createImageView());
		}
		adapter.notifyDataSetChanged();
		currentIndex = loop ? 1 : 0;
		handlerIndex = currentIndex;
		mViewPager.setCurrentItem(currentIndex, false);
		indexViews.get(currentIndex).setBackgroundDrawable(indexSelectDrawable);
		mHandler.removeCallbacks(runnable);
		if (auto) {
			mHandler.post(runnable);
		}
	}
	
	/**
	 * 是否循环
	 * @return
	 */
	public boolean isLoop() {
		return loop;
	}

	/**
	 * 设置是否循环
	 */
	public void setLoop(boolean loop) {
		this.loop = loop;
		if (bitmaps.size() > 0) {			
			createIndexs();
		}
	}

	/**
	 * 是否自动
	 * @return
	 */
	public boolean isAuto() {
		return auto;
	}

	/**
	 * 设置是否自动
	 * @param auto
	 */
	public void setAuto(boolean auto) {
		this.auto = auto;
		if (bitmaps.size() > 0) {			
			createIndexs();
		}
	}
	
	/**
	 * 设置图片缩放方式
	 * @param scaleType
	 */
	public void setScaleType(ScaleType scaleType) {
		this.scaleType = scaleType;
	}

	/**
	 * 设置自动切换时间间隔
	 * @param carouseTime
	 */
	public void setCarouseTime(long carouseTime) {
		this.carouseTime = carouseTime;
	}

	/**
	 * 设置索引大小
	 * @param indexSize
	 */
	public void setIndexSize(int indexSize) {
		this.indexSize = indexSize;
		mIndexParams = new LinearLayout.LayoutParams(mUnit.translatePX(indexSize), mUnit.translatePX(indexSize));
		mIndexParams.setMargins(mUnit.translatePX(8), 0, 0, 0);
	}

	/**
	 * 设置索引默认图片
	 * @param indexDefaultDrawable
	 */
	public void setIndexDefaultDrawable(Drawable indexDefaultDrawable) {
		this.indexDefaultDrawable = indexDefaultDrawable;
	}

	/**
	 * 设置索引选中图片
	 * @param indexSelectDrawable
	 */
	public void setIndexSelectDrawable(Drawable indexSelectDrawable) {
		this.indexSelectDrawable = indexSelectDrawable;
	}
	
	/**
	 * 隐藏索引
	 */
	public void hideIndexs(){
		mIndexLayout.setVisibility(GONE);
	}
	
	/**
	 * 显示索引
	 */
	public void showIndexs(){
		mIndexLayout.setVisibility(VISIBLE);
	}

	private OnPageChangeListener mPageChangeListener = new OnPageChangeListener() {
		
		@SuppressWarnings("deprecation")
		@Override
		public void onPageSelected(int position) {
			if (loop) {
				if (position == 0) {
					mViewPager.setCurrentItem(imageViews.size() - 2, false);
				}else if (position == (imageViews.size() - 1)) {
					mViewPager.setCurrentItem(1, false);
				}else {
					indexViews.get(currentIndex).setBackgroundDrawable(indexDefaultDrawable);
					indexViews.get(position - 1).setBackgroundDrawable(indexSelectDrawable);
					currentIndex = position - 1;
				}
			}else {
				indexViews.get(currentIndex).setBackgroundDrawable(indexDefaultDrawable);
				indexViews.get(position).setBackgroundDrawable(indexSelectDrawable);
				currentIndex = position;
			}
		}
		
		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {}
		
		@Override
		public void onPageScrollStateChanged(int arg0) {}
	};
	
	private Runnable runnable = new Runnable() {
		
		@Override
		public void run() {
			mViewPager.setCurrentItem(handlerIndex);
			handlerIndex++;
			if (loop) {
				if (handlerIndex >= imageViews.size()) {
					handlerIndex = 1;
				}
			}else {
				if (handlerIndex >= bitmaps.size()) {
					handlerIndex = 0;
				}
			}
			mHandler.postDelayed(runnable, carouseTime);
		}
	};
	
	class ImageCarouselAdapter extends PagerAdapter{
		
		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}

		@Override
		public int getCount() {
			return imageViews.size();
		}

		@Override
		public void destroyItem(View container, int position, Object object) {}

		@Override
		public Object instantiateItem(View container, int position) {
			ViewGroup parent = (ViewGroup) imageViews.get(position).getParent();
			if (parent == null) {
				((ViewGroup) container).addView(imageViews.get(position));
			}
			if (!loop) {
				imageViews.get(position).setImageBitmap(bitmaps.get(position));
			}else {
				if (position == 0) {
					imageViews.get(position).setImageBitmap(bitmaps.get(bitmaps.size() - 1));
				}else if (position == imageViews.size() - 1) {
					imageViews.get(position).setImageBitmap(bitmaps.get(0));
				}else {
					imageViews.get(position).setImageBitmap(bitmaps.get(position - 1));
				}
			}
			return imageViews.get(position);
		}
		 
	}
	
}