//#region src/global.ts
function getGlobal() {
	return new Function("return this")();
}

//#endregion
//#region src/webdriver.ts
/**
* 是否为 WebDriver 控制的浏览器会话（常见 UI 自动化：Selenium、部分 Playwright/Chromium 配置等）。
* 此类环境不执行覆盖率采集，避免干扰自动化与无效上报。
*/
function isWebDriverBrowser() {
	return typeof navigator !== "undefined" && navigator.webdriver === true;
}

//#endregion
//#region src/core.ts
const sendCoverage = () => {
	if (isWebDriverBrowser()) return;
	const g = getGlobal();
	const dsn = g.CANYON_DSN;
	const coverage = g.__coverage__;
	if (dsn && coverage) {
		const groupedCoverage = {};
		const fieldsToRemove = [
			"statementMap",
			"fnMap",
			"branchMap",
			"inputSourceMap"
		];
		for (const [filePath, coverageData] of Object.entries(coverage)) if (coverageData && typeof coverageData === "object") {
			const buildHash = coverageData.buildHash;
			if (!buildHash) continue;
			const cleanedData = { ...coverageData };
			for (const field of fieldsToRemove) delete cleanedData[field];
			if (!groupedCoverage[buildHash]) groupedCoverage[buildHash] = {};
			groupedCoverage[buildHash][filePath] = cleanedData;
		}
		const scene = g.CANYON_SCENE || {};
		for (const [buildHash, coverageByBuildHash] of Object.entries(groupedCoverage)) fetch(dsn, {
			method: "POST",
			headers: { "Content-Type": "application/json" },
			keepalive: true,
			body: JSON.stringify({
				buildHash,
				coverage: coverageByBuildHash,
				scene
			})
		});
	}
};
let listenerAttached = false;
const installCollect = () => {
	if (isWebDriverBrowser()) return;
	if (listenerAttached) return;
	listenerAttached = true;
	document.addEventListener("visibilitychange", () => {
		if (document.visibilityState === "hidden") sendCoverage();
	});
};

//#endregion
//#region src/script-params.ts
/**
* 从当前正在执行的 `<script src="...?dsn=...">` 解析查询参数并写入全局。
* 仅在同步执行的独立脚本（如 IIFE 入口）中调用；`document.currentScript` 在 async/defer 下常为 null。
* 已有 `CANYON_DSN` / `CANYON_SCENE` 时不覆盖。
*/
function applyCollectParamsFromCurrentScript() {
	if (typeof document === "undefined") return;
	const el = document.currentScript;
	if (!el?.src) return;
	let url;
	try {
		url = new URL(el.src, typeof location !== "undefined" ? location.href : void 0);
	} catch {
		return;
	}
	const g = getGlobal();
	const dsn = url.searchParams.get("dsn");
	if (dsn && g.CANYON_DSN === void 0) g.CANYON_DSN = dsn;
	const sceneRaw = url.searchParams.get("scene");
	if (sceneRaw && g.CANYON_SCENE === void 0) try {
		g.CANYON_SCENE = JSON.parse(decodeURIComponent(sceneRaw));
	} catch {}
}

//#endregion
//#region src/index.ts
/**
* 写入全局对象（与 `core` 读取方式一致）后调用 `installCollect()`。
*/
function init(options) {
	const g = getGlobal();
	if (options?.dsn !== void 0) g.CANYON_DSN = options.dsn;
	if (options?.scene !== void 0) g.CANYON_SCENE = {
		...g.CANYON_SCENE || {},
		...options.scene
	};
	installCollect();
}

//#endregion
export { applyCollectParamsFromCurrentScript, init, installCollect, isWebDriverBrowser, sendCoverage };