package com.trade.service.filestorage.util;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

import com.trade.common.constant.HttpStatus;
import com.trade.common.exception.ValidatorException;
import org.springframework.web.multipart.MultipartFile;

/**
 * @description: 销售服务实现类
 * @Author: wanglang
 * @Date: 2024/9/4 MultipartFile文件工具类 文件上传限制单位（B，K，M，G）
 * @Version: 1.0
 */
public class MultipartFileUtil {

    /**
     * 校验文件是否满足限制条件
     *
     * @param size 限制大小
     * @param unit 限制单位（B,K,M,G）
     * @描述 判断文件大小
     */
    public static boolean checkFileSize(MultipartFile file, int size, String unit) {
        Long len = file.getSize();
        double fileSize = 0;
        if ("B".equalsIgnoreCase(unit)) {
            fileSize = (double) len;
        } else if ("K".equalsIgnoreCase(unit)) {
            fileSize = (double) len / 1024;
        } else if ("M".equalsIgnoreCase(unit)) {
            fileSize = (double) len / 1048576;
        } else if ("G".equalsIgnoreCase(unit)) {
            fileSize = (double) len / 1073741824;
        }
        return !(fileSize > size);
    }

    /**
     * 校验文件的像素大小，注意，文件格式只能是图片格式，否则不支持转换
     * 
     * @param file 文件
     * @param minLength 最小长度
     * @param maxLength 最大长度
     * @param minWidth 最小宽度
     * @param maxWidth 最大宽度
     * @return true满足条件
     */
    public static boolean checkFilePx(MultipartFile file, int minLength, int maxLength, int minWidth, int maxWidth) {
        try {
            BufferedImage image = ImageIO.read(file.getInputStream());
            int imageWidth = image.getWidth();
            if (imageWidth < minWidth || minWidth > maxWidth) {
                return false;
            }
            int imageLength = image.getHeight();
            if (imageLength < minLength || imageLength > maxLength) {
                return false;
            }
        } catch (Exception ex) {
            throw new ValidatorException(HttpStatus.ERROR, "只能上传传图像文件！");
        }
        return true;
    }

    /**
     * 大小以及像素限制
     * 
     * @param file
     * @param size
     * @param unit
     * @param minLength
     * @param maxLength
     * @param minWidth
     * @param maxWidth
     * @return
     */
    public static boolean checkFileSizeAndPx(MultipartFile file, int size, String unit, int minLength, int maxLength,
            int minWidth, int maxWidth) {
        boolean meetSize = checkFileSize(file, size, unit);
        if (!meetSize) {
            return false;
        }
        boolean meetPx = checkFilePx(file, minLength, maxLength, minWidth, maxWidth);
        if (!meetPx) {
            return false;
        }
        return true;
    }
}
