jQuery(function ($) {

    let cuw_ajax_url = cuw_frontend.ajax_url;
    let cuw_ajax_nonce = cuw_frontend.ajax_nonce;
    let cuw_async_cart_action_request = cuw_frontend.async_cart_action_request == '1';
    let cuw_async_offer_action_request = cuw_frontend.async_offer_action_request == '1';

    var cuw_page_action_performing = false;

    /* Actions */
    window.cuw_actions = {
        // add offer to cart
        add_offer_to_cart: function (offer) {
            // to prevent ajax requests
            if (offer.data('lock')) {
                return;
            }
            offer.data('lock', true);

            // to show loading animation
            cuw_spinner.show(offer);

            $.ajax({
                type: 'post',
                url: cuw_ajax_url,
                async: cuw_async_offer_action_request,
                data: {
                    action: 'cuw_ajax',
                    method: 'add_offer_to_cart',
                    offer_id: offer.data('id') || 0,
                    quantity: offer.find('[name="quantity"]').val() || 0,
                    variation_id: offer.find('[name="variation_id"]').val() || 0,
                    nonce: cuw_ajax_nonce || ""
                },
                success: function (response) {
                    if (response.success && response.data) {
                        $(document.body).trigger('cuw_offer_added_to_cart', [response.data, offer]);
                    }
                    setTimeout(function () {
                        $(document.body).trigger('added_to_cart', {});
                    }, 0);
                    $(document.body).trigger('update_checkout');
                    if (response.data && response.data.remove) {
                        if (response.data.remove === 'all') {
                            $(".cuw-offer").fadeOut(1000, function () {
                                $(this).remove();
                            });
                        } else {
                            offer.fadeOut(1000, function () {
                                $(this).remove();
                            });
                        }
                    } else {
                        offer.data('lock', false);
                        cuw_spinner.hide(offer);
                    }
                }
            });
        },

        // perform action
        perform_action: function (action) {
            // to prevent ajax requests
            if (action.data('lock')) {
                return;
            }
            action.data('lock', true);

            let params = action.data();
            delete params.lock;
            params.checked = action.find('input[type=checkbox]').is(':checked');

            $.ajax({
                type: 'post',
                url: cuw_ajax_url,
                async: false,
                data: {
                    action: 'cuw_ajax',
                    method: 'perform_action',
                    params: params,
                    nonce: cuw_ajax_nonce || ""
                },
                success: function (response) {
                    if (response.success && response.data) {
                        $(document.body).trigger('cuw_action_performed', [response.data, action]);
                    }
                    if (response.data) {
                        if (response.data.trigger) {
                            $(document.body).trigger(response.data.trigger, {});
                        }

                        if (!response.data.remove) {
                            action.find('input[type=checkbox]').prop('checked', response.data.checked ? true : false);
                            action.data('lock', response.data.lock ? true : false);
                        } else {
                            action.remove();
                        }
                    }
                }
            });
        },

        // add chosen products to cart
        add_products_to_cart: function (section, force = false) {
            let chosen_product_ids = [];
            let chosen_variable_product_ids = [];
            cuw_products.get_chosen_products(section).forEach(function(product) {
                chosen_product_ids.push(product.data('id'));
                if (product.hasClass('is_variable')) {
                    chosen_variable_product_ids.push(product.data('id'));
                }
            });
            if (!force && chosen_variable_product_ids.length > 0) {
                let modal = section.find('.cuw-modal').first();
                modal.find('.cuw-product-row').each(function (index, row) {
                    if (chosen_product_ids.includes($(row).data('product_id'))) {
                        cuw_products.update_product_row(section, $(row));
                        $(row).show();
                    } else {
                        $(row).hide();
                    }
                });
                cuw_products.update_prices(section);
                cuw_modal.show(modal);
            } else {
                cuw_spinner.show(section.find(force ? ".cuw-modal-body" : ".cuw-buy-section"));
                section.find('form').submit();
            }
        },

        // add product to cart
        add_product_to_cart: function (section, product) {
            // to prevent ajax requests
            if (product.data('lock')) {
                return;
            }
            product.data('lock', true);

            // to show loading animation
            cuw_spinner.show(product);

            let page = this.get_page(section);

            $.ajax({
                type: 'post',
                url: cuw_ajax_url,
                async: cuw_async_cart_action_request,
                data: {
                    action: 'cuw_ajax',
                    method: 'add_product_to_cart',
                    campaign_id: section.data('campaign_id') || 0,
                    product_id: product.data('id') || 0,
                    quantity: product.find('[name="quantity"]').val() || 0,
                    variation_id: product.find('[name="variation_id"]').val() || 0,
                    page: page,
                    nonce: cuw_ajax_nonce || ""
                },
                success: function (response) {
                    if (response.data && response.data.item_key && response.data.cart_subtotal) {
                        product.data('key', response.data.item_key);
                        cuw_products.update_inputs(product, false);
                        cuw_products.update_prices(section, response.data);
                        cuw_actions.update_fragments(page);
                    }
                    cuw_spinner.hide(product);
                    product.data('lock', false);
                },
            });
        },

        // remove item from cart
        remove_item_from_cart: function (section, product) {
            let key = product.data('key');
            if (!key) {
                return;
            }

            // to prevent ajax requests
            if (product.data('lock')) {
                return;
            }
            product.data('lock', true);

            // to show loading animation
            cuw_spinner.show(product);

            let page = this.get_page(section);

            $.ajax({
                type: 'post',
                url: cuw_ajax_url,
                async: cuw_async_cart_action_request,
                data: {
                    action: 'cuw_ajax',
                    method: 'remove_item_from_cart',
                    item_key: key,
                    page: page,
                    nonce: cuw_ajax_nonce || ""
                },
                success: function (response) {
                    if (response.data && response.data.cart_subtotal) {
                        if (response.data.item_removed === true) {
                            product.data('key', '');
                        }
                        cuw_products.update_inputs(product, true);
                        cuw_products.update_prices(section, response.data);
                        cuw_actions.update_fragments(page);
                    }
                    cuw_spinner.hide(product);
                    product.data('lock', false);
                },
            });
        },

        // to get page
        get_page: function (section = null) {
            let page = '';
            if (section !== null) {
                page = section.data('page') ? section.data('page') : section.closest('.cuw-modal').data('page');
            }
            return page;
        },

        // to update page fragments
        update_fragments: function (page) {
            if (page === 'cart') {
                $(document.body).trigger('added_to_cart', {});
            } else if (page === 'checkout') {
                $(document.body).trigger('update_checkout');
            } else {
                $(document.body).trigger('wc_fragment_refresh');
            }
        }
    }

    $(document).on("click", ".cuw-products .cuw-product .cuw-add-product-to-cart", function () {
        cuw_actions.add_product_to_cart($(this).closest('.cuw-products'), $(this).closest('.cuw-product'));
    });

    $(document).on("click", ".cuw-products .cuw-product .cuw-remove-item-from-cart", function () {
        cuw_actions.remove_item_from_cart($(this).closest('.cuw-products'), $(this).closest('.cuw-product'));
    });

    $(document).on("click", ".cuw-offer input[type=checkbox], .cuw-offer button", function () {
        cuw_actions.add_offer_to_cart($(this).closest('.cuw-offer'));
    });

    $(document).on("click", ".cuw-action input[type=checkbox], .cuw-action button", function () {
        cuw_actions.perform_action($(this).closest('.cuw-action'));
    });

    $(document).on("click", ".cuw-products .cuw-add-to-cart", function () {
        cuw_actions.add_products_to_cart($(this).closest(".cuw-products"), $(this).data('force') == '1');
    });

    $(".cuw-page .cuw-qty").change(function(){
        $(".cuw-page .cuw-qty").val($(this).val());
        $('.cuw-hidden-product-quantity').val($(this).val());
    }).trigger('change');

    $(".cuw-page .variant-select").change(function(){
        $(".cuw-page .variant-select").val($(this).val());
        $('.cuw-hidden-product-variant').val($(this).val());
    }).trigger('change');

    $(".cuw-page-offer-form, .cuw-page-offer-accept").submit(function() {
        cuw_spinner.show($(this));
        cuw_page_action_performing = true;
    });

    $(".cuw-offer-decline-link").click(function () {
        cuw_page_action_performing = true;
    });

    $(document.body).on('click', '.cuw-custom-trigger', function() {
        cuw_spinner.show($(this).closest('.cuw-modal').find('.cuw-modal-body'));
        $($(this).data('target')).trigger($(this).data('event'));
    });

    $(document.body).on('cuw_show_upsell_popup', function(event, data, element) {
        if (data.dynamic_content) {
            $.ajax({
                type: 'post',
                url: cuw_ajax_url,
                async: false,
                data: {
                    action: 'cuw_ajax',
                    method: 'get_upsell_popup',
                    campaign_id: data.campaign_id,
                    trigger: data.trigger,
                    page: data.page,
                    nonce: cuw_ajax_nonce || ""
                },
                success: function (response) {
                    if (response.data) {
                        $('body').append(response.data);
                        cuw_modal.show($('#cuw-modal-' + data.campaign_id), true);
                    }
                },
            });
        } else {
            let modal = $('#cuw-modal-' + data.campaign_id);
            modal.data('shown', true);
            cuw_modal.show(modal);
        }
    });

    $(document.body).on('checkout_error', function() {
        cuw_modal.hide('.cuw-modal');
    });

    let messages = $(".cuw-page-timer");
    if (messages.length > 0) {
        let element = messages.first();
        let message = element.data('message');
        let unique_id = new URLSearchParams(window.location.search).get('cuw_order_id');
        let duration = (element.data('minutes') * 60) + element.data('seconds'), minutes, seconds;
        if (Cookies && unique_id) {
            let duration_from_cookie = Cookies.get("cuw_timer_" + unique_id);
            if (duration_from_cookie !== undefined) {
                duration = duration_from_cookie;
            }
        }
        setInterval(function () {
            if (duration >= 0) {
                minutes = parseInt(duration / 60, 10);
                seconds = parseInt(duration % 60, 10);
                minutes = minutes < 10 ? "0" + minutes : minutes;
                seconds = seconds < 10 ? "0" + seconds : seconds;
                messages.html(message.replace('{minutes}', minutes).replace('{seconds}', seconds));
                if (duration === 0) {
                    if (!cuw_page_action_performing) {
                        window.location = element.data('redirect_to');
                    }
                }
                if (Cookies && unique_id) {
                    Cookies.set("cuw_timer_" + unique_id, duration);
                }
                duration--;
            }
        }, 1000);
    }

});