import fetch from "node-fetch";
import { URLSearchParams } from "node:url";
import { getAgentByUrl } from "./fetch.js";
import config from "@/config/index.js";

export async function verifyRecaptcha(secret: string, response: string) {
	const result = await getCaptchaResponse(
		"https://www.recaptcha.net/recaptcha/api/siteverify",
		secret,
		response,
	).catch((e) => {
		throw new Error(`recaptcha-request-failed: ${e.message}`);
	});

	if (result.success !== true) {
		const errorCodes = result["error-codes"]
			? result["error-codes"]?.join(", ")
			: "";
		throw new Error(`recaptcha-failed: ${errorCodes}`);
	}
}

export async function verifyHcaptcha(secret: string, response: string) {
	const result = await getCaptchaResponse(
		"https://hcaptcha.com/siteverify",
		secret,
		response,
	).catch((e) => {
		throw new Error(`hcaptcha-request-failed: ${e.message}`);
	});

	if (result.success !== true) {
		const errorCodes = result["error-codes"]
			? result["error-codes"]?.join(", ")
			: "";
		throw new Error(`hcaptcha-failed: ${errorCodes}`);
	}
}

type CaptchaResponse = {
	success: boolean;
	"error-codes"?: string[];
};

async function getCaptchaResponse(
	url: string,
	secret: string,
	response: string,
): Promise<CaptchaResponse> {
	const params = new URLSearchParams({
		secret,
		response,
	});

	const res = await fetch(url, {
		method: "POST",
		body: params,
		headers: {
			"User-Agent": config.userAgent,
		},
		// TODO
		//timeout: 10 * 1000,
		agent: getAgentByUrl,
	}).catch((e) => {
		throw new Error(`${e.message || e}`);
	});

	if (!res.ok) {
		throw new Error(`${res.status}`);
	}

	return (await res.json()) as CaptchaResponse;
}