package com.njcn.product.carrycapacity.util;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

/**
 * Description:
 * Date: 2025/07/09  下午 3:14【需求编号】
 *
 * @author clam
 * @version V1.0.0
 */
@Component
public class FileUtils {
    @Value("${file.upload-dir}")
    private String baseDir;  // 从配置文件中注入
    /**
     * 上传文件到本地目录
     * @param file      Spring MultipartFile 对象
     * @return          返回存储的文件相对路径（含文件名）
     * @throws IOException 当文件操作失败时抛出
     */
    public  String uploadFile(MultipartFile file) throws IOException {
        // 确保目录存在
        Path dirPath = Paths.get(baseDir);
        if (!Files.exists(dirPath)) {
            Files.createDirectories(dirPath);
        }

        // 生成唯一文件名（保留原始扩展名）
        String originalName = file.getOriginalFilename();
        String extension = originalName.substring(originalName.lastIndexOf("."));
        String fileName = UUID.randomUUID() + extension;

        // 构建目标路径
        Path targetPath = Paths.get(baseDir, fileName);

        // 保存文件
        try (InputStream inputStream = file.getInputStream()) {
            Files.copy(inputStream, targetPath);
        }

        return targetPath.toString();
    }

    /**
     * 根据本地路径读取文件流
     * @param filePath  文件的绝对路径
     * @return          文件输入流（需调用方关闭）
     * @throws FileNotFoundException 当文件不存在时抛出
     */
    public  InputStream getFileStream(String filePath) throws FileNotFoundException {
        File file = new File(filePath);
        if (!file.exists() || !file.isFile()) {
            throw new FileNotFoundException("文件不存在: " + filePath);
        }
        return new FileInputStream(file);
    }

    /**
     * 安全读取文件流（自动关闭资源）
     * @param filePath  文件的绝对路径
     * @param consumer  使用流的回调接口
     * @throws IOException 当文件操作失败时抛出
     */
    public  void consumeFileStream(String filePath, InputStreamConsumer consumer) throws IOException {
        try (InputStream is = getFileStream(filePath)) {
            consumer.accept(is);
        }
    }

    @FunctionalInterface
    public interface InputStreamConsumer {
        void accept(InputStream stream) throws IOException;
    }
}
