package com.xyzshell.andinfo.libs

import android.content.Context
import android.hardware.display.DisplayManager
import android.os.Build
import android.view.Display
import android.graphics.Point
import android.util.DisplayMetrics
import kotlin.math.sqrt


/**
 * 显示信息类，用于获取设备屏幕相关信息
 */
class DisplayInfo(private val context: Context) {

    private val displayManager = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager

    /**
     * 获取默认显示器信息
     * @return 默认显示器信息对象，如果获取失败返回 null
     */
    fun getDefaultDisplayInfo(): DefaultDisplayInfo? {
        val defaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY) ?: return null

        val displayMetrics = DisplayMetrics()
        defaultDisplay.getMetrics(displayMetrics)

        val size = Point()
        defaultDisplay.getSize(size)

        val mode = defaultDisplay.mode
        val refreshRate = mode.refreshRate
        // 计算 PPI (每英寸像素数)
        val ppi = calculatePPI(displayMetrics.widthPixels, displayMetrics.heightPixels, displayMetrics.densityDpi)
        // 获取支持的刷新率列表
        val supportedRefreshRates = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            defaultDisplay.supportedModes.map { it.refreshRate }.distinct().sorted()
        } else {
            listOf(refreshRate)
        }

        // 检查是否支持 HDR 及 HDR 类型
        val hdrTypes = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
            defaultDisplay.mode?.supportedHdrTypes?.map { getHdrTypeName(it) } ?: emptyList()
        } else {
            emptyList()
        }
        val isHdr = hdrTypes.isNotEmpty()

        // 检查是否支持广色域
        val isWideColorGamut = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            defaultDisplay.isWideColorGamut
        } else {
            false
        }

        return DefaultDisplayInfo(
            id = defaultDisplay.displayId,
            name = defaultDisplay.name,
            widthPixels = displayMetrics.widthPixels,
            heightPixels = displayMetrics.heightPixels,
            densityDpi = displayMetrics.densityDpi,
            xdpi = displayMetrics.xdpi,
            ydpi = displayMetrics.ydpi,
            ppi = ppi,
            refreshRate = refreshRate,
            supportedRefreshRates = supportedRefreshRates,
            isHdr = isHdr,
            hdrTypes,
            isWideColorGamut = isWideColorGamut
        )
    }

    /**
     * 获取 HDR 类型名称
     * @param hdrType HDR 类型常量
     * @return HDR 类型名称
     */
    private fun getHdrTypeName(hdrType: Int): String {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            when (hdrType) {
                Display.HdrCapabilities.HDR_TYPE_DOLBY_VISION -> "Dolby Vision"
                Display.HdrCapabilities.HDR_TYPE_HDR10 -> "HDR10"
                Display.HdrCapabilities.HDR_TYPE_HLG -> "HLG"
                Display.HdrCapabilities.HDR_TYPE_HDR10_PLUS -> "HDR10+"
                else -> "Unknown HDR Type ($hdrType)"
            }
        } else {
            "Unknown"
        }
    }
    /**
     * 计算屏幕 PPI (每英寸像素数)
     * @param widthPixels 屏幕宽度像素
     * @param heightPixels 屏幕高度像素
     * @param densityDpi 屏幕密度 DPI
     * @return PPI 值
     */
    private fun calculatePPI(widthPixels: Int, heightPixels: Int, densityDpi: Int): Double {
        // 使用勾股定理计算对角线像素数
        val diagonalPixels = sqrt((widthPixels * widthPixels + heightPixels * heightPixels).toDouble())

        // 通过 densityDpi 计算屏幕对角线英寸数
        // 160 DPI 是 Android 的基准密度 (mdpi)
        val diagonalInches = diagonalPixels / densityDpi

        // PPI = 对角线像素数 / 对角线英寸数
        return diagonalPixels / diagonalInches
    }

    /**
     * 默认显示器信息数据类
     * @property id 显示器 ID
     * @property name 显示器名称
     * @property widthPixels 屏幕宽度（像素）
     * @property heightPixels 屏幕高度（像素）
     * @property densityDpi 屏幕密度 DPI
     * @property xdpi X 轴每英寸像素数
     * @property ydpi Y 轴每英寸像素数
     * @property ppi 屏幕 PPI（每英寸像素数）
     * @property refreshRate 当前刷新率（Hz）
     * @property supportedRefreshRates 支持的刷新率列表（Hz）
     * @property isHdr 是否支持 HDR
     * @property hdrTypes 支持的 HDR 类型列表
     * @property isWideColorGamut 是否支持广色域
     */
    data class DefaultDisplayInfo(
        val id: Int,                              // 显示器 ID
        val name: String,                         // 显示器名称
        val widthPixels: Int,                     // 屏幕宽度（像素）
        val heightPixels: Int,                    // 屏幕高度（像素）
        val densityDpi: Int,                      // 屏幕密度 DPI
        val xdpi: Float,                          // X 轴 DPI
        val ydpi: Float,                          // Y 轴 DPI
        val ppi: Double,                          // 屏幕 PPI
        val refreshRate: Float,                   // 当前刷新率（Hz）
        val supportedRefreshRates: List<Float>,   // 支持的刷新率列表（Hz）
        val isHdr: Boolean,                       // 是否支持 HDR
        val hdrTypes: List<String>,               // 支持的 HDR 类型列表
        val isWideColorGamut: Boolean             // 是否支持广色域
    )
}
