package org.ta.pddserver.utils;

import net.coobird.thumbnailator.Thumbnails;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;

@Component
public class ImageUtils {

    // 目标压缩大小：1MB = 1024 * 1024 字节
    private static final long MAX_SIZE = 1024 * 1024;
    // 初始压缩质量（0.9=90%质量，可根据需求调整）
    private static final float INIT_QUALITY = 0.9f;
    // 每次质量递减步长（质量过低时停止，避免图片模糊）
    private static final float QUALITY_STEP = 0.1f;
    // 最小压缩质量（低于此值时，即使超1M也停止，避免无法识别的图片）
    private static final float MIN_QUALITY = 0.3f;

    /**
     * 下载网络图片并处理（压缩→Base64）
     *
     * @param imageUrl 网络图片URL（如https://xxx.com/xxx.jpg）
     * @return 处理后的Base64字符串（带格式前缀，如data:image/jpeg;base64,...）
     * @throws IOException 网络异常/图片处理异常
     */
    public String downloadCompressToBase64(String imageUrl) throws IOException {
        // 1. 下载网络图片为字节数组
        byte[] imageBytes = downloadImage(imageUrl);
        // 2. 压缩图片至1M内
        byte[] compressedBytes = compressImage(imageBytes);
        // 3. 字节数组转Base64（带格式前缀）
        String imageFormat = getImageFormat(imageUrl); // 提取图片格式（jpg/png等）
        return "data:image/" + imageFormat + ";base64," + Base64.getEncoder().encodeToString(compressedBytes);
    }

    /**
     * 下载网络图片为字节数组
     */
    private byte[] downloadImage(String imageUrl) throws IOException {
        try {
            HttpClient httpClient = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet(imageUrl);
            // 发送请求并获取响应（设置超时时间，避免阻塞）
            return httpClient.execute(httpGet, response -> {
                if (response.getCode() != 200) {
                    throw new IOException("图片下载失败，HTTP状态码：" + response.getCode());
                }
                // 响应体转字节数组
                return EntityUtils.toByteArray(response.getEntity());
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 压缩图片字节数组（质量+尺寸双重控制）
     */
    private byte[] compressImage(byte[] imageBytes) throws IOException {
        // 若原始大小已≤1M，直接返回
        if (imageBytes.length <= MAX_SIZE) {
            return imageBytes;
        }

        float currentQuality = INIT_QUALITY;
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        // 循环递减质量压缩，直到大小≤1M或达到最小质量
        while (true) {
            outputStream.reset();
            // 压缩逻辑：按质量压缩，保留原尺寸（若仍超1M，后续可加尺寸缩放）
            Thumbnails.of(new ByteArrayInputStream(imageBytes))
                    .outputQuality(currentQuality) // 质量压缩（0.0~1.0）
                    .toOutputStream(outputStream);

            byte[] tempBytes = outputStream.toByteArray();
            // 满足条件：大小≤1M 或 质量已达最小值，退出循环
            if (tempBytes.length <= MAX_SIZE || currentQuality <= MIN_QUALITY) {
                return tempBytes;
            }

            // 质量递减，继续压缩
            currentQuality -= QUALITY_STEP;
        }
    }

    /**
     * 从URL提取图片格式（如jpg/png/webp）
     */
    private String getImageFormat(String imageUrl) {
        // 从URL后缀提取（如https://xxx.com/xxx.jpg → jpg）
        String format = imageUrl.substring(imageUrl.lastIndexOf(".") + 1).toLowerCase();
        // 过滤常见格式，默认返回jpg（避免不支持的格式）
        return (format.matches("jpg|jpeg|png|webp")) ? format : "jpg";
    }
}