import { applyFilters } from './templateFilters.js';
import type { ParsedSegmentPart } from './parseTemplateExpression.js';
import { parseSegment } from './parseTemplateExpression.js';
import { resolve } from './resolve.js';

function isEmpty(value: unknown): boolean {
	return value === null || value === undefined || value === '';
}

function evaluateSegment(segment: string, context: any): unknown {
	const parsed = parseSegment(segment);

	const results = parsed.parts.map((part: ParsedSegmentPart) => {
		let value: unknown;
		if (part.type === 'literal') {
			value = part.value;
		} else {
			value = resolve(part.value, context);
		}
		if (part.filters.length > 0 && value != null) {
			value = applyFilters(value, part.filters);
		}
		return value;
	});

	if (results.length === 1) return results[0];
	if (results.some((r: unknown) => r === null || r === undefined)) return '';
	return results.map(String).join('');
}

export function renderTemplate(
	str: string,
	context: any,
	builderMode?: boolean
) {
	if (typeof str !== 'string') return str;
	return str.replace(/{{\s*([^}]+)\s*}}/g, (_, raw: string) => {
		const segments = raw.split('||');
		for (const segment of segments) {
			const value = evaluateSegment(segment, context);
			if (!isEmpty(value)) {
				const resolved = String(value);
				return builderMode ? resolved : resolved;
			}
		}
		return '';
	});
}
