package org.jeecg.modules.common.util;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import org.apache.commons.lang.StringUtils;
import org.jeecg.common.config.TenantContext;
import org.jeecg.common.constant.enums.FileTypeEnum;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.util.CommonUtils;
import org.jeecg.common.util.DateUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author zhouquan
 * @description 测试MultipartFile与File互转
 * @date 2023-03-12 17:31
 **/
public class FileUtils {


    /**
     * MultipartFile转File
     * <p>
     * 项目根路径创建临时文件，转换得到File，再删除临时文件
     *
     * @param multipartFile
     * @return
     */
    public static File multiPartFileToFile(MultipartFile multipartFile) throws IOException {

        //获取文件名
        String originalFilename = multipartFile.getOriginalFilename();

        //获取默认定位到的当前用户目录("user.dir"),也就是当前应用的根路径
        String tempDir = System.getProperty("user.dir");

        //根目录下生成临时文件
        File file = new File(tempDir+File.separator+originalFilename);

        org.apache.commons.io.FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);

        return file;
    }


    /**
     * MultipartFile转File
     * <p>
     * 项目根路径创建缓冲区来实现这个转换
     *
     * @param multipartFile
     * @return
     */
    public static File multiPartFileToFile2(MultipartFile multipartFile) throws IOException {

        //获取文件名
        String originalFilename = multipartFile.getOriginalFilename();

        //获取默认定位到的当前用户目录("user.dir"),也就是当前应用的根路径
        String tempDir = System.getProperty("user.dir");

        //获取文件名
        String filename = StringUtils.substringBeforeLast(originalFilename, ".");
        //获取文件后缀
        String fileExt = StringUtils.substringAfterLast(originalFilename, ".");

        //在项目根路径生成临时文件
        File tempFile = File.createTempFile(filename, "." + fileExt, new File(tempDir));

        multipartFile.transferTo(tempFile);

        //在jvm退出时执行删除此路径下的文件
        tempFile.deleteOnExit();

        return tempFile;
    }


    /**
     * 将文件上传到 mino
     * @param business
     * @param nsrsbh
     * @param img
     * @param fileType
     * @return {@link String}
     */
    public static String extractedFileUpload(String business,String nsrsbh, String img, String fileType) {
        if (StrUtil.isBlank(img)){
            return "";
        }
        final FileTypeEnum file = FileTypeEnum.getFileByBase64(img, fileType);
        if (file == null){
            throw  new JeecgBootException("文件格式不正确");
        }
        List<String> files = Arrays.asList(  TenantContext.getTenant(),"jxfp",
                DateUtils.formatDate(),file.getValue(), nsrsbh, IdWorker.get32UUID()+file.getType());

        final String filename = files.stream().collect(Collectors.joining("/"));

        //如果是图片 则需要去除前缀
        if(StrUtil.contains(img,",")){
            img = StrUtil.sub(img,StrUtil.indexOf(img,',')+1,img.length());
        }

        final InputStream inputStream = Base64Util.base64ToInputStream(img);

        return CommonUtils.upload(inputStream, filename);
    }

}

