package org.ta.pddserver.utils;

import net.coobird.thumbnailator.Thumbnails;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

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 {
            HttpHeaders headers = new HttpHeaders();
            headers.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");
            HttpEntity<Void> requestEntity = new HttpEntity<>(headers);

            // 2. RestTemplate 发送GET请求，获取图片二进制数据（ ResponseEntity<byte[]> 接收二进制响应）
            ResponseEntity<byte[]> response;
            try {
                response = new RestTemplate().exchange(
                        imageUrl,
                        HttpMethod.GET,
                        requestEntity,
                        byte[].class // 响应体类型：字节数组（直接接收图片二进制）
                );
            } catch (RestClientException e) {
                throw new RestClientException("图片下载失败，URL：" + imageUrl + "，原因：" + e.getMessage());
            }

            // 3. 校验响应是否成功（HTTP 200 OK）
            if (!response.getStatusCode().is2xxSuccessful()) {
                throw new RestClientException("图片下载失败，HTTP状态码：" + response.getStatusCode() + "，URL：" + imageUrl);
            }

            // 4. 提取图片二进制数据
            byte[] imageBytes = response.getBody();
            if (imageBytes == null || imageBytes.length == 0) {
                throw new IllegalArgumentException("下载的图片为空，URL：" + imageUrl);
            }
            return imageBytes;
        } 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";
    }
}