package com.common.commonlib.image.loader

import android.content.Context
import android.graphics.drawable.Drawable
import android.widget.ImageView
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestBuilder
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import com.bumptech.glide.load.resource.bitmap.GranularRoundedCorners
import com.common.commonlib.image.config.GlideBaseConfig
import com.common.commonlib.image.config.GlideHolderConfig
import com.common.commonlib.image.config.GlideTransitionConfig
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

/**
 * 图片加载类
 *
 * @author wangym
 * @since 2021/7/28
 */
object ImageLoader : ILoader {

    /**
     * 初始化Glide基础配置
     */
    override fun init(
        context: Context, memoryCategory: GlideBaseConfig.MemoryType
    ) {
        Glide.get(context).setMemoryCategory(memoryCategory.memoryCategory)
    }

    /**
     * 设置全局占位符配置
     * @param globalHolderConfig 占位符配置
     */
    fun setGlobalConfig(globalHolderConfig: GlideHolderConfig) {
        GlobalConfigHelper.globalHolderConfig = globalHolderConfig
    }

    /**
     * 设置全局过渡效果
     * @param transitionConfig 全局过渡配置
     */
    fun setGlobalTransition(transitionConfig: GlideTransitionConfig) {
        GlobalConfigHelper.globalTransition = transitionConfig.transition
    }

    /**
     * 加载图片
     * @param context 上下文
     * @param url 图片链接
     * @param view 图片控件
     */
    override fun load(context: Context, url: String?, view: ImageView) {
        loadWithMode(context, url, view, GlideBaseConfig.LoadMode.DEFAULT)
    }

    /**
     * 加载圆角图片
     * @param context 上下文
     * @param url 图片链接
     * @param view 图片控件
     * @param radius 圆角弧度
     */
    override fun loadRound(context: Context, url: String?, view: ImageView, radius: Float) {
        var request = GlobalConfigHelper.loadWithGlobalConfig(Glide.with(context).load(url))
        request = ConfigHelper.loadWithMod(request, GlideBaseConfig.LoadMode.DEFAULT)

        val transformations = ArrayList<BitmapTransformation>()
        transformations.add(GranularRoundedCorners(radius, radius, radius, radius))
        request = ConfigHelper.loadWithTransformation(request, transformations)
        loadIntoView(request, view)
    }

    /**
     * 以模式，加载图片
     * @param context 上下文
     * @param url 图片链接
     * @param view 图片控件
     * @param loadingMode 加载模式
     */
    override fun loadWithMode(
        context: Context,
        url: String?,
        view: ImageView,
        loadingMode: GlideBaseConfig.LoadMode
    ) {
        var request = GlobalConfigHelper.loadWithGlobalConfig(Glide.with(context).load(url))
        request = ConfigHelper.loadWithMod(request, loadingMode)
        loadIntoView(request, view)
    }

    /**
     * 加载图片，带有占位图
     * @param context 上下文
     * @param url 图片链接
     * @param view 图片控件
     * @param placeGlideHolder 占位图
     */
    override fun loadWithPlaceHolder(
        context: Context,
        url: String,
        view: ImageView,
        placeGlideHolder: GlideHolderConfig
    ) {
        loadIntoView(
            GlobalConfigHelper.loadWithGlobalConfig(
                Glide.with(context).load(url),
                placeGlideHolder
            ), view
        )
    }

    /**
     * 加载进控件
     * @param requestBuilder 请求构建器
     * @param view 图片控件
     */
    private fun loadIntoView(requestBuilder: RequestBuilder<Drawable>, view: ImageView) {
        requestBuilder.into(view)
    }

    /**
     * 清理内存缓存
     * @param context 上下文
     */
    override fun clearMemoryCache(context: Context) {
        GlobalScope.launch(Dispatchers.Main) {
            Glide.get(context).clearMemory()
        }
    }

    /**
     * 清理磁盘缓存
     * @param context 上下文
     */
    override fun clearDiskCache(context: Context) = runBlocking<Unit> {
        launch(Dispatchers.Default) {
            Glide.get(context).clearDiskCache()
        }
    }

    /**
     * 清理缓存
     * @param context 上下文
     */
    override fun clearAllCache(context: Context) = runBlocking<Unit> {
        GlobalScope.launch(Dispatchers.Main) {
            Glide.get(context).clearMemory()
        }
        launch(Dispatchers.Default) {
            Glide.get(context).clearDiskCache()
        }
    }
}