package com.convenient.android.common.extension

import android.content.Context
import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import androidx.annotation.ColorInt
import androidx.annotation.IntRange
import com.convenient.android.common.utils.file.FileIOUtils
import com.convenient.android.common.utils.image.BitmapUtils
import java.io.File
import java.io.InputStream

/**
 * @classname:
 * @author: LiuXiaoLong
 * @date: 2022/7/29
 * description: bitmap 相关的扩展类
 */

/**
 * 默认宽度
 */
private val DEFALUT_REQ_WIDHT = 2000

/**
 * 默认高度
 */
private val DEFAULT_REQ_HEIGHT = 2000



/**
 * 项目中Drawable资源解析为bitmap 方法扩展
 * 该方法经过采样缩小
 * @param reqWidth 限制的最大宽度
 * @param reqHeight 限制的最大高度
 */
fun Int.decodeSampledBitmap(resources : Resources?, reqWidth : Int = DEFALUT_REQ_WIDHT, reqHeight : Int = DEFAULT_REQ_HEIGHT) : Bitmap?{
    return BitmapUtils.decodeSampledBitmapFromResource(resources, this, reqWidth, reqHeight)
}

/**
 * 返回原始bitmap大小，不进行采样缩小图片处理
 */
fun Int.decodeBitmap(resources: Resources?) : Bitmap?{
    return BitmapFactory.decodeResource(resources, this)
}


/**
 * 解析获取经过采样缩小后的bitmap
 * @param reqWidth 限制的最大宽度
 * @param reqHeight 限制的最大高度
 */
fun String.decodeSampledBitmap(reqWidth: Int = DEFALUT_REQ_WIDHT, reqHeight: Int = DEFAULT_REQ_HEIGHT) : Bitmap?{
    return BitmapUtils.decodeSampledBitmapFromPath(this, reqWidth, reqHeight)
}

/**
 * 解析获取原始bitmap，不进行采样缩小图片处理
 */
fun String.decodeBitmap() : Bitmap{
    return BitmapFactory.decodeFile(this)
}


/**
 * 从uri解析出经过采样处理后的bitmap
 * @param reqWidth 限制的宽度
 * @param reqHeight 限制的高度
 */
fun Uri.decodeSampleBitmap(context: Context, reqWidth: Int = DEFALUT_REQ_WIDHT, reqHeight: Int = DEFAULT_REQ_HEIGHT) : Bitmap?{
    return BitmapUtils.decodeSampledBitmapFromUri(context, this, reqWidth, reqHeight)
}

/**
 * 从uri解析出原始大小的bitmap
 */
fun Uri.decodeBitmap(context: Context) : Bitmap?{
    return try {
        val fileDescriptor = context.contentResolver.openFileDescriptor(this, "r")
        val bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor?.fileDescriptor)
        fileDescriptor?.close()
        bitmap
    }catch (e : Exception){
        null
    }
}

/**
 * 按照百分比压缩bitmap
 * @param percent 百分比 0-100
 */
fun Bitmap.compressImage(@IntRange(from = 0, to =  100) percent : Int = 80) : Bitmap?{
    return BitmapUtils.compressImage(this, percent)
}

/**
 * 保存到文件
 * @param file 保存到该文件
 * @param quality 保存的图片质量
 * @param compressFormat 保存的图片格式
 */
fun Bitmap.saveToFile(file: File?, @IntRange(from = 10, to = 100) quality : Int = 100, compressFormat: Bitmap.CompressFormat = Bitmap.CompressFormat.PNG) : Boolean{
    return BitmapUtils.saveBitmapToFile(bitmap = this, file = file, quality = quality, compressFormat = compressFormat)
}

/**
 * 保存到指定目录下
 * @param fileDir 要保存的指定目录
 * @param compressFormat 保存的图片格式
 */
fun Bitmap.saveToDir(fileDir : String, compressFormat: Bitmap.CompressFormat = Bitmap.CompressFormat.PNG) : String?{
    return BitmapUtils.saveBitmapToFile(bitmap = this, dir = fileDir, compressFormat = compressFormat)
}


/**
 * 旋转bitmap
 * @param degrees 要旋转的角度
 */
fun Bitmap?.rotate(degrees : Float) : Bitmap?{
    return BitmapUtils.rotateImage(this, degrees)
}

/**
 * 获取到bitmap的旋转角度
 */
fun String?.getBitmapDegree() : Int{
    return BitmapUtils.getBitmapDegree(this)
}

fun InputStream?.getBitmapDegree() : Int{
    return BitmapUtils.getBitmapDegree(this)
}

/**
 * 恢复图片旋转角度，会获取到图片的角度，修正后替换源图片
 */
suspend fun String.restoreImageAngle() : Boolean{
    return BitmapUtils.rotatePicture(this)
}

/**
 * 复制Uri媒体内容到文件
 * @param path 要保存的目标文件路径
 */
fun Uri.copyBitmapToFile(context: Context, path : String?) : Boolean{
    return FileIOUtils.writeFileFromIS(path?.toFile(), context.contentResolver.openInputStream(this))
}

/**
 * 替换bitmap的颜色
 * @param srcColor 被替换的颜色
 * @param destColor 填充色
 */
fun Bitmap?.replaceBitmapColor(@ColorInt srcColor : Int,@ColorInt destColor : Int) : Bitmap?{
    return BitmapUtils.replaceBitmapColor(this, srcColor, destColor)
}


/**
 * 压缩图片大小
 */
fun Bitmap?.compressImageForSize(size: Int) : Bitmap?{
    return BitmapUtils.compressImageForSize(this, size)
}


/**
 * 裁剪bitmap
 */
fun Bitmap?.createBitmapFitRect(width : Float, height : Float) : Bitmap?{
    return BitmapUtils.createBitmapFitRect(this, width, height)
}


/**
 * 根据新的宽度等比缩放图片
 * @param newWidth bitmap 新的宽度
 * @param isRecycle 是否回收源图片
 * @return 返回一张新的bitmap
 */
fun Bitmap?.fitBitmap(newWidth : Int, isRecycle : Boolean) : Bitmap?{
    return BitmapUtils.fitBitmap(this, newWidth, isRecycle)
}


/**
 * 缩放图片
 */
fun Bitmap?.scaleImage(width: Int) : Bitmap?{
    return BitmapUtils.scaleImage(this, width)
}

fun Bitmap?.scaleImage(scaleX : Float, scaleY : Float) : Bitmap?{
    return BitmapUtils.scaleImage(this, scaleX, scaleY)
}

/**
 * 图片灰度处理
 */
fun Bitmap?.greyScale() : Bitmap? = BitmapUtils.greyscale(this)

/**
 * 设置图片透明度
 * @param alpha 图片透明度 0-255
 */
fun Bitmap?.setAlpha(@IntRange(from = 0, to = 255) alpha : Int) : Bitmap? = BitmapUtils.setAlpha(this, alpha)

/**
 * 图片进行亮度、对比度调节
 * @param light 亮度  -1 不做处理
 * @param contrast 对比度 -1：不做处理
 */
fun Bitmap?.filter(light : Int, contrast : Int) : Bitmap? = BitmapUtils.filter(this, light, contrast)

/**
 * bitmap 文件是否可用
 */
fun String?.bitmapFileIsAvailable() : Boolean = this?.let { BitmapUtils.bitmapFileIsAvailable(it) }?:false


