import $ from 'jquery';
import 'select2';

function validateEmail(email: any): boolean {
    const emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
    return emailPattern.test(email);
}

function getLang(): string {
    if (window.location.href.indexOf('/de/') > -1) {
        return 'de';
    }
    if (window.location.href.indexOf('/en/') > -1) {
        return 'en';
    }
    if (window.location.href.indexOf('/es/') > -1) {
        return 'es';
    }
    if (window.location.href.indexOf('/ru/') > -1) {
        return 'ru';
    }
    return 'de';
}

function getErrorMessage(lang: string): string {
    const errorMessages: Record<string, string> = {
        de: 'Ungültige E-Mail-Adresse',
        en: 'Invalid email address',
        es: 'Dirección de correo no válida',
        ru: 'Некорректный email',
    };

    return errorMessages[lang] || errorMessages['de'];
}

export function initContactSelect2(): void {
    $('.select-contact').each(function () {
        const $el = $(this);
        const findContactsUrl = String($el.data('find-contacts-url') || '');

        $el
            .select2({
                createTag: function (params) {
                    $('#newContactButtonWrap').hide();

                    const emailValid = validateEmail(params.term);

                    if (params.term && !emailValid) {
                        $('#emailErrorMessage').text(getErrorMessage(getLang())).show();
                    } else {
                        $('#emailErrorMessage').hide();
                    }

                    return {
                        id: params.term,
                        text: 'Email: ' + params.term,
                    };
                },
                tags: true,
                language: getLang(),
                placeholder: $el.data('placeholder'),
                allowClear: Boolean($el.data('allow-clear')),
                minimumInputLength: 2,
                theme: 'bootstrap-5',
                ajax: {
                    delay: 300,
                    url: findContactsUrl,
                    data: function (params) {
                        return {
                            query: params.term,
                            action: 'getContactsByQuery',
                        };
                    },
                },
            })
            .on('select2:open', function () {
                setTimeout(function () {
                    const field = $('.select2-container--open .select2-search__field')[0] as HTMLElement | undefined;
                    field?.focus();
                }, 100);
            });
    });

    $('.select-contact').on('select2:select', function (e: any) {
        const selectedData = e.params.data;

        if (selectedData && selectedData.text) {
            const selectedText = selectedData.text;
            const emailMatch = selectedText.match(/[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}/);

            if (emailMatch) {
                if (validateEmail(emailMatch[0])) {
                    $('#emailErrorMessage').hide();
                } else {
                    $('#emailErrorMessage').text(getErrorMessage(getLang())).show();
                }
            } else {
                $('#emailErrorMessage').text(getErrorMessage(getLang())).show();
            }
        }
    });

    $('.select-contact').on('select2:close', function () {
        const currentValue = $(this).val();
        const selectedData = $(this).select2('data');

        if (!currentValue || validateEmail(currentValue)) {
            $('#emailErrorMessage').hide();
        } else if (selectedData && selectedData.length > 0) {
            const selectedText = selectedData[0].text;
            const emailMatch = selectedText.match(/[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}/);

            if (emailMatch && validateEmail(emailMatch[0])) {
                $('#emailErrorMessage').hide();
            } else {
                $('#emailErrorMessage').text(getErrorMessage(getLang())).show();
            }
        }
    });

    $('.select-contact').on('select2:clear select2:unselect', function () {
        const currentValue = $(this).val();
        if (!currentValue || validateEmail(currentValue)) {
            $('#emailErrorMessage').hide();
        }
    });
}
