let wpaicgInit = {
    wpaicgImageForm: null,
    wpaicgImageGenerated: null,
    wpaicgImageGrid: null,
    wpaicgImageLoading: null,
    wpaicgImageSaveBtn: null,
    wpaicgImageMessage: null,
    wpaicgImageConvertBar: null,
    wpaicg_image_modal_close: null,
    wpaicgNumberImages: null,
    wpaicgImageGenerateBtn: null,
    wpaicgImageSelectAll: null,
    wpaicgStartTime: null,
    init: function (){
        this.search();
        this.image();
        return this;
    },
    search: function(){
        let that = this;
        let wpaicgSearchs = document.getElementsByClassName('wpaicg-search');
        if(wpaicgSearchs && wpaicgSearchs.length){
            for(let i=0;i<wpaicgSearchs.length;i++){
                let wpaicgSearch = wpaicgSearchs[i];
                let wpaicgSearchForm = wpaicgSearch.getElementsByClassName('wpaicg-search-form')[0];
                let wpaicgSearchField = wpaicgSearch.getElementsByClassName('wpaicg-search-field')[0];
                let wpaicgSearchResult = wpaicgSearch.getElementsByClassName('wpaicg-search-result')[0];
                let wpaicgSearchSource = wpaicgSearch.getElementsByClassName('wpaicg-search-source')[0];
                let wpaicgSearchBtn = wpaicgSearch.getElementsByClassName('wpaicg-search-submit')[0];
                wpaicgSearchBtn.addEventListener('click', function (){
                    that.searchData(wpaicgSearchResult,wpaicgSearchSource,wpaicgSearchField);
                });
                wpaicgSearchForm.addEventListener('submit', function (e){
                    that.searchData(wpaicgSearchResult,wpaicgSearchSource,wpaicgSearchField);
                    e.preventDefault();
                    return false;
                })
            }
        }
    },
    searchExpand: function(element){
        let item = element.closest('.wpaicg-search-item');
        if (item) {
            let excerpt = item.getElementsByClassName('wpaicg-search-item-excerpt')[0];
            let full = item.getElementsByClassName('wpaicg-search-item-full')[0];
            
            if (excerpt && full) {
                excerpt.style.display = 'none';
                full.style.display = 'block';
            } else {
                console.error("Excerpt or full element not found.");
            }
        } else {
            console.error("Item not found.");
        }
    },
    searchData: function (wpaicgSearchResult,wpaicgSearchSource,wpaicgSearchField){
        let search = wpaicgSearchField.value;
        if(search !== '') {
            wpaicgSearchResult.innerHTML = '<div class="wpaicg-search-loading"><div class="wpaicg-lds-dual-ring"></div></div>';
            wpaicgSearchSource.innerHTML = '';
            wpaicgSearchResult.classList.remove('wpaicg-has-item');
            const xhttp = new XMLHttpRequest();
            xhttp.open('POST', wpaicgParams.ajax_url);
            xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xhttp.send('action=wpaicg_search_data&_wpnonce='+wpaicgParams.search_nonce+'&search='+encodeURIComponent(search));
            xhttp.onreadystatechange = function(oEvent) {
                if (xhttp.readyState === 4) {
                    if (xhttp.status === 200) {
                        wpaicgSearchResult.classList.add('wpaicg-has-item');
                        var wpaicg_response = this.responseText;
                        if (wpaicg_response !== '') {
                            wpaicg_response = JSON.parse(wpaicg_response);
                            wpaicgSearchResult.innerHTML = '';
                            if (wpaicg_response.status === 'success') {
                                if(wpaicg_response.data.length){
                                    for(let i = 0; i < wpaicg_response.data.length; i++){
                                        let item = wpaicg_response.data[i];
                                        wpaicgSearchResult.innerHTML += item;
                                    }
                                    if(wpaicg_response.source.length){
                                        wpaicgSearchSource.innerHTML = '<h3>'+wpaicgParams.languages.source+'</h3>';
                                        for(let i = 0; i < wpaicg_response.source.length; i++){
                                            let item = wpaicg_response.source[i];
                                            wpaicgSearchSource.innerHTML += item;
                                        }
                                    }
                                }
                                else{
                                    wpaicgSearchResult.innerHTML = '<p>'+wpaicgParams.languages.no_result+'</p>';
                                }
                            }
                            else{
                                wpaicgSearchResult.innerHTML = '<p class="wpaicg-search-error">'+wpaicg_response.msg+'</p>';
                            }
                        }
                        else{
                            wpaicgSearchResult.innerHTML = '<p class="wpaicg-search-error">'+wpaicgParams.languages.wrong+'</p>';
                        }
                    }
                    else{
                        wpaicgSearchResult.innerHTML = '<p class="wpaicg-search-error">'+wpaicgParams.languages.wrong+'</p>';
                    }
                }
            }
        }
    },
    imageModal: function (id){
        var item = document.getElementById('wpaicg-image-item-'+id);
        var alt = item.querySelectorAll('.wpaicg-image-item-alt')[0].value;
        var title = item.querySelectorAll('.wpaicg-image-item-title')[0].value;
        var caption = item.querySelectorAll('.wpaicg-image-item-caption')[0].value;
        var description = item.querySelectorAll('.wpaicg-image-item-description')[0].value;
        var url = item.querySelectorAll('input[type=checkbox]')[0].value;
        document.querySelectorAll('.wpaicg_modal_content')[0].innerHTML = '';
        document.querySelectorAll('.wpaicg-overlay')[0].style.display = 'block';
        document.querySelectorAll('.wpaicg_modal')[0].style.display = 'block';
        document.querySelectorAll('.wpaicg_modal_title')[0].innerHTML = wpaicgParams.languages.edit_image;
        var html = '<div class="wpaicg_grid_form">';
        html += '<div class="wpaicg_grid_form_2"><img src="'+url+'" style="width: 100%"></div>';
        html += '<div class="wpaicg_grid_form_1">';
        html += '<p><label>'+wpaicgParams.languages.alternative+'</label><input type="text" class="wpaicg_edit_item_alt" style="width: 100%" value="'+alt+'"></p>';
        html += '<p><label>'+wpaicgParams.languages.title+'</label><input type="text" class="wpaicg_edit_item_title" style="width: 100%" value="'+title+'"></p>';
        html += '<p><label>'+wpaicgParams.languages.caption+'</label><input type="text" class="wpaicg_edit_item_caption" style="width: 100%" value="'+caption+'"></p>';
        html += '<p><label>'+wpaicgParams.languages.description+'</label><textarea class="wpaicg_edit_item_description" style="width: 100%">'+description+'</textarea></p>';
        html += '<button onclick="wpaicgSaveImageData('+id+')" data-id="'+id+'" class="button button-primary wpaicg_edit_image_save" type="button">'+wpaicgParams.languages.save+'</button>';
        html += '</div>';
        html += '</div>';
        document.querySelectorAll('.wpaicg_modal_content')[0].innerHTML = html;
        wpaicgImageCloseModal();
    },
    image_generator: function(data, start, max, multi_steps,form_action){
        let that = this;
        const xhttp = new XMLHttpRequest();
        xhttp.open('POST', wpaicgParams.ajax_url);
        xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhttp.send(data);
        xhttp.onreadystatechange = function(oEvent) {
            if (xhttp.readyState === 4) {
                if (xhttp.status === 200) {
                    var wpaicg_response = this.responseText;
                    res = JSON.parse(wpaicg_response);
                    if(res.status === 'success'){
                        for(var idx = 0; idx < res.imgs.length; idx++){
                            let idImageBox = idx;
                            if(multi_steps){
                                idImageBox = start -1;
                            }
                            var img = res.imgs[idx];
                            var html = '<div id="wpaicg-image-item-'+idImageBox+'" class="wpaicg-image-item wpaicg-image-item-'+idx+'" data-id="'+idImageBox+'">';
                            if(wpaicgParams.logged_in === '1') {
                                html += '<label><input data-id="' + idImageBox + '" class="wpaicg-image-item-select" type="checkbox" name="image_url" value="' + img + '"></label>';
                            }
                            html += '<input value="'+res.title+'" class="wpaicg-image-item-alt" type="hidden" name="image_alt">';
                            html += '<input value="'+res.title+'" class="wpaicg-image-item-title" type="hidden" name="image_title">';
                            html += '<input value="'+res.title+'" class="wpaicg-image-item-caption" type="hidden" name="image_caption">';
                            html += '<input value="'+res.title+'" class="wpaicg-image-item-description" type="hidden" name="image_description">';
                            if(wpaicgParams.logged_in === '1') {
                                html += '<img onclick="wpaicgInit.imageModal(' + idImageBox + ')" src="' + img + '">';
                            }
                            else {
                                html += '<img onclick="wpaicgViewModalImage(this)" src="' + img + '">';
                            }
                            html += '</div>';
                            that.wpaicgImageGrid.innerHTML += html;
                        }
                        if(multi_steps){
                            if(start === max){
                                wpaicgImageRmLoading(that.wpaicgImageGenerateBtn);
                                that.wpaicgImageSelectAll.classList.remove('selectall')
                                that.wpaicgImageSelectAll.innerHTML = wpaicgSelectAllText;
                                that.wpaicgImageSelectAll.style.display = 'block';
                                that.wpaicgImageLoading.style.display = 'none';
                                that.wpaicgImageSaveBtn.style.display = 'block';
                            }
                            else{
                                that.image_generator(data, start+1, max, multi_steps,form_action)
                            }
                        }
                        else{
                            if(form_action === 'wpaicg_image_generator'){
                                let endTime = new Date();
                                let timeDiff = endTime - that.wpaicgStartTime;
                                timeDiff = timeDiff/1000;
                                data += '&action=wpaicg_image_log&duration='+timeDiff+'&_wpnonce_image_log='+wpaicgImageNonce+'&shortcode=['+wpaicgImageShortcode+']&source_id='+wpaicgImageSourceID;
                                const xhttp = new XMLHttpRequest();
                                xhttp.open('POST', wpaicgParams.ajax_url);
                                xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                                xhttp.send(data);
                                xhttp.onreadystatechange = function (oEvent) {
                                    if (xhttp.readyState === 4) {

                                    }
                                }
                            }
                            wpaicgImageRmLoading(that.wpaicgImageGenerateBtn);
                            that.wpaicgImageSelectAll.classList.remove('selectall')
                            that.wpaicgImageSelectAll.innerHTML = '<?php echo esc_html($wpaicg_image_select_all_text)?>';
                            that.wpaicgImageSelectAll.style.display = 'block';
                            that.wpaicgImageLoading.style.display = 'none';
                            that.wpaicgImageSaveBtn.style.display = 'block';
                        }
                    }
                    else{
                        wpaicgImageRmLoading(that.wpaicgImageGenerateBtn);
                        that.wpaicgImageLoading.style.display = 'none';
                        let errorMessage = document.createElement('div');
                        errorMessage.style.color = '#f00';
                        errorMessage.classList.add('wpaicg-image-error');
                        errorMessage.innerHTML = res.msg;
                        that.wpaicgImageGenerated.prepend(errorMessage);
                        setTimeout(function (){
                            errorMessage.remove();
                        },3000);
                    }
                }
                else{
                    that.wpaicgImageLoading.style.display = 'none';
                    wpaicgImageRmLoading(that.wpaicgImageGenerateBtn);
                    alert('Something went wrong');
                }
            }
        }

    },
    save_image: function (items,start){
        let that = this;
        if(start >= items.length){
            that.wpaicgImageConvertBar.getElementsByTagName('small')[0].innerHTML = items.length+'/'+items.length;
            that.wpaicgImageConvertBar.getElementsByTagName('span')[0].style.width = '100%';
            that.wpaicgImageMessage.innerHTML = wpaicgParams.languages.save_image_success;
            wpaicgImageRmLoading(that.wpaicgImageSaveBtn);
            setTimeout(function (){
                that.wpaicgImageMessage.innerHTML = '';
            },2000)
        }
        else{
            var id = items[start];
            var item = document.getElementById('wpaicg-image-item-'+id);
            var data = 'action=wpaicg_save_image_media';
            data += '&image_alt='+item.querySelectorAll('.wpaicg-image-item-alt')[0].value;
            data += '&image_title='+item.querySelectorAll('.wpaicg-image-item-title')[0].value;
            data += '&image_caption='+item.querySelectorAll('.wpaicg-image-item-caption')[0].value;
            data += '&image_description='+item.querySelectorAll('.wpaicg-image-item-description')[0].value;
            data += '&image_url='+encodeURIComponent(item.querySelectorAll('.wpaicg-image-item-select')[0].value);
            data +='&nonce='+wpaicgImageSaveNonce;
            const xhttp = new XMLHttpRequest();
            xhttp.open('POST', wpaicgParams.ajax_url);
            xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xhttp.send(data);
            xhttp.onreadystatechange = function(oEvent) {
                if (xhttp.readyState === 4) {
                    if (xhttp.status === 200) {
                        var wpaicg_response = this.responseText;
                        res = JSON.parse(wpaicg_response);
                        if(res.status === 'success'){
                            var currentPos = start+1;
                            var percent = Math.ceil(currentPos*100/items.length);
                            that.wpaicgImageConvertBar.getElementsByTagName('small')[0].innerHTML = currentPos+'/'+items.length;
                            that.wpaicgImageConvertBar.getElementsByTagName('span')[0].style.width = percent+'%';
                            that.save_image(items, start+1);
                        }
                        else{
                            that.wpaicgImageConvertBar.classList.add('wpaicg_error');
                            wpaicgImageRmLoading(that.wpaicgImageSaveBtn);
                            alert(res.msg);
                        }
                    } else {
                        alert(wpaicgParams.languages.wrong);
                        that.wpaicgImageConvertBar.classList.add('wpaicg_error');
                        wpaicgImageRmLoading(that.wpaicgImageSaveBtn);
                    }
                }
            }
        }
    },
    image: function (){
        let that = this;
        let wpaicgImageForm = document.getElementById('wpaicg-image-generator-form');
        if(wpaicgImageForm){
            this.wpaicgImageForm = wpaicgImageForm;
            this.wpaicgImageGenerated = wpaicgImageForm.getElementsByClassName('image-generated')[0];
            this.wpaicgImageGrid = wpaicgImageForm.getElementsByClassName('image-grid')[0];
            this.wpaicgImageLoading = wpaicgImageForm.getElementsByClassName('image-generate-loading')[0];
            this.wpaicgImageSaveBtn = wpaicgImageForm.getElementsByClassName('image-generator-save')[0];
            this.wpaicgImageMessage = wpaicgImageForm.getElementsByClassName('wpaicg_message')[0];
            this.wpaicgImageConvertBar = wpaicgImageForm.getElementsByClassName('wpaicg-convert-bar')[0];
            this.wpaicg_image_modal_close = wpaicgImageForm.getElementsByClassName('wpaicg_image_modal_close');
            this.wpaicgNumberImages = wpaicgImageForm.querySelector('select[name=num_images]');
            this.wpaicgImageGenerateBtn = wpaicgImageForm.getElementsByClassName('wpaicg_button_generate')[0];
            this.wpaicgImageSelectAll = wpaicgImageForm.getElementsByClassName('wpaicg_image_select_all')[0];
            this.wpaicgImageSaveBtn.addEventListener('click', function (e) {
                var items = [];
                document.querySelectorAll('.wpaicg-image-item input[type=checkbox]').forEach(function (item) {
                    if (item.checked) {
                        items.push(item.getAttribute('data-id'));
                    }
                });
                if (items.length) {
                    that.wpaicgImageConvertBar.style.display = 'block';
                    that.wpaicgImageConvertBar.classList.remove('wpaicg_error');
                    that.wpaicgImageConvertBar.getElementsByTagName('small')[0].innerHTML = '0/' + items.length;
                    that.wpaicgImageConvertBar.getElementsByTagName('span')[0].style.width = 0;
                    that.wpaicgImageMessage.innerHTML = '';
                    wpaicgImageLoadingEffect(that.wpaicgImageSaveBtn);
                    that.save_image(items, 0);
                } else {
                    alert(wpaicgParams.languages.select_save_error);
                }
            })
            this.wpaicgImageSelectAll.addEventListener('click', function (e) {
                if (that.wpaicgImageSelectAll.classList.contains('selectall')) {
                    that.wpaicgImageSelectAll.classList.remove('selectall');
                    that.wpaicgImageSelectAll.innerHTML = wpaicgSelectAllText;
                    document.querySelectorAll('.wpaicg-image-item input[type=checkbox]').forEach(function (item) {
                        item.checked = false;
                    })
                } else {
                    that.wpaicgImageSelectAll.classList.add('selectall');
                    that.wpaicgImageSelectAll.innerHTML = wpaicgParams.languages.unselect;
                    document.querySelectorAll('.wpaicg-image-item input[type=checkbox]').forEach(function (item) {
                        item.checked = true;
                    })
                }
            });
            wpaicgImageForm.addEventListener('submit', function (e) {
                e.preventDefault();
                var form_action = wpaicgImageForm.querySelectorAll('input[name=action]')[0].value;
                if (form_action === 'wpaicg_image_stable_diffusion') {
                    that.wpaicgNumberImages = wpaicgImageForm.querySelector('select[name=num_outputs]');
                }
                var num_images = parseInt(that.wpaicgNumberImages.value);
                if (num_images > 0) {
                    var wpaicg_error = false;
                    if (form_action === 'wpaicg_image_stable_diffusion') {
                        var prompt_strength = parseFloat(document.getElementById('prompt_strength').value);
                        var num_inference_steps = parseFloat(document.getElementById('num_inference_steps').value);
                        var guidance_scale = parseFloat(document.getElementById('guidance_scale').value);
                        if (prompt_strength < 0 || prompt_strength > 1) {
                            wpaicg_error = wpaicgParams.languages.prompt_strength
                        } else if (num_inference_steps < 1 || num_inference_steps > 500) {
                            wpaicg_error = wpaicgParams.languages.num_inference_steps
                        } else if (guidance_scale < 1 || guidance_scale > 20) {
                            wpaicg_error = wpaicgParams.languages.guidance_scale
                        }
                    }
                    if (wpaicg_error) {
                        alert(wpaicg_error);
                    } else {
                        const queryString = new URLSearchParams(new FormData(wpaicgImageForm)).toString();
                        that.wpaicgImageSaveBtn.style.display = 'none';
                        wpaicgImageLoadingEffect(that.wpaicgImageGenerateBtn);
                        that.wpaicgImageConvertBar.style.display = 'none';
                        that.wpaicgImageLoading.style.display = 'flex';
                        that.wpaicgImageGrid.innerHTML = '';
                        that.wpaicgImageSelectAll.style.display = 'none';
                        let wpaicgImageError = document.getElementsByClassName('wpaicg-image-error');
                        if (wpaicgImageError.length) {
                            wpaicgImageError[0].remove();
                        }
                        if (form_action === 'wpaicg_image_stable_diffusion') {
                            that.image_generator(queryString, 1, num_images, true, form_action);
                        } else {
                            that.wpaicgStartTime = new Date();
                            that.image_generator(queryString, 1, num_images, false, form_action);
                        }
                    }
                } else {
                    alert(wpaicgParams.languages.error_image)
                }
                return false;
            });
        }
    }
}
window['wpaicgInit'] = wpaicgInit.init();

