package cc.winboll.studio.powerbell.utils;

import android.content.Context;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
 * @Date 2025/12/11 09:14
 * @Describe Assets 目录拷贝工具类
 * 支持将 assets/images/ 下所有文件、子目录拷贝到指定路径
 */
public class AssetsCopyUtils {
    public static final String TAG = "AssetsCopyUtils";
    private static final int BUFFER_SIZE = 1024 * 8;

    /**
     * 拷贝 assets/images/ 目录到指定目标目录
     * @param context      上下文
     * @param targetDirPath 目标目录完整路径（如 /sdcard/PowerBell/assets_images）
     * @return 拷贝是否成功
     */
    public static boolean copyAssetsImagesToDir(Context context, String targetDirPath) {
        // 拷贝 assets/images 根目录
        return copyAssetsDirToDir(context, "images", targetDirPath);
    }

    /**
     * 递归拷贝 assets 下指定目录到目标目录
     * @param context      上下文
     * @param assetsDir    assets 下的源目录（如 "images"、"images/subdir"）
     * @param targetDirPath 目标目录完整路径
     * @return 拷贝是否成功
     */
    public static boolean copyAssetsDirToDir(Context context, String assetsDir, String targetDirPath) {
        File targetDir = new File(targetDirPath);
        // 创建目标目录（含多级父目录）
        if (!targetDir.exists() && !targetDir.mkdirs()) {
            Log.e(TAG, "创建目标目录失败：" + targetDirPath);
            return false;
        }

        try {
            // 获取 assets 目录下的文件/子目录列表
            String[] fileList = context.getAssets().list(assetsDir);
            if (fileList == null || fileList.length == 0) {
                Log.d(TAG, "assets 目录为空：" + assetsDir);
                return true;
            }

            for (String fileName : fileList) {
                String assetsFilePath = assetsDir + File.separator + fileName;
                String targetFilePath = targetDirPath + File.separator + fileName;

                // 判断当前项是文件还是子目录
                String[] subFileList = context.getAssets().list(assetsFilePath);
                if (subFileList != null && subFileList.length > 0) {
                    // 是子目录，递归拷贝
                    if (!copyAssetsDirToDir(context, assetsFilePath, targetFilePath)) {
                        return false;
                    }
                } else {
                    // 是文件，直接拷贝
                    if (!copyAssetsFileToDir(context, assetsFilePath, targetFilePath)) {
                        return false;
                    }
                }
            }
            Log.d(TAG, "assets 目录拷贝完成：" + assetsDir + " -> " + targetDirPath);
            return true;
        } catch (IOException e) {
            Log.e(TAG, "拷贝 assets 目录异常：" + e.getMessage());
            return false;
        }
    }

    /**
     * 拷贝 assets 下单个文件到指定路径
     * @param context       上下文
     * @param assetsFilePath assets 下的文件路径（如 "images/cloud.png"）
     * @param targetFilePath 目标文件完整路径
     * @return 拷贝是否成功
     */
    public static boolean copyAssetsFileToDir(Context context, String assetsFilePath, String targetFilePath) {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            inputStream = context.getAssets().open(assetsFilePath);
            File targetFile = new File(targetFilePath);
            // 覆盖已存在的文件
            if (targetFile.exists() && !targetFile.delete()) {
                Log.w(TAG, "覆盖目标文件失败，跳过：" + targetFilePath);
                return true;
            }

            outputStream = new FileOutputStream(targetFile);
            byte[] buffer = new byte[BUFFER_SIZE];
            int length;
            while ((length = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, length);
            }
            Log.d(TAG, "文件拷贝成功：" + assetsFilePath + " -> " + targetFilePath);
            return true;
        } catch (IOException e) {
            Log.e(TAG, "拷贝文件失败：" + assetsFilePath + "，异常：" + e.getMessage());
            return false;
        } finally {
            // 关闭流
            try {
                if (inputStream != null) inputStream.close();
                if (outputStream != null) outputStream.close();
            } catch (IOException e) {
                Log.e(TAG, "关闭流异常：" + e.getMessage());
            }
        }
    }
}

