(function ($) {
    "use strict";

    if ($('#summernote').length) {
        $('#summernote').summernote({
            tabsize: 2,
            height: 400,
            placeholder: $('#summernote').attr('placeholder'),
            dialogsInBody: true,
            toolbar: [
                ['style', ['style']],
                ['font', ['bold', 'underline', 'clear']],
                ['fontname', ['fontname']],
                ['color', ['color']],
                ['para', ['paragraph']],
                ['table', ['table']],
                ['insert', ['link', 'picture', 'video']],
                ['view', ['fullscreen', 'codeview', 'help']],
            ],
        });
    }

    $('body').on('change', '#unlimitedInventorySwitch', function () {
        const inventoryInputs = $('.js-inventory-inputs');

        if (this.checked) {
            inventoryInputs.addClass('d-none');
        } else {
            inventoryInputs.removeClass('d-none');
        }
    });

    $('body').on('click', '.add-btn', function (e) {
        var mainRow = $('.main-row');
        var imagesCount = $('.product-images-input-group').length;

        if (imagesCount < 4) {
            var copy = mainRow.clone();
            copy.removeClass('main-row');
            copy.removeClass('d-none');

            const addBtn = copy.find('.add-btn');

            if (addBtn) {
                addBtn.removeClass('add-btn btn-primary')
                    .addClass('btn-danger remove-btn');

                const icon = addBtn.find('i');
                icon.removeClass();

                icon.addClass('fa fa-times');
            }

            var copyHtml = copy.prop('innerHTML');
            copyHtml = copyHtml.replaceAll('record', randomString());
            copyHtml = copyHtml.replaceAll('btn-primary', 'btn-danger');
            copyHtml = copyHtml.replaceAll('add-btn', 'remove-btn');

            copy.html(copyHtml);
            $('#productImagesInputs').append(copy);
        } else {
            $.toast({
                heading: requestFailedLang,
                text: maxFourImageCanSelect,
                bgColor: '#f63c3c',
                textColor: 'white',
                hideAfter: 10000,
                position: 'bottom-right',
                icon: 'error'
            });
        }
    });

    $('body').on('click', '.remove-btn', function (e) {
        e.preventDefault();
        $(this).closest('.input-group').remove();
    });

    function randomString() {
        var text = "";
        var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

        for (var i = 0; i < 4; i++)
            text += possible.charAt(Math.floor(Math.random() * possible.length));

        return text;
    }

    $('body').on('click', '#productAddFile', function (e) {
        e.preventDefault();
        const nameId = randomString();

        let add_file_modal = '<div id="addFilesModal">';
        add_file_modal += $('#productFileModal').html();
        add_file_modal += '</div>';
        add_file_modal = add_file_modal.replaceAll('str_', '');
        add_file_modal = add_file_modal.replaceAll('record', nameId);

        Swal.fire({
            html: add_file_modal,
            showCancelButton: false,
            showConfirmButton: false,
            customClass: {
                content: 'p-0 text-left',
            },
            width: '48rem',
            onOpen: function () {
                const $form = $('#addFilesModal form');

                handleFileItemsByType($form);
            }
        });
    });


    $('body').on('click', '.js-show-description', function (e) {
        e.preventDefault();

        const message = $(this).parent().find('input[type="hidden"]').val();

        const $modal = $('#fileDescriptionModal');
        $modal.find('.modal-body').html(message);

        $modal.modal('show');
    });

    $('body').on('click', '.edit-file', function (e) {
        e.preventDefault();
        const $this = $(this);

        loadingSwl();

        editFile($this);
    });

    $('body').on('change', '.js-edit-file-locale-ajax', function (e) {
        e.preventDefault();
        const $this = $(this);
        const locale = $this.val();

        editFile($this, locale);
    });

    function editFile($this, locale = null) {
        const file_id = $this.attr('data-file-id');
        const product_id = $this.attr('data-product-id');


        const edit_data = {
            product_id: product_id,
            locale: locale
        };

        $.post('/admin/store/products/files/' + file_id + '/edit', edit_data, function (result) {
            if (result && result.file) {
                const file = result.file;

                createEditFileModal(file);
            }
        });
    }

    function createEditFileModal(file) {
        let edit_file_modal = '<div id="addFilesModal">';
        edit_file_modal += $('#productFileModal').html();
        edit_file_modal += '</div>';
        edit_file_modal = edit_file_modal.replaceAll('/files/store', '/files/' + file.id + '/update');
        edit_file_modal = edit_file_modal.replaceAll('str_', '');
        const random = randomString();
        edit_file_modal = edit_file_modal.replaceAll('record', random);

        Swal.fire({
            html: edit_file_modal,
            showCancelButton: false,
            showConfirmButton: false,
            customClass: {
                content: 'p-0 text-left',
            },
            width: '48rem',
            onOpen: () => {
                var $modal = $('#addFilesModal');

                Object.keys(file).forEach(key => {
                    if (key === 'status') {
                        const checked = (file.status === 'active');
                        $modal.find('input[name="' + key + '"]').prop('checked', checked);
                    } else if (key === 'online_viewer') {
                        const checked = (file.online_viewer && file.online_viewer === 1);
                        $modal.find('input[name="' + key + '"]').prop('checked', checked);
                    } else {
                        $modal.find('[name="' + key + '"]').val(file[key]);
                    }
                });

                var localeSelect = $modal.find('select[name="locale"]');

                if (localeSelect) {
                    localeSelect.addClass('js-edit-file-locale-ajax');
                    localeSelect.attr('data-file-id', file.id);
                    localeSelect.attr('data-product-id', file.product_id);
                }

                const $form = $modal.find('form');

                handleFileItemsByType($form);
            }
        });
    }

    $('body').on('click', '#saveFile', function (e) {
        e.preventDefault();
        const $this = $(this);
        let form = $('#addFilesModal form');

        let action = form.attr('action');

        handleProductItemForm(form, $this, action);
    });

    function handleProductItemForm(form, $this, action) {
        $this.addClass('loadingbar gray').prop('disabled', true);
        form.find('input').removeClass('is-invalid');
        form.find('textarea').removeClass('is-invalid');

        var formData = new FormData();

        const items = form.find('input, textarea, select').serializeArray();

        $.each(items, function () {
            formData.append(this.name, this.value);
        });

        $.ajax({
            url: action,
            type: 'POST',
            data: formData,
            processData: false,
            contentType: false,
            cache: false,
            success: function (result) {
                if (result && result.code === 200) {
                    //window.location.reload();
                    Swal.fire({
                        icon: 'success',
                        html: '<h3 class="font-20 text-center text-dark-blue py-25">' + saveSuccessLang + '</h3>',
                        showConfirmButton: false,
                        width: '25rem',
                    });

                    setTimeout(() => {
                        window.location.reload();
                    }, 500);
                }
            },
            error: function (err) {
                $this.removeClass('loadingbar gray').prop('disabled', false);
                var errors = err.responseJSON;

                if (errors && errors.errors) {
                    Object.keys(errors.errors).forEach((key) => {
                        const error = errors.errors[key];
                        let element = form.find('[name="' + key + '"]');

                        element.addClass('is-invalid');
                        element.parent().find('.invalid-feedback').text(error[0]);
                    });
                }
            }
        });
    }

    function handleSpecificationTags(elClassName) {
        if (jQuery().tagsinput) {
            var input_tags = $('.' + elClassName);
            input_tags.tagsinput({
                tagClass: 'badge badge-primary',
                maxTags: (input_tags.data('max-tag') ? input_tags.data('max-tag') : 10),
            });
        }
    }

    function handleSpecificationSelect2(elClassName) {
        const el = $('.' + elClassName);

        if (el && el.length) {
            el.select2({
                placeholder: $(this).data('placeholder'),
                //minimumInputLength: 3,
                allowClear: true,
                /*ajax: {
                    url: '/admin/store/products/specifications/search',
                    dataType: 'json',
                    type: "POST",
                    quietMillis: 50,
                    data: function (params) {
                        return {
                            term: params.term,
                            category_id: $('#categories').val(),
                        };
                    },
                    processResults: function (data) {
                        return {
                            results: $.map(data, function (item) {
                                return {
                                    text: item.title,
                                    id: item.id,
                                    input_type: item.input_type,
                                }
                            })
                        };
                    }
                }*/
            });

            el.on('change', function (e) {
                const specificationId = e.target.value;
                const $form = $(e.target).closest('.specification-form');

                handleSpecificationInputType($form, specificationId)
            });
        }
    }

    function handleSpecificationMultiValueSelect2(elClassName) {
        const el = $('.' + elClassName);

        if (el && el.length) {
            el.select2();
        }
    }

    $(document).ready(function () {
        handleSpecificationMultiValueSelect2('select-multi-values-select2');

        handleSpecificationSelect2('search-specification-select2');
    })

    function handleSpecificationInputType($form, specificationId) {
        $.get('/admin/store/products/specifications/' + specificationId + '/get', function (result) {
            if (result) {
                const {specification, multiValues} = result;

                const multiValuesInput = $form.find('.js-multi-values-input');
                const summaryInput = $form.find('.js-summery-input');
                const allowSelectionInput = $form.find('.js-allow-selection-input');

                $form.find('.js-input-type').val(specification.input_type);

                allowSelectionInput.find('input').prop('checked', false);

                if (specification.input_type === 'multi_value') {
                    multiValuesInput.removeClass('d-none');
                    allowSelectionInput.removeClass('d-none');
                    summaryInput.addClass('d-none');

                    const select = $('.multi_values-select2');
                    let html = '';
                    if (multiValues) {
                        for (const multiValue of multiValues) {
                            html += `<option value="${multiValue.id}">${multiValue.title}</option>`;
                        }
                    }
                    select.append(html);

                    handleSpecificationMultiValueSelect2('multi_values-select2');
                } else {
                    multiValuesInput.addClass('d-none');
                    allowSelectionInput.addClass('d-none');
                    summaryInput.removeClass('d-none');
                }

                allowSelectionInput.find('input').prop('checked', false);
            }
        });
    }

    $('body').on('click', '#productAddSpecification', function (e) {
        e.preventDefault();
        const key = randomString();

        $(this).closest('.col-12').find('.no-result').addClass('d-none').removeClass('d-flex');

        let html = $('#newSpecificationForm').html();
        html = html.replaceAll('record', key);

        html = html.replaceAll('specification-select2', 'search-specification-select2-' + key);
        html = html.replaceAll('multi_values-select', 'multi_values-select2');

        html = html.replaceAll('input_tags', 'input_tags-' + key);

        $('#specificationsAccordion').prepend(html);

        handleSpecificationTags('input_tags-' + key);

        handleSpecificationSelect2('search-specification-select2-' + key);
    });

    $('body').on('click', '.js-save-specification', function (e) {
        e.preventDefault();
        const $this = $(this);
        let form = $this.closest('.specification-form');

        let action = form.attr('data-action');

        handleProductItemForm(form, $this, action);
    });

    $('body').on('click', '.cancel-accordion', function (e) {
        e.preventDefault();

        $(this).closest('.col-12').find('.no-result').removeClass('d-none').addClass('d-flex');

        $(this).closest('.accordion-row').remove();
    });

    $('body').on('click', '#productAddFAQ', function (e) {
        e.preventDefault();

        $(this).closest('.col-12').find('.no-result').addClass('d-none').removeClass('d-flex');

        const key = randomString();

        let html = $('#newFaqForm').html();
        html = html.replaceAll('record', key);

        $('#faqsAccordion').prepend(html);
    });

    $('body').on('click', '.js-save-faq', function (e) {
        e.preventDefault();
        const $this = $(this);
        let form = $this.closest('.faq-form');

        let action = form.attr('data-action');

        handleProductItemForm(form, $this, action);
    });

    $('body').on('click', '#saveAndPublish', function (e) {
        e.preventDefault();
        $('#productStatusInput').val('active');
        $('#productForm').trigger('submit');
    });

    $('body').on('click', '#saveReject', function (e) {
        e.preventDefault();
        $('#productStatusInput').val('inactive');
        $('#productForm').trigger('submit');
    });

    $('body').on('change', '#categories', function (e) {
        e.preventDefault();
        let category_id = this.value;
        $.get('/admin/store/products/filters/get-by-category-id/' + category_id, function (result) {

            if (result && typeof result.filters !== "undefined" && result.filters.length) {
                const defaultLocale = result.defaultLocale;
                let html = '';

                Object.keys(result.filters).forEach(key => {
                    let filter = result.filters[key];
                    let options = [];

                    if (filter.options.length) {
                        options = filter.options;
                    }

                    let filterTitle = filter.title;

                    if (!filterTitle && filter.translations) {
                        filterTitle = handleGetFiltersTitleFromTranslations(filter.translations, defaultLocale);
                    }

                    html += '<div class="col-12 col-md-3">\n' +
                        '<div class="webinar-category-filters">\n' +
                        '<strong class="category-filter-title d-block">' + filterTitle + '</strong>\n' +
                        '<div class="py-10"></div>\n' +
                        '\n';

                    if (options.length) {
                        Object.keys(options).forEach(index => {
                            let option = options[index];

                            let optionTitle = option.title;

                            if (!optionTitle && option.translations) {
                                optionTitle = handleGetFiltersTitleFromTranslations(option.translations, defaultLocale);
                            }

                            html += '<div class="form-group mt-20 d-flex align-items-center justify-content-between">\n' +
                                '<label class="cursor-pointer" for="filterOption' + option.id + '">' + optionTitle + '</label>\n' +
                                '<div class="custom-control custom-checkbox">\n' +
                                '<input type="checkbox" name="filters[]" value="' + option.id + '" class="custom-control-input" id="filterOption' + option.id + '">\n' +
                                '<label class="custom-control-label" for="filterOption' + option.id + '"></label>\n' +
                                '</div>\n' +
                                '</div>\n';
                        });
                    }

                    html += '</div></div>';
                });

                $('#categoriesFiltersContainer').removeClass('d-none');
                $('#categoriesFiltersCard').html(html);
            } else {
                $('#categoriesFiltersContainer').addClass('d-none');
                $('#categoriesFiltersCard').html('');
            }
        });
    });

    function handleGetFiltersTitleFromTranslations(translations, defaultLocale) {
        let title = null;

        if (Object.keys(translations).length) {
            Object.keys(translations).forEach(key => {
                const translation = translations[key];

                if (translation.locale === defaultLocale) {
                    title = translation.title;
                }
            });

            if (!title) {
                title = translations[0].title;
            }
        }

        return title;
    }

    $('body').on('change', '.js-product-content-locale', function (e) {
        e.preventDefault();

        const $this = $(this);
        const $form = $(this).closest('.js-content-form');
        const locale = $this.val();
        const productId = $this.attr('data-product-id');
        const item_id = $this.attr('data-id');
        const relation = $this.attr('data-relation');
        let fields = $this.attr('data-fields');
        fields = fields.split(',');


        $this.addClass('loadingbar gray');

        const path = '/admin/store/products/' + productId + '/getContentItemByLocale';
        const data = {
            item_id,
            locale,
            relation
        };

        $.post(path, data, function (result) {
            if (result && result.item) {
                const item = result.item;

                Object.keys(item).forEach(function (key) {
                    const value = item[key];

                    if ($.inArray(key, fields) !== -1) {
                        let elKey = key;

                        if (relation === 'selectedSpecifications') {
                            elKey = 'tags';

                            if (item.type === 'textarea') {
                                elKey = 'summary';
                            }
                        }

                        let element = $form.find('.js-ajax-' + elKey);

                        if (elKey === 'tags') {
                            element.tagsinput('destroy');
                        }

                        element.val(value);

                        if (elKey === 'tags') {
                            const randomClass = 'tags-' + randomString();

                            element.addClass(randomClass)
                            handleSpecificationTags(randomClass);
                        }
                    }
                });

                $this.removeClass('loadingbar gray');
            }
        }).fail(err => {
            $this.removeClass('loadingbar gray');
        });
    });

    $('body').on('change', '.js-ajax-file_type', function (e) {
        e.preventDefault();

        const $form = $(this).closest('form');
        //const source = formGroup.find('.js-file-storage').val();

        handleFileItemsByType($form);
    });

    function handleFileItemsByType($form) {
        const fileType = $form.find('.js-ajax-file_type').val();
        const $onlineViewerInput = $form.find('.js-online_viewer-input');

        if (fileType && (fileType === 'pdf')) {
            $onlineViewerInput.removeClass('d-none');
        } else {
            $onlineViewerInput.find('input').prop('checked', false);
            $onlineViewerInput.addClass('d-none');
        }
    }

})(jQuery);
