package com.fxy.baselibrary.imageloader;

import android.content.Context;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.bumptech.glide.request.RequestOptions;
import com.fxy.baselibrary.R;

import jp.wasabeef.glide.transformations.BlurTransformation;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;


/**
 * 项目名称：FingerCRM
 * 类描述：GlideUtil   Glide加载图片的封装，圆形、圆角，模糊等处理操作
 * 创建人：lzy
 * 创建时间：2016/9/28 10:55
 * 修改人：COMP-021-2001
 * 修改时间：2016/9/28 10:55
 * 修改备注：
 */
public class GlideUtil {
    private static GlideUtil mInstance;
    private GlideUtil(){}
    public static GlideUtil getInstance() {
        if (mInstance == null) {
            synchronized (GlideUtil.class) {
                if (mInstance == null) {
                    mInstance = new GlideUtil();
                }
            }
        }
        return mInstance;
    }
//    public enum Priority {
//        IMMEDIATE, //中等
//        HIGH,//最高
//        NORMAL,//默认
//        LOW, priority, //最低
//    }
    /**
     * 常量
     */
    static class Contants {
        public static final int BLUR_VALUE = 20; //模糊
        public static final int CORNER_RADIUS = 10; //圆角
        public static final float THUMB_SIZE = 0.5f; //0-1之间  10%原图的大小
    }

    /**
     * 常规加载图片
     * @param context
     * @param imageView  图片容器
     * @param imgUrl  图片地址
     * @param isFade  是否需要动画
     */
    public void loadImage(Context context, ImageView imageView,
                          String imgUrl, boolean isFade) {
        loadImage(context,imageView,imgUrl,isFade, R.drawable.img_failure,R.drawable.ic_default_img);
    }
    /**
     * 常规加载图片(加载本地)
     * @param context
     * @param imageView  图片容器
     * @param imgUrl  图片地址
     * @param isFade  是否需要动画
     */
    public void loadImage(Context context, ImageView imageView,
                          int imgUrl, boolean isFade) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.ic_default_img)
                .error(R.drawable.img_failure)
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        if (isFade) {
            Glide.with(context)
                    .load(imgUrl)
                    .apply(options)
                    .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                    .into(imageView);
        } else {
            Glide.with(context)
                    .load(imgUrl)
                    .apply(options)
                    .into(imageView);
        }
    }
    public void loadImage(Context context, ImageView imageView,
                          String imgUrl, boolean isFade, int defImg) {
        loadImage(context,imageView,imgUrl,isFade,defImg,R.drawable.ic_default_img);

    }
    public void loadImage(Context context, ImageView imageView,
                          String imgUrl, boolean isFade, int defImg, int placeholderImg) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(placeholderImg)
                .error(defImg)
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        if (isFade) {
            Glide.with(context)
                    .load(imgUrl)
                    .apply(options)
                    .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒

                    .into(imageView);
        } else {
            Glide.with(context)
                    .load(imgUrl)
                    .apply(options)
                    .into(imageView);
        }
    }
    /**
     * 加载缩略图
     * @param context
     * @param imageView  图片容器
     * @param imgUrl  图片地址
     */
    public void loadThumbnailImage(Context context, ImageView imageView, String imgUrl) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.ic_default_img)
                .error(R.drawable.img_failure)
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        Glide.with(context)
                .load(imgUrl)
                .apply(options)
                .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                .thumbnail(Contants.THUMB_SIZE)
                .into(imageView);
    }

    /**
     * 加载图片并设置为指定大小
     * @param context
     * @param imageView
     * @param imgUrl
     * @param withSize
     * @param heightSize
     */
    public void loadOverrideImage(Context context, ImageView imageView,
                                  String imgUrl, int withSize, int heightSize) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.ic_default_img)
                .error(R.drawable.img_failure)
                .override(withSize, heightSize)
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        Glide.with(context)
                .load(imgUrl)
                .apply(options)
                .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                .into(imageView);
    }

    /**
     * 加载图片并对其进行模糊处理
     * @param context
     * @param imageView
     * @param imgUrl
     */
    public void loadBlurImage(Context context, ImageView imageView, String imgUrl) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.ic_default_img)
                .error(R.drawable.img_failure)
                .bitmapTransform(new BlurTransformation( Contants.BLUR_VALUE))
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        Glide.with(context)
                .load(imgUrl)
                .apply(options)
                .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                .into(imageView);
    }
    /**
     * 加载图片并对其进行模糊处理(本地)
     * @param context
     * @param imageView
     * @param imgUrl
     */
    public void loadBlurImage(Context context, ImageView imageView, int imgUrl) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.ic_default_img)
                .error(R.drawable.img_failure)
                .bitmapTransform(new BlurTransformation( Contants.BLUR_VALUE))
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        Glide.with(context)
                .load(imgUrl)
                .apply(options)
                .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                .into(imageView);
    }

    /**
     * 加载圆图
     * @param context
     * @param imageView
     * @param imgUrl
     */
    public void loadCircleImage(Context context, ImageView imageView, String imgUrl) {
        loadCircleImage(context,imageView,imgUrl,R.drawable.icon_default_head_photo,R.drawable.icon_default_head_photo);
//        loadCircleImage(context,imageView,imgUrl,R.drawable.icon_default_head_photo,R.drawable.img_failure);
//        Glide.with(context)
//                .load(imgUrl)
//                .placeholder(R.drawable.icon_default_head_photo)
//                .error(R.drawable.icon_default_head_photo)
//                .crossFade()
//                .priority(Priority.NORMAL) //下载的优先级
//                .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
//                .bitmapTransform(new CropCircleTransformation(context))
//                .into(imageView);
    }
    /**
     * 加载圆图
     * @param context
     * @param imageView
     * @param imgUrl
     * @param defImg  加载中的默认图
     * @param errorImg  加载失败显示的图像
     */
    public void loadCircleImage(Context context, ImageView imageView, String imgUrl, int defImg,int errorImg) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(defImg)
                .error(errorImg)
                .circleCrop()
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;

        Glide.with(context)
                .load(imgUrl)
                .apply(options)
                .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                .into(imageView);
    }

    /**
     * 加载模糊的圆角的图片
     * @param context
     * @param imageView
     * @param imgUrl
     */
    public void loadBlurCircleImage(Context context, ImageView imageView, String imgUrl) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.ic_default_img)
                .error(R.drawable.img_failure)
                .bitmapTransform(new BlurTransformation( Contants.BLUR_VALUE))
                .circleCrop()
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        Glide.with(context)
                .load(imgUrl)
                .apply(options)
                .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                .into(imageView);
    }

    /**
     * 加载圆角图片
     * @param context
     * @param imageView
     * @param imgUrl
     */
    public void loadCornerImage(Context context, ImageView imageView, String imgUrl) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.ic_default_img)
                .error(R.drawable.img_failure)
                .bitmapTransform(new RoundedCornersTransformation( Contants.CORNER_RADIUS, Contants.CORNER_RADIUS))
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        Glide.with(context)
                .load(imgUrl)
                .apply(options)
                .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                .into(imageView);
    }

    /**
     * 加载模糊的圆角图片
     * @param context
     * @param imageView
     * @param imgUrl
     */
    public void loadBlurCornerImage(Context context, ImageView imageView, String imgUrl) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.ic_default_img)
                .error(R.drawable.img_failure)
                .bitmapTransform(new RoundedCornersTransformation(Contants.CORNER_RADIUS, Contants.CORNER_RADIUS))
                .bitmapTransform(new BlurTransformation( Contants.BLUR_VALUE))
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        Glide.with(context)
                .load(imgUrl)
                .apply(options)
                .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                .into(imageView);
    }

//    /**
//     * 同步加载图片
//     * @param context
//     * @param imgUrl
//     * @param target
//     */
//    public void loadBitmapSync(Context context, String imgUrl, SimpleTarget<Bitmap> target) {
//        GlideApp.with(context)
//                .load(imgUrl)
//
//                .priority(Priority.NORMAL) //下载的优先级
//                .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
//                .into(target);
//    }

    /**
     * 加载gif
     * @param context
     * @param imageView
     * @param imgUrl
     */
    public void loadGifImage(Context context, ImageView imageView, String imgUrl) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.ic_default_img)
                .error(R.drawable.img_failure)
//                .asGif()
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        Glide.with(context)
                .load(imgUrl)
                .apply(options)
                .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                .into(imageView);
    }

    /**
     * 加载gif的缩略图
     * @param context
     * @param imageView
     * @param imgUrl
     */
    public void loadGifThumbnailImage(Context context, ImageView imageView, String imgUrl) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.ic_default_img)
                .error(R.drawable.img_failure)
                .priority(Priority.NORMAL) //下载的优先级
                //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
                //source:缓存源资源   result：缓存转换后的资源
                .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存策略;
        Glide.with(context)
                .load(imgUrl)
//                .asGif()
                .apply(options)
                .thumbnail(Contants.THUMB_SIZE)
                .transition(new DrawableTransitionOptions().crossFade(2000)) //淡入淡出2秒
                .into(imageView);
    }

    /**
     * 恢复请求，一般在停止滚动的时候
     * @param context
     */
    public void resumeRequests(Context context) {
        Glide.with(context).resumeRequests();
    }

    /**
     * 暂停请求 正在滚动的时候
     * @param context
     */
    public void pauseRequests(Context context) {
        Glide.with(context).pauseRequests();
    }

    /**
     * 清除磁盘缓存
     * @param context
     */
    public void clearDiskCache(final Context context) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Glide.get(context).clearDiskCache();//清理磁盘缓存 需要在子线程中执行
            }
        }).start();
    }

    /**
     * 清除内存缓存
     * @param context
     */
    public void clearMemory(Context context) {
        Glide.get(context).clearMemory();//清理内存缓存  可以在UI主线程中进行
    }

}
