package com.zhn.tongxunlu;

import java.io.File;
import java.io.IOException;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.util.EntityUtils;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.AbsListView;
import android.widget.ImageView;

/**
 * 通过图片路径，加载bitmap对象
 * 该工具类中，自动实现：
 * 单线程轮循
 * 图片内存缓存
 * 图片文件缓存
 */
public class ImageLoader {
	private Context context;
	//声明图片下载任务集合
	private List<ImageLoaderTask> tasks = new ArrayList<ImageLoaderTask>();
	//声明用于轮循图片下载任务集合的工作线程
	private Thread workThread;
	private boolean isLoop = true;
	private AbsListView listView;
		
	//声明用于保存缓存图片的缓存映射表
	private HashMap<Integer, SoftReference<Bitmap>> cache = 
			new HashMap<Integer, SoftReference<Bitmap>>();
	
	private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			//图片获取成功
			case HANDLER_LOAD_IMAGE_SUCCESS:
				//把bitmap设置到相对应的ImageView中
				ImageLoaderTask task = (ImageLoaderTask)msg.obj;
				ImageView iv = (ImageView) listView.findViewWithTag(task.position);
				if(iv!=null){
					if(task.bitmap!=null){
						iv.setImageBitmap(task.bitmap);
					}else{
						iv.setImageResource(R.drawable.preson_icon);
					}
				}
				break;
			}
		}
	};
	
	public static final int HANDLER_LOAD_IMAGE_SUCCESS = 0;
	
	public ImageLoader(Context context,AbsListView listView) {
		this.context = context;
		this.listView = listView;
		
		//初始化线程，并且启动
		workThread = new Thread(){
			public void run() {
				//不断轮循任务集合，
				//如果任务集合中有任务
				while(isLoop){
					if(!tasks.isEmpty()){//非空
						//则取出该对象并且下载该图片
						ImageLoaderTask task = tasks.remove(0);
						Bitmap bitmap = loadBitmap(task.photoId);
						task.bitmap = bitmap;
						//把bitmap显示在ImageView中
						//发消息给handler
						Message msg = new Message();
						msg.what = HANDLER_LOAD_IMAGE_SUCCESS;
						msg.obj = task;
						handler.sendMessage(msg);
					}else{//空集合
						synchronized (workThread) {
							try {
								workThread.wait();
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}
				}
			}
		};
		workThread.start();
	}
	
	/**
	 * 根据图片路径加载图片
	 * @param path
	 * @return
	 */
	public Bitmap loadBitmap(int photoId){
		try{
			Bitmap bitmap = BitmapUtils.loadBitmap(context,photoId);
			if(bitmap == null){
				return null;
			}
			//把bitmap存入内存缓存
			cache.put(photoId, new SoftReference<Bitmap>(bitmap));
			//把bitmap图片存入文件缓存
			//targetFile:	/data/data/app/cache/images/jsjs.jpg
			File targetFile = new File(context.getCacheDir(), photoId+".jpg");
			BitmapUtils.save(bitmap,targetFile);
			
			return bitmap;
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	
	/**
	 * 显示图片
	 * @param path	图片的路径
	 * @param imageView	显示图片的ImageView控件
	 * @param position	位置
	 */
	public void displayImage(int photoId,ImageView imageView,int position){
		if(photoId == 0){
			imageView.setImageResource(R.drawable.preson_icon);
			return;
		}
		//显示图片
		//给ImageView设置唯一的tag
		//用于在holder中通过tag找到该ImageView
		imageView.setTag(position);
		
		//判断	内存缓存中是否含有缓存图片
		SoftReference<Bitmap> ref = cache.get(photoId);
		if(ref != null){//以前存过
			Bitmap bit = ref.get();
			if(bit != null){//还没有被销毁，直接设置ImageView
				Log.i("info", "从内存缓存中读取的图片...");
				imageView.setImageBitmap(bit);
				return;
			}
		}
		//再去文件缓存中 查询是否有缓存图片
		//内存缓存中没有图片，则去文件缓存中读取
		String bitmapPath = new File(context.getCacheDir(),photoId+".jpg").getAbsolutePath();
		Bitmap bit = BitmapUtils.readBitmap(bitmapPath);
		if(bit != null){//从文件缓存中查到了图片
			Log.i("info", "从文件缓存中读取的图片...");
			imageView.setImageBitmap(bit);
			//把bitmap存入内存缓存
			cache.put(photoId, new SoftReference<Bitmap>(bit));
			return;
		}
		
		
		//向任务集合对象添加一个图片下载任务对象
		ImageLoaderTask task = new ImageLoaderTask();
		task.photoId = photoId;		
		task.position = position;
		//把task添加到tasks里面
		tasks.add(task);
		//唤醒工作线程 
		synchronized (workThread) {
			workThread.notify();
		}
	}
	
	class ImageLoaderTask {
		int photoId;
		String path;	//图片下载路径
		Bitmap bitmap;	//图片路径所对应的bitmap
		int position;	//保存ImageView的tag
	}
	
	/**
	 * 停止工作线程
	 */
	public void stopThread(){
		isLoop = false;
		synchronized (workThread) {
			workThread.notify();
		}
	}

	public void displayImage(Bitmap photoId, ViewHolder holder, int position) {
		// TODO Auto-generated method stub
		
	}
}
