import { expect, test } from "bun:test";
import { mkdtempSync, readFileSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { optimizeImage } from "../src/index.ts";

test("build optimizer emits deterministic bounded variants and a manifest", async () => {
  const root = mkdtempSync(join(tmpdir(), "wrnexus-images-"));
  const input = join(root, "Hero image.png");
  writeFileSync(input, new Uint8Array([1, 2, 3]));
  const manifest = await optimizeImage(input, {
    outputDir: join(root, "output"),
    widths: [800, 400, 800],
    formats: ["webp", "avif"],
    processor: {
      async transform(_input, options) {
        return {
          data: new TextEncoder().encode(`${options.width}:${options.format}:${options.quality}`),
          width: options.width,
          height: options.width / 2,
        };
      },
    },
  });
  expect(manifest.variants).toHaveLength(4);
  expect(manifest.variants.map(({ width, format }) => `${width}:${format}`)).toEqual([
    "400:webp",
    "800:webp",
    "400:avif",
    "800:avif",
  ]);
  expect(readFileSync(manifest.variants[0]!.path, "utf8")).toBe("400:webp:80");
});

test("build optimizer rejects variant explosions and unsupported formats", async () => {
  const processor = { transform: async () => ({ data: new Uint8Array(), width: 1, height: 1 }) };
  await expect(
    optimizeImage("input.png", {
      outputDir: ".",
      widths: [100, 200],
      formats: ["webp", "avif"],
      maxVariants: 3,
      processor,
    }),
  ).rejects.toThrow("exceeds");
});
