package com.cooleshow.base.utils;

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

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.FutureTarget;
import com.bumptech.glide.request.RequestOptions;
import com.cooleshow.base.R;
import com.cooleshow.base.common.BaseApplication;
import com.cooleshow.base.widgets.transformation.BlurTransformation;
import com.cooleshow.base.widgets.transformation.CircleTransformation;
import com.cooleshow.base.widgets.transformation.RadiusTransformation;

import java.io.File;

import androidx.annotation.DrawableRes;

/**
 * Description:
 * Copyright  : Copyright (c) 2018
 * Company    : 蓝鲸分期
 * Author     : 刘瑞
 * Date       : 2019/4/15 9:54
 */
public class GlideImageLoaderUtils {
    private static GlideImageLoaderUtils mInstance;

    private GlideImageLoaderUtils() {
    }

    public static GlideImageLoaderUtils getInstance() {
        if (mInstance == null) {
            synchronized (GlideImageLoaderUtils.class) {
                if (mInstance == null) {
                    mInstance = new GlideImageLoaderUtils();
                }
            }
        }
        return mInstance;
    }

    //    public static final int R.mipmap.bg_loading = R.mipmap.bg_loading;
    //    public static final int errorSoWhite = R.mipmap.bg_loading;
    // public static final int soWhite = R.mipmap.bg_loading;

    /*
     *加载图片(默认)
     */
    public void loadImageBanner(Context context, Object url, ImageView imageView) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.bg_loading) //占位图
                .error(R.drawable.bg_loading)       //错误图
                //             .priority(Priority.HIGH)
                .diskCacheStrategy(DiskCacheStrategy.ALL);
        Glide.with(context).load(url).apply(options).into(imageView);

    }

    /**
     * 加载图片(默认)
     */
    public void loadImage(Context context, Object url, ImageView imageView) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.bg_loading) //占位图
                .error(R.drawable.bg_loading)       //错误图
                .diskCacheStrategy(DiskCacheStrategy.NONE);
        Glide.with(context).load(url).apply(options).into(imageView);

    }

    /**
     * 加载图片(默认)
     */
    public void loadImageCenterInside(Context context, Object url, ImageView imageView) {
        RequestOptions options = new RequestOptions()
                .centerInside()
                .placeholder(R.drawable.bg_loading) //占位图
                .error(R.drawable.bg_loading)       //错误图
                .diskCacheStrategy(DiskCacheStrategy.NONE);
        Glide.with(context).load(url).apply(options).into(imageView);

    }

    /**
     * 指定图片大小;使用override()方法指定了一个图片的尺寸。
     * Glide现在只会将图片加载成width*height像素的尺寸，而不会管你的ImageView的大小是多少了。
     * 如果你想加载一张图片的原始尺寸的话，可以使用Target.SIZE_ORIGINAL关键字----override(Target.SIZE_ORIGINAL)
     *
     * @param context
     * @param url
     * @param imageView
     * @param width
     * @param height
     */
    public void loadImageSize(Context context, Object url, ImageView imageView, int width, int height) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.bg_loading) //占位图
                .error(R.drawable.bg_loading)       //错误图
                .override(width, height)
                // .priority(Priority.HIGH)
                .diskCacheStrategy(DiskCacheStrategy.ALL);
        Glide.with(context).load(url).apply(options).into(imageView);

    }


    /**
     * 禁用内存缓存功能
     * diskCacheStrategy()方法基本上就是Glide硬盘缓存功能的一切，它可以接收五种参数：
     * <p>
     * DiskCacheStrategy.NONE： 表示不缓存任何内容。
     * DiskCacheStrategy.DATA： 表示只缓存原始图片。
     * DiskCacheStrategy.RESOURCE： 表示只缓存转换过后的图片。
     * DiskCacheStrategy.ALL ： 表示既缓存原始图片，也缓存转换过后的图片。
     * DiskCacheStrategy.AUTOMATIC： 表示让Glide根据图片资源智能地选择使用哪一种缓存策略（默认选项）。
     */

    public void loadImageSizekipMemoryCache(Context context, Object url, ImageView imageView) {
        RequestOptions options = new RequestOptions()
                .placeholder(R.drawable.bg_loading) //占位图
                .error(R.drawable.bg_loading)       //错误图S
                .skipMemoryCache(true)//禁用掉Glide的内存缓存功能
                .diskCacheStrategy(DiskCacheStrategy.ALL);
        Glide.with(context).load(url).apply(options).into(imageView);

    }


    /**
     * 加载圆形图片
     */
    public void loadCircleImage(Context context, Object url, ImageView imageView) {
        if (BaseApplication.Companion.isTeacherClient()) {
            loadCircleImage(context, url, R.drawable.ic_stu_student_head, imageView);
        } else {
            loadCircleImage(context, url, R.drawable.ic_stu_student_head, imageView);
        }
    }

    /**
     * 加载圆形图片
     */
    public void loadCircleImage(Context context, Object url, @DrawableRes int error, ImageView imageView) {

        RequestOptions options = new RequestOptions()
                .centerCrop()
                .circleCrop()
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .placeholder(error)
                .error(error);
        Glide.with(context).load(url).apply(options).into(imageView);
    }


    /**
     * 预先加载图片
     * 在使用图片之前，预先把图片加载到缓存，调用了预加载之后，我们以后想再去加载这张图片就会非常快了，
     * 因为Glide会直接从缓存当中去读取图片并显示出来
     */
    public void preloadImage(Context context, Object url) {
        Glide.with(context)
                .load(url)
                .preload();

    }

    /**
     * 加载圆角图片
     */
    public void loadRoundCircleImage(Context context, Object url, ImageView imageView) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .circleCrop()//设置圆形
                .placeholder(R.drawable.bg_loading)
                .error(R.drawable.bg_loading)
                //.priority(Priority.HIGH)
                .bitmapTransform(new CircleTransformation())
                .diskCacheStrategy(DiskCacheStrategy.ALL);
        Glide.with(context).load(url).apply(options).into(imageView);

    }


    /**
     * 加载圆角图片-指定任意部分圆角（图片上、下、左、右四个角度任意定义）
     *
     * @param context
     * @param url
     * @param imageView
     * @param radious
     */
    public void loadCustRoundCircleImage(Context context, Object url, ImageView imageView, int radious) {
        RequestOptions options = new RequestOptions()
                .placeholder(R.drawable.bg_loading)
                .error(R.drawable.bg_loading)
                //.priority(Priority.HIGH)
                .transform(new RadiusTransformation(context, radious))
                .diskCacheStrategy(DiskCacheStrategy.NONE);

        Glide.with(context).load(url).apply(options).into(imageView);
    }


    /**
     * 加载模糊图片（自定义透明度）
     *
     * @param context
     * @param url
     * @param imageView
     * @param blur      模糊度，一般1-100够了，越大越模糊
     */
    public void loadBlurImage(Context context, Object url, ImageView imageView, int blur) {
        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(R.drawable.bg_loading)
                .error(R.drawable.bg_loading)
                //.priority(Priority.HIGH)
                .bitmapTransform(new BlurTransformation(context, blur))
                .diskCacheStrategy(DiskCacheStrategy.ALL);
        Glide.with(context).load(url).apply(options).into(imageView);
    }

    /*
     *加载灰度(黑白)图片（自定义透明度）
     */
    public void loadBlackImage(Context context, String url, ImageView imageView) {
        //    RequestOptions options = new RequestOptions()
        //            .centerCrop()
        //            .placeholder(R.mipmap.bg_loading)
        //            .error(errorSoWhite)
        //            //.priority(Priority.HIGH)
        //            .bitmapTransform(new GrayscaleTransformation())
        //            .diskCacheStrategy(DiskCacheStrategy.ALL);
        //    Glide.with(context).load(url).apply(options).into(imageView);
    }

    /**
     * Glide.with(this).asGif()    //强制指定加载动态图片
     * 如果加载的图片不是gif，则asGif()会报错， 当然，asGif()不写也是可以正常加载的。
     * 加入了一个asBitmap()方法，这个方法的意思就是说这里只允许加载静态图片，不需要Glide去帮我们自动进行图片格式的判断了。
     * 如果你传入的还是一张GIF图的话，Glide会展示这张GIF图的第一帧，而不会去播放它。
     *
     * @param context
     * @param url       例如：https://image.niwoxuexi.com/blog/content/5c0d4b1972-loading.gif
     * @param imageView
     */
    public static void loadGif(Context context, Object url, ImageView imageView) {
        RequestOptions options = new RequestOptions()
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE);
        Glide.with(context)
                .asGif()
                .load(url)
                .apply(options)
                .into(imageView);
    }

    public static int dip2px(Context context, float dp) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dp * scale + 0.5f);
    }

    public void downloadImage(final Context context, final Object url) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //String url = "http://www.guolin.tech/book.png";
                    FutureTarget<File> target = Glide.with(context)
                            .asFile()
                            .load(url)
                            .submit();
                    final File imageFile = target.get();
                    Log.d("logcat", "下载好的图片文件路径=" + imageFile.getPath());
                    //                    runOnUiThread(new Runnable() {
                    //                        @Override
                    //                        public void run() {
                    //                            Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();
                    //                        }
                    //                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();


    }
}
