(() => {
	const postHookOp = async (project, sample, op, btn) => {
		btn.disabled = true;
		const params = new URLSearchParams({ name: sample, op });
		try {
			const resp = await fetch(`/project/${project}/hook?${params.toString()}`, {
				method: "POST",
				headers: { Accept: "application/json" },
			});
			if (!resp.ok) {
				const detail = await resp.text();
				window.alert(`Hook ${op} failed (${resp.status}): ${detail}`);
				btn.disabled = false;
				return;
			}
			window.location.reload();
		} catch (err) {
			window.alert(`Hook ${op} failed: ${err}`);
			btn.disabled = false;
		}
	};

	const handleClick = async (event) => {
		const uninstallBtn = event.target.closest(".hook-toggle");
		if (uninstallBtn) {
			event.preventDefault();
			const project = uninstallBtn.dataset.project;
			const sample = uninstallBtn.dataset.sample;
			const op = uninstallBtn.dataset.op;
			if (!project || !sample || !op) {
				return;
			}
			await postHookOp(project, sample, op, uninstallBtn);
			return;
		}

		const installBtn = event.target.closest(".hook-install-btn");
		if (!installBtn) {
			return;
		}
		event.preventDefault();
		const project = installBtn.dataset.project;
		const op = installBtn.dataset.op;
		const select = document.getElementById("hook-install-select");
		const sample = select instanceof HTMLSelectElement ? select.value : "";
		if (!project || !sample || !op) {
			return;
		}
		await postHookOp(project, sample, op, installBtn);
	};

	document.addEventListener("click", handleClick);
})();