// @vitest-environment happy-dom
import { beforeEach, describe, expect, it } from "vitest";
import { resolveCandidate, resolveTarget, waitForTarget } from "./resolve.js";
import type { Target } from "./types.js";

function mockLayout(): void {
	HTMLElement.prototype.getBoundingClientRect = () =>
		({
			x: 0,
			y: 0,
			top: 0,
			left: 0,
			right: 120,
			bottom: 40,
			width: 120,
			height: 40,
			toJSON() {},
		}) as DOMRect;
}

beforeEach(() => {
	mockLayout();
	document.body.innerHTML = "";
});

describe("resolveTarget", () => {
	it("retient un candidat testid unique et visible", () => {
		document.body.innerHTML = `<button data-testid="create-project">Creer</button>`;
		const found = resolveCandidate({ kind: "testid", value: "create-project" });
		expect(found?.tagName).toBe("BUTTON");
	});

	it("passe au candidat suivant si le premier est ambigu", () => {
		document.body.innerHTML = `
			<button id="a">Creer un projet</button>
			<button id="b">Creer un projet</button>
			<button data-testid="create-project">OK</button>
		`;
		const target: Target = {
			candidates: [
				{ kind: "text", tag: "button", value: "Creer un projet" },
				{ kind: "testid", value: "create-project" },
			],
		};
		expect(resolveTarget(target)?.getAttribute("data-testid")).toBe(
			"create-project",
		);
	});

	it("ignore un element masque", () => {
		document.body.innerHTML = `<button id="create-project-btn" style="display:none">X</button>`;
		expect(
			resolveCandidate({ kind: "id", value: "create-project-btn" }),
		).toBeNull();
	});

	it("attend un element asynchrone puis resout", async () => {
		const target: Target = {
			candidates: [{ kind: "testid", value: "late" }],
		};
		const pending = waitForTarget(target, 1000);
		setTimeout(() => {
			document.body.innerHTML = `<button data-testid="late">Go</button>`;
		}, 20);
		expect((await pending)?.getAttribute("data-testid")).toBe("late");
	});
});
