<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
import { sleep } from '@shared/lib/utils';

const MAX_RETRIES = 2;
const RETRY_DELAY = 1000; // 1 second in milliseconds

export const fetchFontFaceFile = async (url) => {
	for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
		try {
			// Add delay if this is not the first attempt
			if (attempt > 0) await sleep(RETRY_DELAY);

			const response = await fetch(url);

			if (!response.ok) {
				throw new Error('Failed to fetch font file.');
			}

			const blob = await response.blob();
			const filename = url.split('/').pop();

			return new File([blob], filename, {
				type: blob.type,
			});
		} catch (_) {
			if (attempt <= MAX_RETRIES) continue;

			console.error(
				`Failed to fetch font file after ${MAX_RETRIES + 1} attempts.`,
			);

			return;
		}
	}
};

export function makeFontFamilyFormData({ name, slug, fontFamily }) {
	const formData = new FormData();
	const fontFamilySettings = { name, slug, fontFamily };
	formData.append('font_family_settings', JSON.stringify(fontFamilySettings));

	return formData;
}

export function makeFontFaceFormData({
	fontFamilySlug,
	fontFamily,
	fontStyle,
	fontWeight,
	fontDisplay,
	unicodeRange,
	src = [],
	file = [],
}) {
	const formData = new FormData();
	const fontFaceSettings = {
		fontFamily,
		fontStyle,
		fontWeight,
		fontDisplay,
		unicodeRange:
			unicodeRange === undefined || unicodeRange === null ? '' : unicodeRange,
		src: Array.isArray(src) ? src : [src],
	};
	const files = Array.isArray(file) ? file : [file];

	// Add each font file to the form data.
	files.forEach((file) => {
		const fileId = `${fontFamilySlug}-${fontWeight}-${fontStyle}`;
		formData.append(fileId, file, file.name);

		// Use the file ids as src for WP to match and upload the files.
		if (!src?.length) {
			fontFaceSettings.src.push(fileId);
		} else {
			fontFaceSettings.src = [fileId];
		}
	});

	formData.append('font_face_settings', JSON.stringify(fontFaceSettings));

	return formData;
}
