package jnpf.util.attendance;

import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

/**
 * 图片压缩
 *
 * @author yanwenfu
 * @create 2025-12-11
 */
public class ImageCompressUtil {

    /**
     * 压缩人脸图片
     * @param input 原图
     * @param output 输出文件
     * @param targetKB 目标大小 KB
     * @throws Exception 异常
     */
    public static void compressFace(File input, File output, long targetKB) throws Exception {
        compressResizeAndQuality(input, output, targetKB, 0.9f, 900);
    }

    /**
     * 压缩缩略图
     * @param input 原图
     * @param output 输出文件
     * @param targetKB 目标大小 KB
     * @throws Exception 异常
     */
    public static void compressThumbnail(File input, File output, long targetKB) throws Exception {
        compressResizeAndQuality(input, output, targetKB, 0.7f, 300);
    }

    /**
     * 核心压缩方法：按最大边长缩放 + 固定质量
     *
     * @param input 原文件
     * @param output 输出文件
     * @param targetKB 目标大小 KB
     * @param quality JPEG质量（0~1）
     * @param maxSide 最大边长
     * @throws Exception
     */
    private static void compressResizeAndQuality(File input, File output, long targetKB, float quality, int maxSide) throws Exception {

        long targetBytes = targetKB * 1024;
        BufferedImage img = ImageIO.read(input);
        int width = img.getWidth();
        int height = img.getHeight();
        // 计算缩放比例
        double scale = 1.0;
        if (width > maxSide || height > maxSide) {
            scale = Math.min((double) maxSide / width, (double) maxSide / height);
        }
        // 是否是 jpg
        String name = input.getName().toLowerCase();
        boolean isJpg = name.endsWith(".jpg") || name.endsWith(".jpeg");
        // ===== 性能直通：jpg + 小图 + 不缩放 =====
        if (isJpg && scale == 1.0 && input.length() <= targetBytes) {
            Files.copy(input.toPath(), output.toPath(), StandardCopyOption.REPLACE_EXISTING);
            return;
        }
        // ===== 统一编码路径：转 RGB（解决 PNG 透明） =====
        BufferedImage rgbImage = new BufferedImage(
                img.getWidth(),
                img.getHeight(),
                BufferedImage.TYPE_INT_RGB
        );
        Graphics2D g = rgbImage.createGraphics();
        g.setColor(Color.WHITE); // 背景色，可按需要调整
        g.fillRect(0, 0, width, height);
        g.drawImage(img, 0, 0, null);
        g.dispose();
        // Thumbnails 一步到位：缩放 + 固定质量
        Thumbnails.of(rgbImage)
                .scale(scale)
                .outputQuality(quality)
                .toFile(output);
    }
}
