const { gp_conditional_pricing_form_settings_strings: strings } = window;

export interface ConditionalLogicFieldOption {
	label: string;
	value: string;
}

export function triggerFileDownload(url: string, filename?: string) {
	const a = document.createElement('a');
	a.href = url;
	const downloadName = filename ?? url.split('/').pop();
	if (downloadName) {
		a.download = downloadName;
	}
	document.body.appendChild(a);
	a.click();
	document.body.removeChild(a);
}

export function numberToDisplayPrice(num: string | number) {
	if (typeof window.gform?.Currency !== 'function') {
		// Fallback for older versions
		const currency = new window.Currency(
			window.gf_global.gf_currency_config
		);
		return currency.toMoney(num);
	}

	const currency = new window.gform.Currency(
		window.gf_global.gf_currency_config
	);

	return currency.toMoney(num);
}

/**
 * A cheap UUID generator.
 */
export function uuid() {
	return Date.now().toString(36) + Math.random().toString(36).substring(7);
}

export function getProductFields() {
	const productFields = window.form.fields.filter((field) => {
		return (
			// @ts-ignore
			field.type === 'product' &&
			!['calculation', 'price'].includes(field.inputType)
		);
	});

	const isMultiProductField = (field: GFField) => {
		return ['select', 'radio'].includes(window.GetInputType(field));
	};

	const products = [];

	for (const field of productFields) {
		if (isMultiProductField(field)) {
			// add "parent" product
			products.push({
				id: field.id,
				label: window.GetLabel(field, field.id),
			});

			// add "child" products
			if (strings.support_individual_products === '1' && field.choices) {
				field.choices.forEach((choice, i) => {
					const id = i + 1;
					const inputId = `${field.id}.${id}`;

					products.push({
						id: inputId,
						label: `${window.GetLabel(field, field.id)} (${
							choice.text
						})`,
					});
				});
			}
		} else {
			products.push({
				id: field.id,
				label: window.GetLabel(field, field.id),
			});
		}
	}

	return products;
}

export function getAdditionalConditionalLogicFieldOptions(): ConditionalLogicFieldOption[] {
	const knownFieldIds = new Set(
		window.form.fields.flatMap((field) => [
			String(field.id),
			`quantity_${field.id}`,
			...(field.inputs ?? []).map((input) => String(input.id)),
		])
	);

	const allOptions: ConditionalLogicFieldOption[] =
		window.gform?.applyFilters?.(
			'gform_conditional_logic_fields',
			[],
			window.form,
			''
		) ?? [];

	const seen = new Set<string>();

	return allOptions.filter((option) => {
		const value = String(option?.value ?? '');
		const label = String(option?.label ?? '');

		if (!value || !label || knownFieldIds.has(value) || seen.has(value)) {
			return false;
		}

		seen.add(value);
		return true;
	});
}
