import { methods } from "@jimp/plugin-resize";
import { clone } from "@jimp/utils";
import pixelMatch from "pixelmatch";
/**
 * Diffs two images and returns
 * @param img1 A Jimp image to compare
 * @param img2 A Jimp image to compare
 * @param threshold A number, 0 to 1, the smaller the value the more sensitive the comparison (default: 0.1)
 * @returns An object with the following properties:
 * - percent: The proportion of different pixels (0-1), where 0 means the two images are pixel identical
 * - image: A Jimp image showing differences
 * @example
 * ```ts
 * import { Jimp, diff } from "jimp";
 *
 * const image1 = await Jimp.read("test/image.png");
 * const image2 = await Jimp.read("test/image.png");
 *
 * const diff = diff(image1, image2);
 *
 * diff.percent; // 0.5
 * diff.image; // a Jimp image showing differences
 * ```
 */
export function diff(img1, img2, threshold = 0.1) {
    let bmp1 = img1.bitmap;
    let bmp2 = img2.bitmap;
    if (bmp1.width !== bmp2.width || bmp1.height !== bmp2.height) {
        if (bmp1.width * bmp1.height > bmp2.width * bmp2.height) {
            // img1 is bigger
            bmp1 = methods.resize(clone(img1), {
                w: bmp2.width,
                h: bmp2.height,
            }).bitmap;
        }
        else {
            // img2 is bigger (or they are the same in area)
            bmp2 = methods.resize(clone(img2), {
                w: bmp1.width,
                h: bmp1.height,
            }).bitmap;
        }
    }
    if (typeof threshold !== "number" || threshold < 0 || threshold > 1) {
        throw new Error("threshold must be a number between 0 and 1");
    }
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    const diff = new img1.constructor({
        width: bmp1.width,
        height: bmp1.height,
        color: 0xffffffff,
    });
    const numDiffPixels = pixelMatch(bmp1.data, bmp2.data, diff.bitmap.data, diff.bitmap.width, diff.bitmap.height, { threshold });
    return {
        percent: numDiffPixels / (diff.bitmap.width * diff.bitmap.height),
        image: diff,
    };
}