package com.sz.admin.monitor.utils;

import org.im4java.core.IMOperation;
import org.im4java.core.ImageCommand;

import java.io.File;
import java.util.UUID;

public class BlurrinessComparator {

    // 强制指定你的 IM7 安装路径
    private static final String IM_PATH = "D:\\work\\imageMagic\\ImageMagick-7.1.2-Q16-HDRI";

    public static void main(String[] args) {
        String imagePath1 = "D:\\work\\images\\CAPTURE_258_20260320093827912_bcf0b101.jpg"; // 基准图 (清晰图标准)
        String imagePath2 = "D:\\work\\images\\CAPTURE_258_20260319160020647_ffbc4f66.jpg"; // 当前图 (待检测图)

        try {
            //Result{type='blur_detection', value='1', code='BLURRY', desc='检测到图片模糊',
            // conf=1.0, score=580.00, ratio=0.47}
            DetectResult result = compareBlurriness(imagePath1, imagePath2);
            // 打印最终返回的标准结果对象
            System.out.println("检测完成，返回结果: " + result.toString());
        } catch (Exception e) {
            System.err.println("处理图片时发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 内部结果类封装
     */
    public static class DetectResult {
        public String type;  // 检测类型
        public String value; // 结果值 (1: 模糊, 0: 正常)
        public String code;  // 结果代码
        public String desc;  // 描述信息
        public double conf;  // 置信度 (此处默认给 1.0)
        public double score; // 得分 (此处记录目标图压缩后的大小)
        public double ratio; // 比例 (目标图大小 / 基准图大小)

        public DetectResult(String type, String value, String code, String desc, double conf, double score, double ratio) {
            this.type = type;
            this.value = value;
            this.code = code;
            this.desc = desc;
            this.conf = conf;
            this.score = score;
            this.ratio = ratio;
        }

        @Override
        public String toString() {
            return String.format("Result{type='%s', value='%s', code='%s', desc='%s', conf=%.1f, score=%.2f, ratio=%.2f}",
                    type, value, code, desc, conf, score, ratio);
        }
    }

    /**
     * 对比两张图片的模糊度，并返回标准 DetectResult 结果
     */
    public static DetectResult compareBlurriness(String path1, String path2) {
        System.out.println("正在处理：ImageMagick 缩放压缩 -> 计算文件体积...");

        // 注意：尺寸设为 64x48 非常小，可能会导致压缩后体积差异微弱。如果效果不明显建议调大(如 800x600)。
        long size1 = getProcessedImageSize(path1, 64, 48, 80.0);
        long size2 = getProcessedImageSize(path2, 64, 48, 80.0);
        System.out.println("图片1大小: " + size1 + " 字节, 图片2大小: " + size2 + " 字节");
        // x为图片的大小 y = 90.733x - 35.474;
        //  90.733*1.234-35.474 = 76.490522
        //  90.733*0.58-35.474 = 17.15114
        //  90.733*0.695-35.474 = 27.585435
        // size1/size2
        // size1>size2 则出现了模糊，因为特征点变小了，体积也变小了
        // 计算体积比例 (防止除以 0 的异常)
        double ratio = (size1 == 0) ? 1.0 : (double) size2 / size1;
        String value;
        String code;
        String desc;
        // 判断逻辑：当前图体积小于基准图，说明丢失了细节，判定为模糊
        if (size2 < size1) {
            value = "1"; // 模糊 Value 为 1
            code = "BLURRY";
            desc = "检测到图片模糊";
        } else {
            value = "0"; // 正常 Value 为 0
            code = "NORMAL";
            desc = "图片清晰度正常";
        }

        // 构造并返回标准实体类
        // type: 设为 "blur_detection"
        // conf: 置信度设为 1.0
        // score: 存入 size2 (目标图片的压缩字节数) 作为参考得分
        return new DetectResult("blur_detection", value, code, desc, 1.0, size2, ratio);
    }

    /**
     * 核心逻辑：纯 ImageMagick 物理瘦身并获取压缩后体积
     */
    private static long getProcessedImageSize(String imagePath, int width, int height, double quality) {
        // 生成一个临时文件路径，用于存放 ImageMagick 处理后的图片
        String tempImagePath = System.getProperty("java.io.tmpdir") + File.separator + "im_temp_" + UUID.randomUUID() + ".jpg";
        File tempFile = new File(tempImagePath);

        try {
            // 构建 ImageMagick 压缩指令
            IMOperation op = new IMOperation();
            op.addImage(imagePath);
            op.strip();               // 剥离 EXIF 等多余元数据信息
            op.resize(width, height); // 缩放为标准大小
            op.quality(quality);      // 设置 JPEG 压缩质量
            op.addImage(tempImagePath); // 输出到临时文件

            // 执行命令
            ImageCommand cmd = new ImageCommand("magick");
            cmd.setSearchPath(IM_PATH);
            cmd.run(op);

            // 获取临时文件的体积 (字节)
            if (!tempFile.exists()) {
                throw new RuntimeException("ImageMagick 未能成功生成临时文件！");
            }

            return tempFile.length();

        } catch (Exception e) {
            throw new RuntimeException("ImageMagick 处理流水线执行失败", e);
        } finally {
            // 务必清理临时文件
            if (tempFile.exists()) {
                tempFile.delete();
            }
        }
    }
}