(function ($, dataModel) {
    "use strict";

    $("#newsletter-subscribe-form").on("submit", (e) => {
        e.preventDefault();
        if (!$(e.target).valid()) {
            return;
        }
        const newsletterSubscriptionModel = dataModel.viewModel.newsletterSubscription;
        newsletterSubscriptionModel.emailAddress = $("#newsletter-subscribe-form #EmailAddress").val();
        const saveEmailPreferencesUrl = dataModel.uris.saveEmailPreferences;
        const consultantInfo = {
            consultantId: newsletterSubscriptionModel.pwsConsultantAccountId,
            isSubscribed: true,
            consultantName: ''
        };
        newsletterSubscriptionModel.newsletters.newsletterSubscriptions.push(consultantInfo);
        newsletterSubscriptionModel.areMarketingEmailsEnabled = true;

        SHOPFRONT.UI.showSpinnerOverlay("small", "#newsletter-subscribe-btn", "after", true);

        $.post(saveEmailPreferencesUrl, { model: newsletterSubscriptionModel })
            .done(function (hasPendingOptIn) {
                if (hasPendingOptIn) {
                    $("#newsletter-subscribe-form-container").addClass("d-none");
                    $("#newsletter-subscribe-opt-in").removeClass("d-none");
                } else {
                    $("#newsletter-subscribe-form-container").addClass("d-none");
                    $("#newsletter-subscribe-success").removeClass("d-none");
                }
                const preferenceCenterUrl = dataModel.uris.emailPreferenceCenter + "?email=" + newsletterSubscriptionModel.emailAddress + "&sourceTypeId=" + newsletterSubscriptionModel.sourceTypeId;
                $("#newsletter-opt-out-btn").attr("href", preferenceCenterUrl);
            }).fail(function () {
                SHOPFRONT.UI.showAlert(dataModel.terms.newsletterSubscriptionError, "danger");
            }).always(function () {
                SHOPFRONT.UI.hideSpinnerOverlay("#newsletter-subscribe-btn");
            });
    });
}(jQuery, window.dataModel));
