package com.remax.visualnovel.utils



import android.graphics.Color
import android.util.TypedValue
import androidx.annotation.*
import androidx.core.content.ContextCompat
import com.remax.visualnovel.configs.NovelApplication

object ResUtil {

    private val appContext = NovelApplication.appContext()


    // ==================== Dimen相关 ====================
    /**
     * 获取dp值对应的像素值
     */
    fun dp(dpValue: Float): Float {
        return dpValue * appContext.resources.displayMetrics.density
    }

    fun dp(dpValue: Int): Float {
        return dp(dpValue.toFloat())
    }

    /**
     * 获取dp值对应的像素值（取整）
     */
    fun dpToPx(dpValue: Float): Int {
        return (dp(dpValue) + 0.5f).toInt()
    }

    fun dpToPx(dpValue: Int): Int {
        return dpToPx(dpValue.toFloat())
    }

    /**
     * 获取sp值对应的像素值
     */
    fun sp(spValue: Float): Float {
        return spValue * appContext.resources.displayMetrics.scaledDensity
    }

    fun sp(spValue: Int): Float {
        return sp(spValue.toFloat())
    }

    /**
     * 从dimen资源获取像素值
     */
    fun getPixelSize(@DimenRes dimenRes: Int): Int {
        return appContext.resources.getDimensionPixelSize(dimenRes)
    }

    fun getDimension(@DimenRes dimenRes: Int): Float {
        return appContext.resources.getDimension(dimenRes)
    }

    // ==================== 颜色相关 ====================

    /**
     * 从颜色资源获取颜色值
     */
    fun getColor(@ColorRes colorRes: Int): Int {
        return ContextCompat.getColor(appContext, colorRes)
    }

    /**
     * 从颜色资源获取颜色值（带透明度）
     */
    fun getColor(@ColorRes colorRes: Int, alpha: Float): Int {
        val color = getColor(colorRes)
        return applyAlphaToColor(color, alpha)
    }

    /**
     * 解析颜色字符串
     */
    fun parseColor(colorString: String): Int {
        return try {
            Color.parseColor(colorString)
        } catch (e: IllegalArgumentException) {
            Color.BLACK // 默认颜色
        }
    }

    /**
     * 给颜色应用透明度
     */
    fun applyAlphaToColor(color: Int, alpha: Float): Int {
        val alphaValue = (alpha.coerceIn(0f, 1f) * 255).toInt()
        return color and 0x00FFFFFF or (alphaValue shl 24)
    }

    /**
     * 获取主题颜色属性
     */
    fun getColorAttr(@AttrRes attrRes: Int): Int {
        val typedValue = TypedValue()
        appContext.theme.resolveAttribute(attrRes, typedValue, true)
        return typedValue.data
    }



    //==================== 扩展函数 ====================
    /**
     * Float的扩展函数：转换为dp像素值
     */
    val Float.dp: Float
        get() = ResUtil.dp(this)

    val Float.dpToPx: Int
        get() = ResUtil.dpToPx(this)

    /**
     * Int的扩展函数：转换为dp像素值
     */
    val Int.dp: Float
        get() = ResUtil.dp(this)

    val Int.dpToPx: Int
        get() = ResUtil.dpToPx(this)

    /**
     * Float的扩展函数：转换为sp像素值
     */
    val Float.sp: Float
        get() = ResUtil.sp(this)

    /**
     * 字符串的扩展函数：解析颜色
     */
    val String.colorInt: Int
        get() = ResUtil.parseColor(this)
}