// Wrapper jQuery
(function ($) {
    loadMasks();
    OembedParse();
})(jQuery);

function OembedParse() {
    $('oembed').each(function () {
        id = YoutubeId($(this).attr('url'));
        if (id.length) {
            $(this).parent().after('<div class="oembed"><iframe width="560" height="315" src="https://www.youtube.com/embed/' + id + '" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>');
        }
    });
}

function YoutubeId(url) {
    var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
    var match = url.match(regExp);

    if (match && match[2].length == 11) {
        return match[2];
    } else {
        return 'error';
    }
}

function loadMasks() {
    $('.maskCreditCard').mask("0000 0000 0000 0000");
    $('.maskCvv').mask("0000");
    $('.maskDecimal').mask("#.##0,00", {reverse: true, placeholder: "0,00"});
    $('.maskCnpj').mask("00.000.000/0000-00");
    $('.maskCpf').mask("000.000.000-00");
    $('.maskRg').mask("00.000.000-A");
    $('.maskCep').mask("00000-000");
    $('.maskPlaca').mask("SSS 0000");
    $('.maskInteger').mask("#", {reverse: true});
    $('.maskDate').mask("00/00/0000", {placeholder: "__/__/____"});
    $('.maskYear').mask("0000");
    $('.maskTime').mask("00:00");
    var maskBehavior = function (val) {
        return val.replace(/\D/g, '').length === 11 ? '(00) 00000-0000' : '(00) 0000-00009';
    };
    $('.maskPhone').mask(maskBehavior, {
        onKeyPress: function (val, e, field, options) {
            field.mask(maskBehavior.apply({}, arguments), options);
        }
    });
    // Se tiver o plugin DateRangePicker
    if ($.fn.daterangepicker) {
        $('.maskDate').each(function () {
            $(this).daterangepicker({
                autoUpdateInput: false,
                singleDatePicker: true,
                locale: {
                    applyLabel: 'Aplicar',
                    cancelLabel: 'Cancelar'
                }
            });
            $(this).on('apply.daterangepicker', function (ev, picker) {
                $(this).val(picker.startDate.format('DD/MM/YYYY'));
            });
            $(this).on('cancel.daterangepicker', function (ev, picker) {
                $(this).val('');
            });
        });

        $('.maskDateTime').daterangepicker({
            singleDatePicker: true,
            timePicker: true,
            timePicker24Hour: true,
            timePickerIncrement: 5,
            locale: {
                format: 'DD/MM/YYYY HH:mm',
                applyLabel: 'Aplicar',
                cancelLabel: 'Cancelar'
            }
        });
    }
}

function ProgressiveLoad() {
    $('.progressive-load:not(.loaded) .final').imgpreload({
        each: function () {
            // console.log($(this));
            $(this).parents('.progressive-load').addClass('loaded');
        }
    });
}

function ScrollTo(selector, options) {
    const defaults = {
        scrooler: 'html, body',
        closeSideBar: false,
        offset: 0,
        offsetSpeed: 125,
        insertHash: false,
        callback: null
    };
    const params = $.extend({}, defaults, options);
    const root = $(params.scrooler);
    const element = selector.jquery ? selector : $(selector);
    const hash = element.attr('id') || null;

    if (element.length) {
        let offset = element.offset().top;
        let delta = Math.abs(window.scrollY - offset);
        let ratio = delta * 0.35;
        let time = ratio < 500 ? 500 : ratio;

        // Hash faz a pagina pular, se quiser adicionar um offset tem que ajustar depois de mudar o Hash
        if (params.insertHash && hash) {
            root.stop().animate({scrollTop: offset}, time, 'swing', function () {
                window.location.hash = `#${selector}`;
                if (params.offset) {
                    root.animate({scrollTop: offset + params.offset}, params.offsetSpeed, 'linear', () => {
                        // callback
                    });
                }
            });
        } else {
            root.animate({scrollTop: offset + params.offset}, params.offsetSpeed, 'linear', () => {
                setTimeout(() => {
                    typeof params.callback == 'function' ? params.callback() : null;
                }, 100)
            });
        }
    }

    params.closeSideBar ? cartMenuClose() : null;
}

function TestAjax(e) {
    e.preventDefault();
    save({
        form: '#test-form'
    });
}

bindTooltips = () => {
    $('[data-toggle="tooltip"]').tooltip({
        html: true,
        container: 'body'
    });
}

/* ecommerce */
cartMenuToggle = () => {
    let body = $(document.body);
    body.hasClass('cart-menu-open') ? cartMenuClose() : cartMenuOpen();
}

cartMenuOpen = () => {
    let body = $(document.body);
    if (!body.hasClass('cart-menu-open')) {
        body.addClass('cart-menu-open').append();

        // let parent = $('.mm-page').length ? $('.mm-page') : body;
        let parent = body;
        $(`<div class="modal-backdrop show cart-backdrop" onclick="cartMenuClose()"/>`).appendTo(parent);
    }
}

cartMenuClose = (preventReload) => {
    let body = $(document.body);
    body.removeClass('cart-menu-open');

    $('.modal-backdrop').remove();
    if (window.location.href.indexOf(URL_SITE + '/checkout') > -1) {
        if (!preventReload) {
            location.reload();
            block({
                text: 'Calculando formas de envio'
            });
        }
    }
}

cartBadgeRefresh = () => {
    callMethod({
        module: 'ecommerce',
        component: 'cart',
        method: 'print_items',
        onSuccess: (data, text, xhr) => {
            let response = ParseHeader(xhr);
            cartBadge(response.cart);
        }
    });
}

cartBadge = (items) => {
    let counter = $('.cart-items-count');
    if (items > 0) {
        ToggleVisibilityShow(counter);
        counter.text(items);
    } else {
        ToggleVisibilityHide(counter);
    }
}

cartMenuReload = (preventOpen) => {
    let wrapper = $('#cart-menu');
    callMethod({
        container: wrapper,
        module: 'ecommerce',
        component: 'cart',
        method: 'cart_menu',
        beforeSubmit: () => {
            if (!preventOpen) {
                cartMenuOpen();
            }
            ShowLoading(wrapper, 'absolute-middle');
        },
        onError: (data, text, xhr) => {
            let response = ParseHeader(xhr);
            alerta(response.message);
        },
        onSuccess: (data, text, xhr) => {
            let response = ParseHeader(xhr);
            cartBadge(response.cart);
        }
    });
}

cartAdd = (product, variant, qtd, preview, recurrent) => {
    let errors = [];
    // check variants
    if ($('#product-variants').length) {
        $('#product-variants').find('.option').each(function () {
            let option = $(this);
            if (!$(this).find('.item.selected').length) {
                errors.push('É Necessário escolher a opção: ' + option.data('title'));
            }
        });
        if (errors.length) {
            alerta(errors.join('<br>'));
            return false;
        }
    }

    // params
    let params = {
        product: product || $('#input-product').val(),
        variant: variant || $('#input-variant').val(),
        quantity: qtd || $('#input-qtd').val(),
        preview: preview || $('#input-preview').val(),
        recurrent: recurrent || null
    };

    // send
    getJSON({
        router: 'ecommerce/cart/add',
        params,
        onError: response => {
            alerta(response.message);
        },
        onSuccess: response => {
            closeLastDialog();
            if (response.alert) {
                alerta(response.alert);
            }

            cartMenuReload();
            if (response.preview) {
                closeLastDialog();
            }

            // eventos
            sendEvents(response.events || null);
        }
    })
}

cartQtd = (key, direction, qtd) => {
    getJSON({
        router: 'ecommerce/cart/qtd',
        params: {key, direction, qtd},
        onError: response => {
            alerta(response.message);
        },
        onSuccess: response => {
            cartMenuReload();
            if (response.pack) {
                packCartReload(response.pack);
            }
        }
    })
}

cartRemove = key => {
    getJSON({
        router: 'ecommerce/cart/remove',
        params: {key},
        onError: json => {
            alerta(json.message);
        },
        onSuccess: json => {
            if (json.cross) {
                let products = '';
                json.products.forEach(value => {
                    products += `<p class="mb-0 font-14 pl-2">- ${value}</p>`
                });
                BSConfirm({
                    message: `<p class="mb-2 pl-2">Excluir este produto irá remover também:</p> ${products}`,
                    callback: () => {
                        crossRemove(key);
                    }
                });
                return;
            }

            // reload
            cartMenuReload();

            // pack
            json.pack ? packCartReload(json.pack) : null;

            // eventos
            sendEvents(response.events || null);
        }
    })
}

crossRemove = key => {
    getJSON({
        router: 'ecommerce/cart/remove_cross',
        params: {key},
        onError: json => {
            alerta(json.message);
        },
        onSuccess: json => {
            // reload
            cartMenuReload();

            // eventos
            sendEvents(response.events || null);
        }
    })
}

cartPackQtd = (key, direction, qtd) => {
    getJSON({
        router: 'promo/pack/cart_qtd',
        params: {key, direction, qtd},
        onError: response => {
            alerta(response.message);
        },
        onSuccess: response => {
            cartMenuReload();
        }
    });
}

cartPackRemove = (key) => {
    getJSON({
        router: 'promo/pack/cart_remove',
        params: {key},
        onError: response => {
            alerta(response.message);
        },
        onSuccess: response => {
            cartMenuReload();
        }
    })
}

cartCheckout = () => {
    crossSelling()
        .then(response => {
            if (response.cross) {
                cartMenuClose(true);
                crossSellingDialog();
            } else {
                cartMenuClose();
                location.href = `${URL_SITE}/checkout`;
            }
        })
        .catch(response => {
            error(response.message);
        })
}

crossSelling = () => {
    return new Promise((resolve, reject) => {
        getJSON({
            router: 'ecommerce/cross',
            onError: response => {
                reject(response);
            },
            onSuccess: response => {
                resolve(response);
            }
        });
    });
}

crossSellingDialog = () => {
    BSDialog({
        module: 'catalog',
        component: 'product',
        file: 'dialog/cross',
        width: 1000,
        addClass: 'header-none footer-none',
        onHide: () => {
            location.href = `${URL_SITE}/checkout`
        }
    });
}

productDialog = (product, variant, params, object) => {
    event.preventDefault();
    event.stopPropagation();
    let cache = {
        url: location.href,
        title: document.title
    };

    BSDialog({
        title: 'Visualização Rápida',
        module: 'catalog',
        component: 'product',
        file: 'dialog/product',
        width: 950,
        params: {product, variant, params},
        addClass: 'modal-ficha-tecnica',
        close_btn: false,
        onClose: () => {
            // restore state
            window.history.pushState({}, 'push state', cache.url);
            document.title = cache.title;
            $('html, body').removeClass('slidebar-fix');
        }
    });

    // push state
    if (typeof object.url != 'undefined') {
        window.history.pushState({}, 'push state', object.url);
        document.title = object.title;
    }
}

sendEvents = events => {
    let facebookPixel = events && events.pixel ? events.pixel : null;
    let googleGtag = events && events.gtag ? events.gtag : null;
    let googleGtm = events && events.gtm ? events.gtm : null;

    if (facebookPixel && typeof fbq == "function") {
        console.log(facebookPixel);
        fbq('track', facebookPixel.event, facebookPixel.content);
    }

    if (googleGtag && typeof gtag == "function") {
        gtag('event', googleGtag.event, googleGtag.content);
    }

    if (googleGtm) {
        window.dataLayer = window.dataLayer || [];
        window.dataLayer.push(googleGtm);
    }
}