package com.narutohuo.xindazhou.common.image

import android.graphics.drawable.Drawable
import android.widget.ImageView
import androidx.annotation.DrawableRes
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.bitmap.CircleCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition

/**
 * 图片加载管理器
 * 
 * 统一封装 Glide 图片加载，提供便捷的图片加载方式
 * 
 * 使用方式：
 * ```kotlin
 * // 基础加载
 * ImageLoader.load("https://example.com/image.jpg", imageView)
 * 
 * // 带占位图
 * ImageLoader.load("https://example.com/image.jpg", imageView, R.drawable.placeholder)
 * 
 * // 圆形图片
 * ImageLoader.loadCircle("https://example.com/avatar.jpg", imageView)
 * 
 * // 圆角图片
 * ImageLoader.loadRound("https://example.com/image.jpg", imageView, 10)
 * 
 * // 清除缓存
 * ImageLoader.clearCache(context)
 * ```
 */
object ImageLoader {
    
    /**
     * 默认占位图资源ID（可在 Application 中设置）
     */
    @DrawableRes
    var defaultPlaceholder: Int? = null
    
    /**
     * 默认错误图资源ID（可在 Application 中设置）
     */
    @DrawableRes
    var defaultError: Int? = null
    
    /**
     * 默认圆角半径（像素）
     */
    var defaultRadius: Int = 8
    
    /**
     * 加载图片（基础方法）
     * 
     * @param url 图片URL（可以是网络URL、本地路径、资源ID等）
     * @param imageView 目标 ImageView
     * @param placeholder 占位图资源ID（可选，如果为 null 则使用默认占位图）
     * @param error 错误图资源ID（可选，如果为 null 则使用默认错误图）
     */
    fun load(
        url: Any?,
        imageView: ImageView,
        @DrawableRes placeholder: Int? = null,
        @DrawableRes error: Int? = null
    ) {
        val requestOptions = RequestOptions()
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .skipMemoryCache(false)
        
        // 设置占位图
        placeholder?.let { requestOptions.placeholder(it) }
            ?: defaultPlaceholder?.let { requestOptions.placeholder(it) }
        
        // 设置错误图
        error?.let { requestOptions.error(it) }
            ?: defaultError?.let { requestOptions.error(it) }
        
        Glide.with(imageView.context)
            .load(url)
            .apply(requestOptions)
            .into(imageView)
    }
    
    /**
     * 加载圆形图片
     * 
     * @param url 图片URL
     * @param imageView 目标 ImageView
     * @param placeholder 占位图资源ID（可选）
     * @param error 错误图资源ID（可选）
     */
    fun loadCircle(
        url: Any?,
        imageView: ImageView,
        @DrawableRes placeholder: Int? = null,
        @DrawableRes error: Int? = null
    ) {
        val requestOptions = RequestOptions()
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .skipMemoryCache(false)
            .transform(CircleCrop())
        
        placeholder?.let { requestOptions.placeholder(it) }
            ?: defaultPlaceholder?.let { requestOptions.placeholder(it) }
        
        error?.let { requestOptions.error(it) }
            ?: defaultError?.let { requestOptions.error(it) }
        
        Glide.with(imageView.context)
            .load(url)
            .apply(requestOptions)
            .into(imageView)
    }
    
    /**
     * 加载圆角图片
     * 
     * @param url 图片URL
     * @param imageView 目标 ImageView
     * @param radius 圆角半径（像素）
     * @param placeholder 占位图资源ID（可选）
     * @param error 错误图资源ID（可选）
     */
    fun loadRound(
        url: Any?,
        imageView: ImageView,
        radius: Int = defaultRadius,
        @DrawableRes placeholder: Int? = null,
        @DrawableRes error: Int? = null
    ) {
        val requestOptions = RequestOptions()
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .skipMemoryCache(false)
            .transform(RoundedCorners(radius))
        
        placeholder?.let { requestOptions.placeholder(it) }
            ?: defaultPlaceholder?.let { requestOptions.placeholder(it) }
        
        error?.let { requestOptions.error(it) }
            ?: defaultError?.let { requestOptions.error(it) }
        
        Glide.with(imageView.context)
            .load(url)
            .apply(requestOptions)
            .into(imageView)
    }
    
    /**
     * 加载图片并获取 Drawable（用于自定义处理）
     * 
     * @param url 图片URL
     * @param onSuccess 成功回调
     * @param onError 失败回调
     */
    fun loadAsDrawable(
        url: Any?,
        imageView: ImageView,
        onSuccess: (Drawable) -> Unit,
        onError: (() -> Unit)? = null
    ) {
        Glide.with(imageView.context)
            .load(url)
            .into(object : CustomTarget<Drawable>() {
                override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
                    onSuccess(resource)
                }
                
                override fun onLoadCleared(placeholder: Drawable?) {
                    // 清理资源
                }
                
                override fun onLoadFailed(errorDrawable: Drawable?) {
                    onError?.invoke()
                }
            })
    }
    
    /**
     * 清除内存缓存
     * 
     * @param imageView ImageView 上下文
     */
    fun clearMemoryCache(imageView: ImageView) {
        Glide.get(imageView.context).clearMemory()
    }
    
    /**
     * 清除磁盘缓存（需要在后台线程执行）
     * 
     * @param imageView ImageView 上下文
     */
    fun clearDiskCache(imageView: ImageView) {
        Thread {
            Glide.get(imageView.context).clearDiskCache()
        }.start()
    }
    
    /**
     * 清除所有缓存
     * 
     * @param imageView ImageView 上下文
     */
    fun clearCache(imageView: ImageView) {
        clearMemoryCache(imageView)
        clearDiskCache(imageView)
    }
}

