/*
 * 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 dynamicPages = [
    "notary",
    "telegram",
    "trailer",
    "moneyorder"
];
var compiledPages = {};
var pagesToCompile = [
    "home",
    "send",
    "welcome",
    "notary",
    "servicearea",
    "appointment",
    "dropandsend",
    "pickup",
    "shop",
    "shoppingcart_fragment",
    "rateresult",
    "crypto",
    "crypto_wallet",
    "account",
    "trackresult",
    "settings",
    "receipts",
    "trailer",
    "money",
    "moneyorder",
    "address_qrcode"
];
console.log("Compiling page templates...");
for (var i = 0; i < pagesToCompile.length; i++) {
    compiledPages[pagesToCompile[i]] = Template7.compile($.ajax({
        type: "GET",
        url: "./pages/" + pagesToCompile[i] + ".html",
        async: false
    }).responseText);
}
console.log("Compiled page templates.");

var routes = [
    {
        path: '/welcome',
        content: compiledPages.welcome(),
        name: 'welcome',
        on: {
            pageAfterIn: function () {

            }
        }
    },
    {
        path: '/crypto',
        name: 'crypto',
        async: function ( {resolve, reject}) {
            resolve({
                content: compiledPages.crypto({
                    slideshow: [
                        {
                            image: "assets/images/crypto/slides/intro.svg",
                            text: "Bitcoin and cryptocurrency can be complicated.  We've made it simple. Swipe left for more."
                        },
                        {
                            image: "assets/images/crypto/slides/vault.svg",
                            text: "With your Helena Express paper wallet, you can save..."
                        },
                        {
                            image: "assets/images/crypto/slides/spend.svg",
                            text: "...or spend, without worrying about hackers..."
                        },
                        {
                            image: "assets/images/crypto/slides/secure.svg",
                            text: "...because paper can't be hacked."
                        },
                        {
                            image: "assets/images/crypto/slides/scantostart.svg",
                            text: "Scan your paper wallet to get started, or order one in the shop."
                        }
                    ]
                })
            }, {});
        },
        on: {
            pageAfterIn: function () {
                app.swiper.destroy("#crypto-intro-swiper");
                app.swiper.create("#crypto-intro-swiper", {
                    pagination: {
                        el: "#crypto-intro-swiper-pagination",
                        type: "bullets",
                        clickable: true
                    }
                });
            }
        }
    },
    {
        path: '/crypto/:walletaddress/:toaddress',
        async: openWalletBalancePage,
        name: 'crypto_wallet',
        on: {
            pageAfterIn: function () {
                $("#sendCryptoOpenPopupBtn").click();
                setupReceiveFiatConversion();
            }
        }
    },
    {
        path: '/crypto/:walletaddress/:toaddress/:amount',
        async: openWalletBalancePage,
        name: 'crypto_wallet',
        on: {
            pageAfterIn: function () {
                $("#sendCryptoOpenPopupBtn").click();
                setupReceiveFiatConversion();
            }
        }
    },
    {
        path: '/crypto/:walletaddress',
        async: openWalletBalancePage,
        name: 'crypto_wallet',
        on: {
            pageAfterIn: function () {
                setupReceiveFiatConversion();
            }
        }
    },
    {
        path: '/home',
        name: 'home',
        alias: ["/"],
        on: {
            pageBeforeIn: function () {
                // make sure it's not shown right after account setup
                var accountsetup = (inStorage("accountkey") && inStorage("accountnumber"));
                if (accountsetup) {
                    $("#finishaccountsetupnag").css("display", "none");
                }
            }
        },
        async: function ( { resolve, reject }) {
            // Show a nag message if no account is set up
            var accountsetup = (inStorage("accountkey") && inStorage("accountnumber")) || getStorage("hideaccountnag") == "true";
            // add escape hatch to regular website if running online
            var escapehatch = false;
            if (window.location.hostname == "app.helena.express") {
                escapehatch = true;
            }
            resolve({
                content: compiledPages.home({
                    accountsetup: accountsetup,
                    escapehatch: escapehatch,
                    pages: [
                        {
                            title: "Send a Package",
                            href: "/send",
                            icon: "fa-duotone fa-box-alt",
                            text: "Find a drop box or schedule a pickup."
                        },
                        {
                            title: "Notarize a Document",
                            href: "/notary",
                            icon: "fa-duotone fa-file-signature",
                            text: "Book a mobile notary visit."
                        },
                        {
                            title: "Write a Telegram",
                            href: "/telegram",
                            icon: "fa-duotone fa-typewriter",
                            text: "Send a hand-delivered telegram anywhere in the Helena area."
                        },
                        {
                            title: "Shop for Supplies",
                            href: "/shop",
                            icon: "fa-duotone fa-shopping-cart",
                            text: "Get boxes, labels, and shipping supplies delivered to your door."
                        },
                        {
                            title: "Money Services",
                            href: "/money",
                            icon: "fa-duotone fa-money-bill-wave",
                            text: "Manage money orders and cryptocurrency."
                        },
                        {
                            title: "My Account",
                            href: "/account",
                            icon: "fa-duotone fa-user-circle",
                            text: "Get account number, check rewards points, update payment method, and more."
                        },
                    ]
                })
            }, {});
        }
    },
    {
        path: '/send',
        name: 'send',
        async: function ( { resolve, reject }) {
            resolve({
                content: compiledPages.send({
                    pages: [
                        {
                            title: "Use a Drop Box",
                            href: "/dropandsend",
                            icon: "fa-duotone fa-box-alt",
                            text: "Bring your package to a Drop and Send location and we'll ship it for you. No postage or appointment needed."
                        },
                        {
                            title: "Request a Pickup",
                            href: "/pickup",
                            icon: "fa-duotone fa-home",
                            text: "Leave your package on your porch and we'll pick it up and ship it for you. No postage or appointment needed."
                        },
                        {
                            title: "Visit Us",
                            href: "/trailer",
                            icon: "fa-duotone fa-caravan",
                            text: "Our Mobile Shipping Center roams the Helena area like a food truck for mail. Find dates and places here."
                        },
                        {
                            title: "Book an Appointment",
                            href: "/appointment/shipping",
                            icon: "fa-duotone fa-calendar-alt",
                            text: "A courier will come to you on your schedule. No account required."
                        }
                    ]
                })
            }, {});
        }
    },
    {
        path: '/money',
        name: 'money',
        async: function ( { resolve, reject }) {
            resolve({
                content: compiledPages.money({
                    pages: [
                        {
                            title: "Money Orders",
                            href: "/moneyorder",
                            icon: "fa-duotone fa-money-check-dollar",
                            text: "Check and verify a Helena Express money order."
                        },
                        {
                            title: "Crypto Wallet",
                            href: "/crypto",
                            icon: "fa-duotone fa-wallet",
                            text: "Check your crypto wallet balance and pay people with cryptocurrency."
                        }
                    ]
                })
            }, {});
        }
    },
    {
        path: '/moneyorder',
        content: compiledPages.moneyorder(),
        name: 'moneyorder',
        on: {
            pageBeforeIn: function () {
                dyncontent = getDynamicPageContent("moneyorder");
                if (dyncontent != null) {
                    $("#moneyorder-dyncontent").html(dyncontent);
                }
            }
        }
    },
    {
        path: '/notary',
        content: compiledPages.notary(),
        name: 'notary',
        on: {
            pageBeforeIn: function () {
                dyncontent = getDynamicPageContent("notary");
                if (dyncontent != null) {
                    $("#notary-dyncontent").html(dyncontent);
                }
            },
            pageAfterIn: function () {
                app.swiper.destroy("#notary-info-swiper");
                app.swiper.create("#notary-info-swiper", {
                    pagination: {
                        el: "#notary-info-swiper-pagination",
                        type: "bullets",
                        clickable: true
                    }
                });
            }
        }
    },
    {
        path: '/servicearea',
        content: compiledPages.servicearea(),
        name: 'servicearea',
        on: {
            pageAfterIn: function () {
                loadServiceAreaMap();
            },
            pageAfterOut: function () {
                serviceAreaMap = null;
            }
        }
    },
        {
        path: '/quicksend',
        content: compiledPages.address_qrcode(),
        name: 'quicksend'
    },
    {
        path: '/appointment',
        name: 'appointment',
        async: function ( { resolve, reject }) {
            resolve({
                content: compiledPages.appointment({
                    services: [
                        {
                            title: "Package Pickup",
                            text: "A courier will come to you and ship your mail, packages, etc.",
                            icon: "fa-duotone fa-hand-holding-box",
                            serviceid: "shipping"
                        },
                        {
                            title: "Mobile Notary",
                            text: "A notary public will come to you and notarize your documents.",
                            icon: "fa-duotone fa-file-signature",
                            serviceid: "notary"
                        }
                    ]
                })
            }, {
            });
        },
        routes: [
            {
                path: "/:serviceId",
                async: function ( { resolve, reject, to }) {
                    var url = SETTINGS.apis.appointmentredirect + "?service=" + to.params.serviceId;
                    if ($("body").hasClass("dark")) {
                        url += "&darkmode=1";
                    }
                    resolve({
                        content: compiledPages.appointment({
                            url: url,
                            serviceid: to.params.serviceId
                        })
                    }, {
                    });
                }
            }
        ]
    },
    {
        path: '/dropandsend',
        name: 'dropandsend',
        content: compiledPages.dropandsend(),
        on: {
            pageBeforeIn: function () {
                checkIfAccountGoodWithPaymentMethod(function (ok) {
                    if (!ok) {
                        $("#addPaymentMethodNag").css("display", "");
                    }
                }, function (error) {
                    $("#addPaymentMethodNag").css("display", "");
                });
                var dayofweek = formatTimestamp("l");
                switch (dayofweek) {
                    case "Saturday":
                    case "Sunday":
                        $("#pickupWeekendWarning").css("display", "");
                        break;
                }
                var hourofday = formatTimestamp("H");
                if (hourofday > 12 + 4) {
                    $("#pickupLateInDayWarning").css("display", "");
                }
            },
            pageAfterOut: function () {
                dropboxMap = null;
            }
        }
    },
    {
        path: '/pickup',
        name: 'pickup',
        async: function ( {resolve}) {
            resolve({
                content: compiledPages.pickup({
                    streetaddress: inStorage("lastpickupaddress") ? getStorage("lastpickupaddress") : "",
                    zipcode: inStorage("lastpickupzipcode") ? getStorage("lastpickupzipcode") : ""
                })
            }, {});
        },
        on: {
            pageBeforeIn: function () {
                checkIfAccountGoodWithPaymentMethod(function (ok) {
                    if (!ok) {
                        $("#addPaymentMethodNag").css("display", "");
                    }
                }, function (error) {
                    $("#addPaymentMethodNag").css("display", "");
                });
                var dayofweek = formatTimestamp("l");
                switch (dayofweek) {
                    case "Saturday":
                    case "Sunday":
                        $("#pickupWeekendWarning").css("display", "");
                        break;
                }
                var hourofday = formatTimestamp("H");
                if (hourofday > 12 + 4) {
                    $("#pickupLateInDayWarning").css("display", "");
                }
            }
        }
    },
    {
        path: '/shop',
        name: 'shop',
        async: loadShopPage,
        on: {
            pageBeforeIn: function () {
                checkIfAccountGoodWithPaymentMethod(function (ok) {
                    if (!ok) {
                        $("#addPaymentMethodNag").css("display", "");
                    }
                }, function (error) {
                    $("#addPaymentMethodNag").css("display", "");
                });
                updateCart();
            }
        }
    },
    {
        path: '/trailer',
        name: 'trailer',
        async: function ( {resolve, reject}) {
            app.dialog.preloader("Checking the schedule...");
            apirequest(SETTINGS.apis.trailerschedule, [], function (resp) {
                app.dialog.close();

                resolve({
                    content: compiledPages.trailer({
                        schedule: resp
                    })
                }, {});
            }, function (error) {
                app.dialog.close();
                app.dialog.alert("Couldn't get the latest schedule. Try again later.", "Whoops!");
                sendErrorReport("Trailer", "Loading schedule");
                resolve({
                    content: compiledPages.trailer({
                        schedule: []
                    })
                }, {});
            }, "GET");
        },
        on: {
            pageBeforeIn: function () {
                dyncontent = getDynamicPageContent("trailer");
                if (dyncontent != null) {
                    $("#trailer-dyncontent").html(dyncontent);
                }
            }
        }
    },
    {
        path: '/telegram',
        name: 'telegram',
        url: './pages/telegram.html',
        on: {
            pageBeforeIn: function () {
                checkIfAccountGoodWithPaymentMethod(function (ok) {
                    if (!ok) {
                        $("#addPaymentMethodNag").css("display", "");
                    }
                }, function (error) {
                    $("#addPaymentMethodNag").css("display", "");
                });
                dyncontent = getDynamicPageContent("telegram");
                if (dyncontent != null) {
                    $("#telegram-dyncontent").html(dyncontent);
                }
            }
        }
    },
    {
        path: '/track',
        url: './pages/track.html',
        name: 'track',
        on: {
            pageBeforeIn: function () {
                addTrackingSuggestions();
                $("#trackingcode").val("0");
                app.input.validate("#trackingcode");
                $("#trackingcode").val("");
            }
        }
    },
    {
        path: '/rates',
        url: './pages/rates.html',
        name: 'rates',
        on: {
            pageAfterIn: function () {
                initRateForm();
            }
        }
    },
    {
        path: '/account',
        name: 'account',
        content: compiledPages.account(),
        on: {
            pageAfterIn: function () {
                initAccountPage();
            }
        }
    },
    {
        path: '/track/:code',
        name: 'trackresult',
        async: trackOpenAsync,
        on: {
            pageAfterIn: function () {
                var mapboxel = document.getElementById("mapbox-track");
                var trackingMap = new MapControl(mapboxel, false);
                trackingMap.reloadMap();
                var latitude = $(mapboxel).data("latitude");
                var longitude = $(mapboxel).data("longitude");
                var accurate = $(mapboxel).data("accurate") == true;
                trackingMap.clearMarkersAndCenterMapOnNewMarker("package-marker", latitude, longitude, accurate);
            }
        }
    },
    {
        path: '/receipts',
        name: 'receipts',
        async: function ( {resolve, reject}) {
            app.dialog.preloader("Loading...");
            apirequest(SETTINGS.apis.getreceipts, {
                accountnumber: getStorage("accountnumber"),
                accountkey: getStorage("accountkey")
            }, function (success) {
                app.dialog.close();
                if (success.status == "OK") {
                    var receipts = success.receipts;
                    if (receipts.length == 0) {
                        receipts = false;
                    }
                    resolve({
                        content: compiledPages.receipts({
                            receipts: receipts
                        })
                    });
                } else {
                    app.dialog.alert(success.msg, "Error");
                    sendErrorReport("Receipts", "Loading receipt list", success.msg);
                    reject();
                }
            }, function (xhr, status, error) {
                app.dialog.close();
                app.dialog.alert("There's a server or network problem. Check your Internet connection or try again later.", "Error");
                sendErrorReport("Receipts", "Couldn't load receipts", "Server/network problem: " + xhr.status + ": " + xhr.statusText);
                reject();
            }, "POST");
        }
    },
    {
        path: '/credits',
        url: './pages/credits.html',
        name: 'credits'
    },
    {
        path: '/settings',
        name: 'settings',
        async: function ( {resolve}) {
            var settings = [];
            settings.push(
                    {
                        setting: "display",
                        title: "Display and Appearance",
                        text: "",
                        onclick: "router.navigate('/settings/display')",
                        link: true
                    }
            );

            settings.push(
                    {
                        setting: "resetaccount",
                        title: "Forget Account",
                        text: "Log out and disconnect from your Helena Express account.",
                        onclick: "resetAccountPrompt()",
                        link: true
                    },
                    {
                        setting: "versions",
                        title: "Helena Express app v" + app_version,
                        text: "Copyright &copy; 2019-2022 Helena Express and Netsyms Technologies.",
                        onclick: ""
                    },
                    {
                        setting: "opensource",
                        title: "Credits and open source info",
                        text: "",
                        onclick: "router.navigate('/credits')",
                        link: true
                    },
                    {
                        setting: "legal",
                        title: "Terms of Use and Privacy Policy",
                        text: "",
                        onclick: "openBrowser('https://helena.express/appterms?mtm_campaign=HelenaExpressApp')",
                        link: true
                    },
                    {
                        setting: "analytics",
                        title: "Analytics",
                        text: "If turned on, we'll collect some anonymous information to help improve the app. It is not sent to any third parties.",
                        toggle: true,
                        checked: getStorage("analytics") !== "false",
                        onclick: ""
                    }, );
            resolve({
                content: compiledPages.settings({
                    page_title: "Settings",
                    settings: settings
                })
            });
        },
        routes: [
            {
                path: '/display',
                name: 'settings',
                async: function ( {resolve}) {
                    var settings = [
                        {
                            setting: "apptheme",
                            title: "Color theme",
                            select: true,
                            options: [
                                {
                                    value: "auto",
                                    label: "Auto",
                                    selected: getStorage("apptheme") == null || getStorage("apptheme") == "auto"
                                },
                                {
                                    value: "dark",
                                    label: "Dark",
                                    selected: getStorage("apptheme") == "dark"
                                },
                                {
                                    value: "light",
                                    label: "Light",
                                    selected: getStorage("apptheme") == "light"
                                }
                            ]
                        },
                        {
                            setting: "animation",
                            title: "Animations",
                            select: true,
                            options: [
                                {
                                    value: "auto",
                                    label: "On",
                                    selected: getStorage("animation") == null || getStorage("animation") == "auto" || getStorage("animation") == "on"
                                },
//                                {
//                                    value: "on",
//                                    label: "On",
//                                    selected: getStorage("animation") == "on"
//                                },
                                {
                                    value: "off",
                                    label: "Off",
                                    selected: getStorage("animation") == "off"
                                }
                            ]
                        },
                        {
                            setting: "hideaccountnag",
                            title: "Hide \"Finish Account Setup\"",
                            text: "",
                            toggle: true,
                            checked: getStorage("hideaccountnag") == "true",
                            onclick: ""
                        }
                    ];
                    resolve({
                        content: compiledPages.settings({
                            page_title: "Display Settings",
                            settings: settings
                        })
                    });
                }
            }
        ]
    }
];
