'use strict';

function ShoppingCart() {
    this.panier = null;
    this.itemsToPrint = [];

    var self = this;

    this.setSubPlate = function(subPlateId, successFunction) {
        const lUrlApi = `${getRootApi()}/shoppingcart/subplate?pSubPlateId=${subPlateId}`;
        console.log(lUrlApi);

        return $.ajax({
            type: 'get',
            url: lUrlApi,
            headers: _Tokken.getHeaders()
        }).done(function (data) {
            if (successFunction) { successFunction(data); }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    };

    this.subPlate = function(plateId, successFunction) {
        const lUrlApi = `${getRootApi()}/plate/subplate?plateId=${plateId}`;
        console.log(lUrlApi);

        return $.ajax({
            type: 'get',
            url: lUrlApi,
            headers: _Tokken.getHeaders()
        }).done(function (data) {
            if (successFunction) { successFunction(data); }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    };

    this.getCurrentSubPlate = function(successFunction) {
        const lUrlApi = `${getRootApi()}plate/subplate/current`;
        console.log(lUrlApi);

        return $.ajax({
            type: 'get',
            url: lUrlApi,
            headers: _Tokken.getHeaders()
        }).done(function (data) {
            if (successFunction) { successFunction(data); }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    };

    this.getPanier = function(successFunction) {
        const lUrlApi = getRootApi() + 'shoppingcart';
        console.log(lUrlApi);

        return $.ajax({
            type: 'get',
            url: lUrlApi,
            headers: _Tokken.getHeaders()
        }).done(function (pShoppingCart) {
            self.panier = pShoppingCart;
            if (successFunction) { successFunction(pShoppingCart); }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    };

    this.getFromBarCode = function(barCode, redirect, allowAnonymous, successFunction) {
        // const lUrlApi = getRootApi() + 'shoppingcart/' + barCode?pAllowAnonymous=;
        const lUrlApi = `${getRootApi()}shoppingcart/${barCode}?pWithAdmissionInfo=true&pAllowAnonymous=${allowAnonymous}&pGrouped=false`;
        console.log(lUrlApi);

        return $.ajax({
            type: 'get',
            url: lUrlApi,
            headers: _Tokken.getHeaders()
        }).done(function (pShoppingCart) {
            if (!allowAnonymous) {
                if ((!_ShoppingCartInfoBase.customerId || _ShoppingCartInfoBase.customerId <= 0) && !_ShoppingCartInfoBase.isAnonymous) {
                    window.location.href = 'login.aspx';
                    return;
                }

                if ((_ShoppingCartInfoBase.customerId !== pShoppingCart.person.customerId) && !_ShoppingCartInfoBase.isAnonymous) {
                    if (_CallbackError) {
                        const errorMsg = (langue === 'fr' ? 'Le membre ne correspond pas au membre de la transaction' : 'Member doesn\'t match trx member');
                        _CallbackError(errorMsg, null, null, 'errorMsg');
                        return;
                    }
                }
            }

            if (successFunction) { successFunction(pShoppingCart); }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (redirect) {
                console.log(jqXHR);
                location.href = 'member.aspx';
            }
            else if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    };

    this.finishReservation = function(successFunction) {
	    const lUrlApi = getRootApi() + 'shoppingcart/finishreservation';
	    console.log(lUrlApi);

		$.ajax({
			type: 'POST',
			url: lUrlApi,
			headers: _Tokken.getHeaders()
		}).done(function (data) {
			if (successFunction) {
				successFunction(data);
			}
		}).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    };

    /*
	M.Savoie 20220126 ajout finish sale anonymous si le panier est a 0 en mode anonime il ne créé pas le client donc pas de courriel
    */
    this.finishSaleAnonymous = function(pPinpadConfig, successFunction) {
        var lserviceUrl = getRootApi() + 'shoppingcart/finishsaleAnonymous';
        $.ajax({
            type: 'POST',
            contentType: "application/json",
            url: lserviceUrl,
            data: JSON.stringify(pPinpadConfig),
            headers: _Tokken.getHeaders()
        }).done(function (data) {
            if (successFunction) {
                successFunction(data);
            }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, "errorAPI");
            }
        });
    }

    this.finishSale = function(successFunction) {
        var lserviceUrl = getRootApi() + 'shoppingcart/finishsale';

        $.ajax({
            type: 'POST',
            contentType: "application/json",
            url: lserviceUrl,
            headers: _Tokken.getHeaders()
        }).done(function (data) {
            if (successFunction) {
                successFunction(data);
            }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    }

    this.paymentsWithBarcode = function(barCode, successFunction) {
        const lUrlApi = getRootApi() + 'shoppingcart/paymentswithbarcode';
        console.log(lUrlApi);

        $.ajax({
            type: 'POST',
            contentType: "application/json",
            url: lUrlApi,
            // async: false,
            data: JSON.stringify({"barCode": barCode}),
            headers: _Tokken.getHeaders()
        }).done(function (pShoppingCart) {
            if (successFunction) { successFunction(pShoppingCart); }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) { _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI'); }
        });
    }

    // Paiement avec un compte à recevoir...
    this.paymentWithAccount = function(pPinpadConfig, successFunction) {
        const lUrlApi = getRootApi() + 'shoppingcart/compte';
        console.log(lUrlApi);

        return $.ajax({
            type: 'POST',
            contentType: "application/json",
            url: lUrlApi,
            data: JSON.stringify(pPinpadConfig),
            headers: _Tokken.getHeaders()
        }).done(function (data) {
            if (successFunction) { successFunction(data); }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) { _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI'); }
        });
    }
    
    this.completeLogin = function(data, urlReturn) {
        localStorage.setItem('token', data);
        document.cookie = 'token=' + data + ';path=/;samesite=strict;max-age=' + (60 * 15);

        // Si le id existe dans le url, on le récupère
        let lUrlApi = getRootApi() + 'ShoppingCart/login';
        console.log(lUrlApi);

        $.ajax({
            type: 'POST',
            url: lUrlApi,
            // async: false,
            headers: _Tokken.getHeaders()
        }).done(function (data) {
            localStorage.setItem('isLoggedIn', 'true');
            console.log("===== LOGIN Success =====");
            if (urlReturn && urlReturn !== '') {
                window.location.href = urlReturn;
            }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            jqXHR = langue === 'fr' ? jqXHR.responseJSON.messageFR : jqXHR.responseJSON.messageEN;

            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, "errorAPI");
            }
        });
    };

    // Fonction de connection avec validation
    this.login = function(username, password, urlReturn) {
        if (_Tokken.getToken() !== '' && _ShoppingCartInfoBase.isLogin === true){
            _Tokken.loginAnonimous();
        }

        if (_Tokken.getToken() !== ''){
            let lUrlApi = getRootApi() + 'tokken/withtoken';
            console.log(lUrlApi);
            const data = {
                userName: username,
                passWord: password
            };

            $.ajax({
                type: 'POST',
                contentType: "application/json",
                url: lUrlApi,
                data: JSON.stringify(data),
                headers: _Tokken.getHeaders()
            }).done(function (data) {
                localStorage.setItem('token', JSON.stringify(data)); // write
                document.cookie = 'token=' + JSON.stringify(data) + ';path=/;samesite=strict;max-age=' + (60 * 15);
                // Si le id existe dans le url, on le récupère
                lUrlApi = getRootApi() + 'ShoppingCart/login';
                console.log(lUrlApi);

                $.ajax({
                    type: 'POST',
                    url: lUrlApi,
                    headers: _Tokken.getHeaders()
                }).done(function (data) {
                    console.log("===== Success =====");
                    localStorage.setItem('isLoggedIn', 'true');
                    // window.location.href = urlReturn;
                    self.checkForWarning(data, urlReturn);
                }).fail(function (jqXHR, textStatus, errorThrown) {
                    $("input").prop('disabled', false);
                    $("button").prop('disabled', false);

                    if (_CallbackError) {
                        _CallbackError(jqXHR, textStatus, errorThrown, "errorAPI");
                    }
                });
            }).fail(function (jqXHR, textStatus, errorThrown) {
                $("input").prop('disabled', false);
                $("button").prop('disabled', false);

                if (_CallbackError) {
                    _CallbackError(jqXHR, textStatus, errorThrown, "errorAPI");
                }
            });
        }
    };

    this.checkForWarning = function(data, urlReturn) {
        const container = document.querySelector('.modal-update-dateofbirth');

        if (container && _CONTENT_CONFIG.memberSettings.isBirthdayRequired && data?.dateOfBirth == "1900-01-01T00:00:00") {           
            const element = container.querySelector('#dateOfBirth');
            container.querySelector('.btn-save-birthday').removeAttribute('disabled');

            const tBirthday = data.dateOfBirth.substr(0, 10);
            document.querySelector('.invalid-birthday-text').innerHTML = (langue === 'fr' ? `Votre date de naissance (${tBirthday}) n'est pas valide veuillez la mettre à jour.` : `Your birthday (${tBirthday}) is not valid please update it.`);

            datebox = new DevExpress.ui.dxDateBox(element, {
                adaptivityEnabled: true,
                placeholder: (langue === 'fr' ? 'JJ/MM/AAAA' : 'MM/JJ/YYYY'),
                acceptCustomValue: false,
                openOnFieldClick: true,
                max: new Date(),
                type: "date",
                onValueChanged:function(e) {
                    element.closest('.form-group').querySelector('label').classList.remove('is-invalid');
                    element.classList.remove('is-invalid');
                    document.querySelector('#dateOfBirth-error').style.display = 'none';
                }
            });

            $('.modal-update-dateofbirth .btn-save-birthday').off('click').on('click', function() {
                if (datebox) {
                    const bDayValue = datebox.option('value');
                    if (bDayValue === null || bDayValue === '') {
                        const el = document.querySelector('#dateOfBirth')
                        el.closest('.form-group').querySelector('label').classList.add('is-invalid');
                        el.classList.add('is-invalid');
                        document.querySelector('#dateOfBirth-error').style.display = 'block';
                    } else {
                        showLoading(function() {
                            data.dateOfBirth =  datebox.option('value');
                            _Customer.updateCustomer(data, () => {
                                displayMsg(
                                    (langue === 'fr' ? 'Succès !' : 'Success !'),
                                    (langue === 'fr' ? 'Votre date de naissance à été modifiée' : 'Your birthday have been updated'),
                                    null,
                                    SUCCESS_MSG
                                );

                                setTimeout(function(){ window.location.href = urlReturn; }, 5000);

                                window.location.href = urlReturn;
                            });
                        });
                    }
                }
            });

            $('.modal-update-dateofbirth').modal('show');
            loadPanel.hide();

            return;
        }

        let lWarningMessage = '';
        if (data && data.warnings && data.warnings.length > 0) {
            const wLen = data.warnings.length;
            for (let x = 0; x < wLen; x++) {
                const lWarning = data.warnings[x];
                lWarningMessage += (langue === 'fr' ? lWarning.messageFR : lWarning.messageEN) + "<br>";

                if (lWarning.id =='1001'){
                    lWarningMessage = _MSG_messageId1001;
                }
            }
        }

        if (lWarningMessage !== '') {
            $('.modal-have-reservation .btn-continue').off('click').on('click', function() {
                window.location.href = urlReturn;
            });

            document.querySelector('.modal-have-reservation .btn-continue').removeAttribute('disabled');
            document.querySelector('.modal-have-reservation .btn-go-to-reservation').removeAttribute('disabled');

            $('.modal-have-reservation .modal-body').html(lWarningMessage);
            $('.modal-have-reservation').modal('show');

            loadPanel.hide();
        } else if (urlReturn && urlReturn !== '') {
            window.location.href = urlReturn;
        }
    };

    // Fonction de suppression de tous les items du panier d'achat
    this.clear = function() {
        const lUrlApi = getRootApi() + 'shoppingcart/clear/';
        console.log(lUrlApi);

        return $.ajax({
            type: 'GET',
            contentType: "application/json",
            url: lUrlApi,
            headers: _Tokken.getHeaders()
        }).done(function () {
            window.location.reload();
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    };

    // Fonction de suppression d'un item du panier d'achat
    this.Delete = function(Guid) {
        const lUrlApi = getRootApi() + 'shoppingcart/items/delete/?guid='+Guid;
        console.log(lUrlApi);

        $.ajax({
            type: 'DELETE',
            contentType: "application/json",
            url: lUrlApi,
            // async: false,
            headers: _Tokken.getHeaders()
        }).done(function () {
            window.location.reload();
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) { _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI'); }
        });
    };

    this.changeDate = function(dataToUpdate, successFunction) {
        const lUrlApi = getRootApi() + 'shoppingcart/changedate';
        console.log(lUrlApi);

        return $.ajax({
            type: 'POST',
            url: lUrlApi,
            contentType: "application/json",
            data: JSON.stringify(dataToUpdate),
            headers: _Tokken.getHeaders()
        }).done(function (data) {
            if (successFunction) { successFunction(data); }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) { _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI'); }
        });
    }

    this.getPackageInfo = function(data, successFunction) {
        const lUrlApi = getRootApi() + 'shoppingcart/package';
        console.log(lUrlApi);

        return $.ajax({
            type: 'POST',
            url: lUrlApi,
            contentType: 'application/json',
            data: JSON.stringify(data),
            headers: _Tokken.getHeaders()
        }).done(function(data) {
            if (successFunction) { successFunction(data); }
        }).fail(function(jqXHR, textStatus, errorThrown){
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    };

    this.getEnterpriseInfo = function(successFunction) {
        const lUrlApi = getRootApi() + 'entreprise';
        console.log(lUrlApi);

        return $.ajax({
            type: 'GET',
            url: lUrlApi,
            headers: _Tokken.getHeaders()
        }).done(function(data) {
            if (successFunction) { successFunction(data); }
        }).fail(function(jqXHR, textStatus, errorThrown){
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    };

    this.getShoppingCartRetrieveReservations = function(barCode, callbackView, CallbackError) {
        const lUrlApi = getRootApi() + 'shoppingcart/reservations/' + barCode;
        console.log(lUrlApi);

        return $.ajax({
            type: 'GET',
            url: lUrlApi,
            headers: _Tokken.getHeaders()
        }).done(function (data) {
            if (callbackView) {
                callbackView(data);
            }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    }

    this.doVersement = function(transactionId, successFunction) {
        const lUrlApi = `${getRootApi()}versement/addtoshoppingcart?pTransactionId=${transactionId}`;
        console.log(lUrlApi);

        return $.ajax({
            type: 'POST',
            url: lUrlApi,
            headers: _Tokken.getHeaders()
        }).done(function (data) {
            if (successFunction) {
                successFunction(data);
            }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (_CallbackError) {
                _CallbackError(jqXHR, textStatus, errorThrown, 'errorAPI');
            }
        });
    }

    this.generateRecapLine = function(items, isSmall, addDownloadBtn) {
        let s = '';

        items.filter(item => item.showInShoppingCart).forEach(item => {
            let rebate = '';
            if ((typeof(item.rebate) !== 'undefined') && item.rebate.rebateId > 0) {
                rebate = '<div class="col-12 rebate">* ' + (langue === 'fr' ? 'Incluant le rabais : ' : 'Including promo : ') + item.rebate.name + '</div>';
            }

            let itemPrice = formatAmount(item.product.price.unitPrice, '$');
            let totalItemPrice = formatAmount(item.product.price.unitPrice * item.product.inventory.quantity, '$');

            if (item.product.price.hasVisualPrice) {
                itemPrice = formatAmount(item.product.price.visualPrice, '$');
                totalItemPrice = formatAmount((item.product.inventory.quantity * item.product.price.visualPrice), '$');
            }

            let lDownloadBtn = '';
            if (addDownloadBtn) {
                self.itemsToPrint.push(item);
                lDownloadBtn = `  
                    <div class="row text-right mb-4"><div class="col-12"><button class="btn btn-secondaire" onclick="printTicketTest('${item.barCode}','${item.barCodeEnc}')">${(langue === 'fr' ? 'Télécharger' : 'Download')}</button></div></div>`
            }

            s += `
                <div class="row">
                    <div class="${(isSmall ? 'col-12 col-sm-4' : 'col-12 col-sm-6 col-md-7')} text-left">
                        <div>${(langue === 'fr' ? item.product.nameFr : item.product.nameEn)} - ${(langue === 'fr' ? item.product.price.nameFr : item.product.price.nameEn)}</div>
                        <div>(${displayDateWithTime(item.product.startDate, true)})</div>                        
                    </div>
                    <div class="${(isSmall ? 'col-4 col-sm-2' : 'col-4 col-sm-2 col-md-1')} text-right">
                        <span>${item.product.inventory.quantity} x</span>
                    </div>
                    <div class="${(isSmall ? 'col-4 col-sm-3' : 'col-4 col-sm-2')} text-right">
                        <span>${itemPrice}</span>
                    </div>
                    <div class="${(isSmall ? 'col-4 col-sm-3' : 'col-4 col-sm-2')} text-right">
                        <span>${totalItemPrice}</span>
                    </div>
                    ${rebate}
                </div>
                ${lDownloadBtn}`;
        });

        return s;
    };
    
    this.generateRecapLine2 = function(items) {
        const cDate = displayDate(new Date(), true);
        let s = `
            <div class="row mb-2 bold">
                <div class="col-12">
                    ${cDate}
                </div>
            </div>`;

        let content = '';

        items.filter(item => item.showInShoppingCart).forEach(item => {
            const iDate = displayDate(item.product.startDate, true);

            if (iDate === cDate) {
                let colorCode = ' c-success ';
                if (!item.admission.valideForUse) {
                    colorCode = ' c-warning ';
                }

                if (item.admission.valideForUse && moment().isAfter(moment(item.product.startDate))) {
                    colorCode = ' c-yellow ';
                }

                content += `
                    <div class="row mb-2">
                        <div class="col-12">
                            <div class="${colorCode}">
                                ${(langue === 'fr' ? item.product.nameFr : item.product.nameEn)}
                                <br>
                                ${(langue === 'fr' ? item.product.price.nameFr : item.product.price.nameEn)} - ${displayTime(item.product.startDate)}
                                <br>
                                <a class="bold" href="seeticket.aspx?barCode=${item.barCodeEnc}&returnBarCode=${barCode}">${langue === 'fr' ? 'Voir le détail' : 'See detail'}</a>
                            </div>
                        </div>
                    </div>`;
            }
        });

        if (content === '') {
            content = `${langue === 'fr' ? 'Aucune admission disponible' : 'No admission available'}`;
        }
        return `${s}${content}`;
    };

    this.setPaymentDetail = function(data) {
        document.querySelector('.receipt-trx-number').innerHTML = data.barCode;

        document.querySelector('.receipt-date').innerHTML = moment(data.shoppingCartDate).format('DD MMMM YYYY, HH:mm');

        document.querySelector('.receipt-customer-name').innerHTML = data.person.fullName;

        if (data.person.homeAddress) {
            document.querySelector('.receipt-customer-adr1').innerHTML = data.person.homeAddress.streetAddress;

            if (data.person.homeAddress.municipality !== '' || data.person.homeAddress.stateName !== '') {
                document.querySelector('.receipt-customer-adr2').innerHTML =
                    `${data.person.homeAddress.municipality}${data.person.homeAddress.stateName !== '' ? ',' + data.person.homeAddress.stateName :''}`;
            }

            document.querySelector('.receipt-customer-adr3').innerHTML =
                `${data.person.homeAddress.zipCode}${data.person.homeAddress.countryName !== '' ? ',' + data.person.homeAddress.countryName :''}`;
        }

        if (data.payments && data.payments.length > 0) {
            document.querySelector('.receipt-card-info').innerHTML = data.payments[0].accountName + ' ' + data.payments[0].cardNumber;
        }

        document.querySelector('.receipt-tps').innerHTML = 'TPS ' + formatAmount(data.taxes[0].amountRounded, '$');
        document.querySelector('.receipt-tvq').innerHTML = 'TVQ ' + formatAmount(data.taxes[1].amountRounded, '$');
        document.querySelector('.receipt-total').innerHTML = 'Total ' + formatAmount(data.total, '$');
    };
}

const printTicketTest = function(name, barCode) {
    showLoading( _Printer.printPdf(name, barCode));   
};

const _ShoppingCart = new ShoppingCart();
