<!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 { AI_HOST } from '@constants';
import { reqDataBasics } from '@shared/lib/data';
import { retryTwice } from './helpers';

const generatePatterns = async (page, data) => {
	const { siteProfile } = data;
	return await retryTwice(async () => {
		const response = await fetch(`${AI_HOST}/api/patterns`, {
			method: 'POST',
			headers: { 'Content-Type': 'application/json' },
			body: JSON.stringify({ ...reqDataBasics, siteProfile, page }),
		});
		if (!response.ok) {
			throw new Error(
				`Pattern generation failed with status ${response.status}`,
			);
		}
		return await response.json();
	});
};

// Hold back patterns that already have finalized content (e.g. design build)
const splitGeneratedContent = (page) => {
	const generated = page.patterns?.filter((p) => p.contentGenerated) ?? [];
	const rest = page.patterns?.filter((p) => !p.contentGenerated) ?? [];
	return { generated, toGenerate: { ...page, patterns: rest } };
};

export const generatePageContent = async (pages, data) => {
	const splits = pages.map(splitGeneratedContent);

	const result = await Promise.allSettled(
		splits.map(
			({ toGenerate }) =>
				generatePatterns(toGenerate, data)
					.then((response) => response)
					.catch(() => toGenerate), // safe fallback
		),
	);

	return result?.map((pageResult, i) => {
		const original = pages[i];
		const { generated } = splits[i];
		const merged =
			pageResult.status === 'fulfilled' && pageResult.value
				? { ...original, ...pageResult.value }
				: original;
		return {
			...merged,
			patterns: [...generated, ...(merged.patterns ?? [])],
		};
	});
};
