package com.sonic.cow.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;

public class Base64Utils {

    /**
     * 将 Base64 字符串转换为文件
     *
     * @param base64String Base64 编码的字符串（可带 data URL 前缀，如 "data:image/png;base64,"）
     * @param filePath     输出文件路径（包含文件名和扩展名，如 "/path/to/output.png"）
     * @return 生成的文件对象，如果失败返回 null
     */
    public static File decodeToFile(String base64String, String filePath) {
        if (base64String == null || base64String.trim().isEmpty()) {
            throw new IllegalArgumentException("Base64 字符串不能为空");
        }

        // 去除 data URL 前缀（如果存在）
        String cleanBase64 = base64String;
        if (base64String.startsWith("data:")) {
            int commaIndex = base64String.indexOf(',');
            if (commaIndex != -1) {
                cleanBase64 = base64String.substring(commaIndex + 1);
            }
        }

        byte[] decodedBytes;
        try {
            decodedBytes = Base64.getDecoder().decode(cleanBase64);
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("无效的 Base64 字符串: " + e.getMessage(), e);
        }

        // 创建文件和目录
        File outputFile = new File(filePath);
        Path parentDir = outputFile.getParentFile().toPath();
        if (parentDir != null && !Files.exists(parentDir)) {
            try {
                Files.createDirectories(parentDir);
            } catch (IOException e) {
                throw new RuntimeException("创建目录失败: " + parentDir, e);
            }
        }

        // 写入文件
        try (FileOutputStream fos = new FileOutputStream(outputFile)) {
            fos.write(decodedBytes);
        } catch (IOException e) {
            throw new RuntimeException("写入文件失败: " + filePath, e);
        }

        return outputFile;
    }

    /**
     * 重载方法：使用临时文件（系统临时目录）
     *
     * @param base64String Base64 字符串
     * @param fileName     文件名（包含扩展名，如 "image.png"）
     * @return 生成的临时文件对象
     */
    public static File decodeToTempFile(String base64String, String fileName) {
        return decodeToFile(base64String, "/path/to/" + fileName);
    }
}