// @ts-nocheck

export const getCurrency = (userCountry) => {
	const countryCurrency = {
		US: 'USD',
		GB: 'GBP',
		EU: 'EUR',
		AT: 'EUR',
		BE: 'EUR',
		CY: 'EUR',
		EE: 'EUR',
		FI: 'EUR',
		FR: 'EUR',
		DE: 'EUR',
		GR: 'EUR',
		IE: 'EUR',
		IT: 'EUR',
		LV: 'EUR',
		LT: 'EUR',
		LU: 'EUR',
		MT: 'EUR',
		NL: 'EUR',
		PT: 'EUR',
		SK: 'EUR',
		SI: 'EUR',
		RU: 'RUB',
		BR: 'BRL',
		JP: 'JPY',
		ID: 'IDR',
		MY: 'MYR',
		PH: 'PHP',
		TH: 'THB',
		VN: 'VND',
		KR: 'KRW',
		TR: 'TRY',
		UA: 'UAH',
		MX: 'MXN',
		CA: 'CAD',
		NZ: 'NZD',
		NO: 'NOK',
		PL: 'PLN',
		CH: 'CHF',
		LI: 'CHF',
		IN: 'INR',
		CL: 'CLP',
		PE: 'PEN',
		CO: 'COP',
		ZA: 'ZAR',
		HK: 'HKD',
		AR: 'ARS',
		KZ: 'KZT',
		UY: 'UYU',
		CN: 'CNY',
		AU: 'AUD',
		TW: 'TWD',
		SA: 'SAR',
		QA: 'QAR',
	}

	return countryCurrency[userCountry] ?? 'USD'
}

export const formatPrice = (locale, price, currency, trimZeros = false) => {
	let formatter = new Intl.NumberFormat(locale, {
		style: 'currency',
		currency,
	})

	const maxDigits = formatter.resolvedOptions().maximumFractionDigits
	const convertedPrice = price / Math.pow(10, maxDigits)

	let minimumFractionDigits = maxDigits

	if (trimZeros && Number.isInteger(convertedPrice)) {
		minimumFractionDigits = 0
	}

	formatter = new Intl.NumberFormat(locale, {
		style: 'currency',
		currency,
		minimumFractionDigits,
	})
	return formatter.format(convertedPrice)
}

export const calculateSavings = (monthlyPlan, plan, months = 12) => {
	const monthlyAnnualized = monthlyPlan * months

	return Math.floor(((monthlyAnnualized - plan) / monthlyAnnualized) * 100)
}

export const createStripeElements = (stripe, paymentMethods, options) => {
	const styles = getComputedStyle(document.body)

	const elements = stripe.elements({
		appearance: {
			variables: {
				colorPrimary: styles.getPropertyValue('--color-brand'),
				colorBackground: styles.getPropertyValue('--color-button-bg'),
				colorText: styles.getPropertyValue('--color-base'),
				colorTextPlaceholder: styles.getPropertyValue('--color-secondary'),
				colorDanger: styles.getPropertyValue('--color-red'),
				fontFamily: styles.getPropertyValue('--font-standard'),
				spacingUnit: '0.25rem',
				borderRadius: '0.75rem',
			},
		},
		loader: 'never',
		...options,
	})

	const paymentElement = elements.create('payment')
	paymentElement.mount('#payment-element')

	const addressElement = elements.create('address', {
		mode: 'billing',
		contacts: paymentMethods
			? [
					...new Set(
						paymentMethods.map((x) => ({
							address: x.billing_details.address,
							email: x.billing_details.email,
							name: x.billing_details.name,
						})),
					),
				]
			: undefined,
	})
	addressElement.mount('#address-element')

	addressElement.on('change', (e) => {
		if (e.value && e.value.address && e.value.address.country) {
			elements.update({ currency: getCurrency(e.value.address.country).toLowerCase() })
		}
	})

	return { elements, paymentElement, addressElement }
}
