package cc.winboll.studio.powerbell.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
import cc.winboll.studio.libappbase.LogUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
 * @Date 2025/12/08 21:11
 * @Describe 把 R.drawable 中的图片保存为 File 对象的工具类
 * 适配 PowerBell 项目：支持指定保存路径、自动创建目录、处理PNG图片压缩
 */
public class DrawableToFileUtils {
    private static final String TAG = "DrawableToFileUtils";
    
    /**
     * 核心方法：将 R.drawable 图片保存为 File 对象
     * @param context 上下文（用于获取 Resources）
     * @param drawableResId 图片资源ID（如 R.drawable.ic_test_png）
     * @param fileName 保存的文件名（需带 .png 后缀，如 "test_drawable.png"）
     * @return 保存成功返回 File 对象，失败返回 null
     */
    public static File saveDrawableToFile(Context context, int drawableResId, String filePath) {
        // 1. 校验参数（避免空指针/无效参数）
        if (context == null || drawableResId == 0 || filePath == null || filePath.isEmpty()) {
            LogUtils.e(TAG, "【保存失败】参数无效（context为空/资源ID为0/文件名为空）");
            return null;
        }
        if (!filePath.endsWith(".png")) {
            filePath += ".png"; // 强制添加 .png 后缀，确保图片格式正确
            LogUtils.d(TAG, "【格式适配】自动添加.png后缀，最终文件名：" + filePath);
        }

        // 3. 构建目标 File 对象（最终保存的文件路径）
        File targetFile = new File(filePath);
        LogUtils.d(TAG, "【保存路径】目标文件路径：" + targetFile.getAbsolutePath());

        // 4. 读取 drawable 资源为 Bitmap（处理高清图/缩放问题）
        Bitmap bitmap = null;
        try {
            // 读取 drawable 资源（适配不同分辨率的图片，避免变形）
            bitmap = BitmapFactory.decodeResource(context.getResources(), drawableResId);
            if (bitmap == null) {
                LogUtils.e(TAG, "【读取失败】无法读取drawable资源（资源ID：" + drawableResId + "）");
                return null;
            }
            LogUtils.d(TAG, "【读取成功】drawable资源转Bitmap成功（宽：" + bitmap.getWidth() + "，高：" + bitmap.getHeight() + "）");

            // 5. 将 Bitmap 写入 File（PNG格式，无损保存）
            FileOutputStream fos = new FileOutputStream(targetFile);
            // 压缩参数：PNG格式，质量100（无损），写入输出流
            boolean isSaved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.flush(); // 刷新输出流
            fos.close(); // 关闭输出流

            // 6. 校验保存结果（文件是否存在且有效）
            if (isSaved && targetFile.exists() && targetFile.length() > 100) {
                LogUtils.d(TAG, "【保存成功】drawable图片保存为File：" + targetFile.getAbsolutePath());
                return targetFile; // 保存成功，返回File对象
            } else {
                LogUtils.e(TAG, "【保存失败】图片写入文件无效（文件大小：" + (targetFile.exists() ? targetFile.length() : 0) + "字节）");
                // 保存失败，删除无效文件
                if (targetFile.exists()) {
                    targetFile.delete();
                    LogUtils.d(TAG, "【清理无效文件】已删除无效文件：" + targetFile.getAbsolutePath());
                }
                return null;
            }
        } catch (IOException e) {
            LogUtils.e(TAG, "【保存异常】写入文件时出错：" + e.getMessage());
            LogUtils.e(TAG, "【异常堆栈】" + Log.getStackTraceString(e));
            return null;
        } finally {
            // 回收Bitmap资源（避免内存溢出）
            if (bitmap != null && !bitmap.isRecycled()) {
                bitmap.recycle();
                LogUtils.d(TAG, "【资源回收】Bitmap资源已回收");
            }
        }
    }

    /**
     * 重载方法：自定义保存路径（灵活适配不同场景）
     * @param context 上下文
     * @param drawableResId 图片资源ID
     * @param saveDirPath 自定义保存目录路径（如 "/storage/emulated/0/PowerBell/custom/"）
     * @param fileName 保存的文件名（带.png后缀）
     * @return 保存成功返回File对象，失败返回null
     */
    public static File saveDrawableToFile(Context context, int drawableResId, String saveDirPath, String fileName) {
		File filePath = new File(saveDirPath, fileName);
        return saveDrawableToFile(context, drawableResId, filePath.getAbsolutePath());
    }
}

