import { ReactText } from 'react'
import { replaceComma } from './utility'
import { InputControl } from '../types/common'
import { Translation } from '../types/settings'

export const emailRegEx = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

type Validator = (
	control: InputControl,
	value: ReactText,
	translations: Translation,
) => InputControl

export const validator: Validator = (control, value, translations) => {
	let validStatus = true

	const isNumber = +replaceComma(value) === parseInt(replaceComma(value), 10)
	const isFloat =
		Number(+replaceComma(value)) === +replaceComma(value) && +replaceComma(value) % 1 !== 0

	if (value === undefined || value === null) {
		// Set initial error
		control.error = true
	} else {
		// Validation system
		if (control.characterRestriction) {
			if (typeof value === 'string' && value.length > control.characterRestriction) {
				control.error = translations.tooLongError
				validStatus = false
			}
		}

		if (value !== '' && control.email) {
			if (!emailRegEx.test(String(value).toLowerCase())) {
				control.error = translations.emailError
				validStatus = false
			}
		}

		if (control.number) {
			if (!isFloat && !isNumber) {
				control.error = translations.numberError
				validStatus = false
			} else if (control.positiveNumber) {
				if (+value <= 0) {
					control.error = translations.greaterThanZeroError
					validStatus = false
				}
			}
		}

		if (control.required) {
			if (`${value}`.trim() === '') {
				control.error = translations.requiredError
				validStatus = false
			}
		}

		if (validStatus && control.error) {
			delete control.error
		}
	}

	return control
}

export const checkValidation = (control: InputControl, value: ReactText) =>
	!!(!control.error && value && `${value}`.trim() !== '')