package com.fujica.abk.utils;

import ohos.agp.window.service.DisplayManager;
import ohos.app.Context;

public class ScreenUtil {
    /**
     * Obtains the screen width.
     *
     * @param context Context
     * @return device width
     */
    public static int getScreenWidth(Context context) {
        return DisplayManager.getInstance().getDefaultDisplay(context).get().getAttributes().width;
    }

    /**
     * Obtains the screen height.
     *
     * @param context Context
     * @return device height
     */
    public static int getScreenHeight(Context context) {
        return DisplayManager.getInstance().getDefaultDisplay(context).get().getAttributes().height;
    }

    private static float densityPixels = -1;

    /**
     * 获取屏幕密度比例
     * HarmonyOS 中标准密度为 160 dpi
     * 对于 360 dpi 的屏幕，密度比例为 360/160 = 2.25
     *
     * @param context Context
     * @return density ratio (densityPixels / 160)
     */
    public static float getDensity(Context context) {
        if (densityPixels != -1) {
            return densityPixels;
        }
        try {
            densityPixels = DisplayManager.getInstance()
                    .getDefaultDisplay(context)
                    .get()
                    .getAttributes()
                    .densityPixels;
            // HarmonyOS 标准密度为 160 dpi
            // 1 vp = densityPixels / 160 px
        } catch (Exception e) {
            // 如果获取失败，使用默认密度比例 2.25 (对应 360 dpi)
            densityPixels = 2.25f;
        }
        return densityPixels;
    }

    /**
     * 将 fp 转换为 px（字体像素单位）
     * fp 会随系统字体大小设置而变化，这里简化处理使用与 vp 相同的转换方式
     *
     * @param context Context
     * @param fpValue fp value
     * @return px value
     */
    public static int fp2px(Context context, float fpValue) {
        float density = getDensity(context);
        // fp 需要考虑字体缩放，这里简化处理，使用与 vp 相同的转换方式
        // 实际应用中，fp 还需要考虑系统字体大小设置
        return (int) (fpValue * density + 0.5f);
    }

    /**
     * 将 vp 转换为 px（虚拟像素单位）
     * HarmonyOS 中标准密度为 160 dpi，1 vp = densityPixels / 160 px
     * 对于 360 dpi 屏幕：1 vp = 360 / 160 = 2.25 px
     *
     * @param context Context
     * @param vpValue vp value
     * @return px value
     */
    public static int vp2px(Context context, float vpValue) {
        float density = getDensity(context);
        // 1 vp = densityPixels / 160 px
        return (int) (vpValue * density + 0.5f);
    }
}

