import sharp from "sharp";

const MAX_SIZE_BYTES = 512 * 1024; // 512 KB

/**
 * Convierte una imagen a WebP y asegura que no supere MAX_SIZE_BYTES.
 * Mantiene el aspect ratio y ajusta calidad si la reducción supera el 50%.
 * @param inputBuffer Buffer con la imagen original
 * @returns Buffer de la imagen en WebP
 */
export const processImageToWebP = async (inputBuffer: Buffer): Promise<Buffer> => {
    let quality = 80;
    let width: number | null = null;
    const metadata = await sharp(inputBuffer).metadata();
    const originalWidth = metadata.width || 0;
    if (!originalWidth) throw new Error("No se pudo obtener el ancho de la imagen original");

    let outputBuffer: Buffer;

    while (true) {
        const transformer = sharp(inputBuffer).webp({ quality });
        if (width) {
            transformer.resize({ width, withoutEnlargement: true });
        }

        outputBuffer = await transformer.toBuffer();

        if (outputBuffer.length <= MAX_SIZE_BYTES) break;

        // Reducimos width progresivamente
        if (!width) {
            width = Math.floor(originalWidth * 0.9); // reducimos 10% la primera vez
        } else {
            width = Math.floor(width * 0.9); // reducciones sucesivas
        }

        // Calculamos porcentaje de reducción respecto al tamaño original
        const reductionPercent = (originalWidth - width) / originalWidth;

        // Si se redujo más del 50%, empezamos a bajar la calidad
        if (reductionPercent >= 0.5 && quality > 40) {
            quality -= 5;
            width = null; // volvemos a tamaño original pero con menor calidad
        }

        // Evitamos bucle infinito
        if (width && width < 10) break;
    }

    return outputBuffer;
};
