/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

var shopitems = [];
var shopitems_flattened = [];
var samedaydeliveryfee = 10.0;

function loadShopPage( {resolve, reject}) {
    app.dialog.preloader("Opening the shop...");
    apirequest(SETTINGS.apis.shopitems, [], function (resp) {
        app.dialog.close();
        shopitems = resp.items;
        samedaydeliveryfee = resp.samedaydeliveryfee;
        for (var cat in shopitems) {
            for (var i in shopitems[cat]["items"]) {
                shopitems_flattened[i] = shopitems[cat]["items"][i];
            }
        }
        resolve({
            content: compiledPages.shop({
                items: shopitems
            })
        }, {});
    }, function (error) {
        app.dialog.close();
        app.dialog.alert("Couldn't open the shop right now. Try again later.", "Whoops!");
        sendErrorReport("Shop", "Opening shop");
        reject();
    });
}

$("body").on("card:opened", ".shop-item-card", function () {
    app.swiper.destroy("#swiper-" + $(this).data("sku"));
    app.swiper.create("#swiper-" + $(this).data("sku"), {
        pagination: {
            el: "#swiper-pagination-" + $(this).data("sku"),
            type: "bullets"
        }
    });
});

var shoppingcart = {};

if (inStorage("shoppingcart")) {
    shoppingcart = JSON.parse(getStorage("shoppingcart"));
}

function addToCart(sku, qty) {
    if (typeof qty == 'undefined') {
        qty = 1;
    }
    if (shoppingcart[sku]) {
        shoppingcart[sku] += qty;
    } else {
        shoppingcart[sku] = qty;
    }
    app.toast.show({
        icon: "<i class='far fa-cart-plus fa-2x'></i>",
        text: "Added to cart!",
        position: "center",
        horizontalPosition: "center",
        closeTimeout: 2000,
        destroyOnClose: true
    });
    updateCart();

    sendActionReport("Shop", "Add to cart", sku + ", " + qty);
}

function removeFromCart(sku, qty) {
    // If no qty set, delete them all
    if (typeof qty == "undefined") {
        qty = 99999;
    }
    if (shoppingcart[sku]) {
        shoppingcart[sku] -= qty;
    }
    if (shoppingcart[sku] <= 0) {
        delete shoppingcart[sku];
    }
    updateCart();
    sendActionReport("Shop", "Remove from cart", sku + ", " + qty);
}

function emptyShoppingCart() {
    shoppingcart = {};
    updateCart();
}

function updateCart() {
    setStorage("shoppingcart", JSON.stringify(shoppingcart));
    var totalitems = 0;
    for (var sku in shoppingcart) {
        totalitems += shoppingcart[sku];
    }
    $("#shopping-cart-items-chip-label").text(totalitems + "");

    var cartitems = [];
    for (var sku in shoppingcart) {
        var item = shopitems_flattened[sku];
        item.qty = shoppingcart[sku];
        item.linetotal = (item.qty * item.price).toFixed(2);
        cartitems.push(item);
    }

    $("#shoppingCartContainer").html(compiledPages.shoppingcart_fragment({
        cartitems: cartitems
    }));
}

function openShopCheckout() {
    // Check if order is mailable or not by checking each item for mailability
    // Also check if all items are still in stock (cart could have sat around a while)
    var ordermailable = true;
    var orderinstock = true;
    var ordertotal = 0.0;
    var outofstockitems = [];
    for (var sku in shoppingcart) {
        if (shopitems_flattened[sku].mailable != true) {
            ordermailable = false;
        }
        if (shopitems_flattened[sku].instock != true) {
            orderinstock = false;
            outofstockitems.push(shopitems_flattened[sku].name);
        }
        ordertotal += (shopitems_flattened[sku].price * shoppingcart[sku]);
    }

    if (!orderinstock) {
        if (outofstockitems.length == 1) {
            app.dialog.alert("The following item is out of stock. Remove it from your cart to complete your order.<br><br>" + outofstockitems[0], "Out of Stock!");
        } else {
            app.dialog.alert("The following items in your cart are out of stock. Remove them from your cart to complete your order.<br><br>" + outofstockitems.join("<br>"), "Out of Stock!");
        }
        return;
    }

    if (ordermailable) {
        app.dialog.create({
            title: 'Checkout',
            text: "Your order can be either mailed to you (1-5 days) or delivered same-day. Either way, it will be sent to your account's address. Your saved payment method will be charged for $" + ordertotal.toFixed(2) + " plus any delivery fee when your order ships.",
            buttons: [
                {
                    text: 'Mail (free)'
                },
                {
                    text: 'Same-day delivery ($' + samedaydeliveryfee.toFixed(2) + ')'
                },
                {
                    text: 'Cancel Checkout',
                    color: "red"
                }
            ],
            verticalButtons: true,
            onClick: function (dialog, index) {
                switch (index) {
                    case 0:
                        placeOrder("mail", ordertotal);
                        break;
                    case 1:
                        placeOrder("courier", ordertotal + samedaydeliveryfee);
                        break;
                }
            }
        }).open();
    } else {
        app.dialog.create({
            title: 'Checkout',
            text: "Your order will be delivered to your account's address. Your saved payment method will be charged for $" + (ordertotal + samedaydeliveryfee).toFixed(2) + " (including delivery fee) when your order ships.",
            buttons: [
                {
                    text: 'Confirm Order'
                },
                {
                    text: 'Cancel Checkout',
                    color: "red"
                }
            ],
            verticalButtons: true,
            onClick: function (dialog, index) {
                switch (index) {
                    case 0:
                        placeOrder("courier", ordertotal + samedaydeliveryfee);
                        break;
                    case 1:
                        break;
                }
            }
        }).open();
    }
}

function placeOrder(deliverymethod, ordertotal) {
    app.dialog.preloader("Placing order...");
    apirequest(SETTINGS.apis.shopbuy, {
        cart: JSON.stringify(shoppingcart),
        shipmethod: deliverymethod,
        total: (ordertotal * 1.0).toFixed(2),
        accountnumber: getStorage("accountnumber"),
        accountkey: getStorage("accountkey")
    }, function (resp) {
        app.dialog.close();
        if (resp.status == "ERROR") {
            app.dialog.alert(resp.msg, "Error");
            sendErrorReport("Shop", "Order not placed", "Server error: " + resp.msg);
            return;
        } else {
            emptyShoppingCart();
            app.dialog.alert("Your order has been received.", "Order placed!");
            app.popup.close();

            sendActionReport("Shop", "Order placed", "$" + (ordertotal * 1.0).toFixed(2));
            return;
        }
    }, function (xhr, status, error) {
        app.dialog.close();
        app.dialog.alert("Your order might not have gone through due to a network error. If you don't get a confirmation email, try again.", "Whoops!");
        sendErrorReport("Shop", "Order not placed", "Server/network problem: " + xhr.status + ": " + xhr.statusText);
    })
    console.log(deliverymethod);
    console.log(shoppingcart);
}