<template>
    <Form @submit="onSubmit" @invalid-submit="onInvalidSubmit" ref="theForm" v-slot="{ meta }">
        <div class="page-container-grouped-styles">
            <loadingModal ref="loadingModal" />
            <funnelHeader cmsWidgetName="FunnelHeaderWidget" />
            <vehicleBanner
                cmsWidgetName="VehicleBannerWidget"
                :displayGenericVehicleImage="false" />
            <funnelSubHeader class="mb-5" cmsWidgetName="FunnelSubHeaderWidget" />
            <div class="fade-on-route-transition sub-container make-tall">
                <cashOrInsuranceQuestion
                    ref="cashOrInsurance"
                    cmsWidgetName="CashOrInsuranceQuestionWidget"
                    v-model="isInsuranceSelected"
                    groupName="CashOrInsuranceQuestion" />
                <servicePackageQuestion
                    ref="servicePackage"
                    cashCmsWidgetName="CashServicePackageQuestionWidget"
                    insuranceCmsWidgetName="InsuranceServicePackageQuestionWidget"
                    groupName="ServicePackageQuestion"
                    :availableLineItems="availableLineItems"
                    :isInsuranceSelected="isInsuranceSelected"
                    @vapsItemsSelected="vapsItemsSelectedAction"
                    v-on="{ 'buttonEvent.openModal': openModalAction }"
                    validationRules="option-required"
                    isRequired />

                <textBlock
                    cmsWidgetName="quoteDisclaimer"
                    justifyText="left"
                    typeStyle="caption"
                    class="mt-4" />
                <contentGroupModal ref="RainDefenseModal" cmsWidgetName="RainDefenseModal" />
                <contentGroupModal ref="FrontWiperModal" cmsWidgetName="FrontWiperModal" />
                <contentGroupModal ref="RearWiperModal" cmsWidgetName="RearWiperModal" />
                <contentGroupModal ref="RecalModal" cmsWidgetName="RecalModal" />
                <funnel-footer
                    cmsWidgetName="FunnelFooterWidget"
                    :isForwardActionDisabled="!meta.valid"
                    :isBackButtonHidden="shouldHideBackButton"
                    @back-clicked="backButtonAction"
                    @ForwardClicked="forwardButtonAction" />
            </div>
        </div>
    </Form>
</template>

<script>
// Components
import funnelHeader from "@/fmg-components/funnel-header/funnel-header";
import funnelFooter from "@/fmg-components/funnel-footer/funnel-footer";
import vehicleBanner from "@/fmg-components/vehicle-banner/vehicle-banner";
import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header";
import cashOrInsuranceQuestion from "./cash-or-insurance-question/cash-or-insurance-question";
import servicePackageQuestion from "./service-package-question/service-package-question";
import textBlock from "@/digital-components/text-block/text-block";
import contentGroupModal from "@/fmg-components/content-group-modal/content-group-modal";
import loadingModal from "@/fmg-components/loading-modal/loading-modal.vue";
import baseMixin from "@/mixins/base-mixin.js";
import vehicleQuestionsMixin from "../../mixins/vehicle-questions-mixin";
import { settleAllPromises } from "@/helpers/layout-helper";
import { storeActions } from "@/constants/store-actions";
import store from "@/store";
import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
import { required } from "@/helpers/validation-rules";
import { errorMessages } from "@/constants/error-messages";
import { Form, defineRule } from "vee-validate";
import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper";
import { applicationConfig } from "@/constants/application-config";

defineRule("option-required", required(errorMessages.OPTION_REQUIRED));

export default {
    name: "quote",
    async beforeRouteEnter(to, from, next) {
        // Call APIs
        const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage);
        const wipersPromise = baseMixin.methods.dispatchStoreAction(storeActions.GET_WIPERS);
        const rainDefensePromise = baseMixin.methods.dispatchStoreAction(
            storeActions.GET_RAIN_DEFENSE
        );
        const supportingItemsPromise = baseMixin.methods.dispatchStoreAction(
            storeActions.GET_SUPPORTING_ITEMS
        );

        const promiseResultMap = [
            {
                resultKey: "cmsContent",
                promise: cmsContentPromise,
            },
            {
                resultKey: "wipers",
                promise: wipersPromise,
            },
            {
                resultKey: "rainDefense",
                promise: rainDefensePromise,
            },
            {
                resultKey: "supportingItems",
                promise: supportingItemsPromise,
            },
        ];

        const resultMap = await settleAllPromises(promiseResultMap);
        const clonedGlassParts = store.getters.order.lineItems.glassParts
            ? JSON.parse(JSON.stringify(store.getters.order.lineItems.glassParts))
            : [];
        const availableLineItems = [
            resultMap.rainDefense,
            ...resultMap.supportingItems,
            ...resultMap.wipers,
            ...clonedGlassParts,
        ];

        const pricingResults = await baseMixin.methods.dispatchStoreAction(
            storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA,
            {
                availableLineItems: availableLineItems,
            },
            false
        );

        // Call the "next" function to complete the transition to this page.
        next((vm) => {
            vm.setCmsContent(resultMap.cmsContent);
            vm.pricedGlassParts = clonedGlassParts;
            vm.supportingItems = resultMap.supportingItems;
            vm.availableLineItems = pricingResults;
            vm.isInsuranceSelected = vm.getDefaultIsInsuranceSelectedValue(vm.availableLineItems);
        });
    },
    data() {
        return {
            isInsuranceSelected: null,
            selectedVaps: null,
            availableLineItems: null,
            supportingItems: null,
            pricedGlassParts: null,
        };
    },
    methods: {
        openModalAction(modalName) {
            this.$refs[modalName].openModal();
        },
        arePagePrerequisitesValid() {
            return (
                store.getters.order.serviceLocation.zipCode &&
                store.getters.order.serviceLocation.zipCodeCtu &&
                (store.getters.order.damage.isRepair ||
                    (store.getters.order.lineItems?.glassParts != null &&
                        store.getters.order.lineItems.glassParts.length > 0)) &&
                store.getters.order.referralNumber?.length !== 6
            );
        },
        getDefaultIsInsuranceSelectedValue(availableLineItems) {
            // Override if coming back from QuoteDetails. Remove override after Quote release
            const isInsuranceOverrideValue = this.$route.query?.isInsurance;

            const defaultIsInsuranceSelectedValue = this.$store.getters.order.payment.isInsurance;
            if (isInsuranceOverrideValue != null) {
                return isInsuranceOverrideValue == "true";
            } else if (defaultIsInsuranceSelectedValue != null) {
                return defaultIsInsuranceSelectedValue;
            } else {
                return availableLineItems
                    ? baseMixin.methods.getTierOnePackagePrice(
                          baseMixin.methods.filterOutFees(availableLineItems)
                      ) > 300
                    : null;
            }
        },
        vapsItemsSelectedAction(vapsItemsSelected) {
            this.selectedVaps = vapsItemsSelected;
        },
        backButtonAction() {
            vehicleQuestionsMixin.methods.navigateBack(this);
        },
        forwardButtonAction() {
            this.dispatchStoreAction(
                this.storeActions.SAVE_PAYMENT_TYPE,
                this.isInsuranceSelected,
                false
            );

            if (!this.isInsuranceSelected) {
                this.dispatchStoreAction(
                    this.storeActions.SAVE_PARENT_ACCOUNT_NUMBER,
                    applicationConfig.CASH_PARENT_ACCOUNT_NUMBER,
                    false
                );
            }

            if (
                this.$store.getters.order.payment.parentAccountNumber !=
                applicationConfig.CASH_PARENT_ACCOUNT_NUMBER
            ) {
                this.supportingItems = this.filterOutFees(this.supportingItems);
            }

            if (this.pricedGlassParts.length > 0) {
                this.dispatchStoreAction(
                    this.storeActions.SAVE_GLASS_PART_PRICES,
                    this.pricedGlassParts,
                    false
                );
            }

            this.dispatchStoreAction(
                this.storeActions.SAVE_SUPPORTING_ITEMS,
                this.supportingItems,
                false
            );

            this.dispatchStoreAction(this.storeActions.SAVE_VAPS, this.selectedVaps, false);

            const payment = this.$store.getters.payment;
            if (payment.isInsurance) {
                navigateToHeritageFunnel({ loadingModal: this.$refs.loadingModal });
            } else {
                this.$router.navigateWithSaving(
                    this.navigationScenarios.CLICKED_FORWARD_WITH_CASH,
                    this.$route
                );
            }
        },
    },
    components: {
        funnelHeader,
        funnelFooter,
        vehicleBanner,
        funnelSubHeader,
        Form,
        textBlock,
        cashOrInsuranceQuestion,
        servicePackageQuestion,
        contentGroupModal,
        loadingModal,
    },
};
</script>
