<template>
    <Form
        ref="theForm"
        v-slot="{ meta }"
        @submit="onSubmit"
        @invalidSubmit="onInvalidSubmit">
        <div class="page-container-grouped-styles">
            <div class="fade-on-route-transition position-relative">
                <siteHeader cmsWidgetName="SiteHeaderWidget" />
                <div class="main-content-container">
                    <div class="text-center text-color--black pt-5 pb-5 fs-5">
                        <img :src="orderConfirmationImage" />
                        <span
                            class="ms-2"
                            v-html="orderConfirmationHeaderText"></span>
                    </div>
                    <div class="appointment-details">
                        <div>
                            <vehicleBanner
                                cmsWidgetName="VehicleBannerWidget"
                                :displayGenericVehicleImage="false">
                            </vehicleBanner>
                        </div>
                        <div class="appointment-date-time text-center">
                            <p>{{ appointmentDateFormatted }}</p>
                            <p>{{ appointmentTimeFormatted }}</p>
                        </div>
                        <div
                            class="appointment-text text-center lh-base"
                            v-html="appointmentWordingText">
                        </div>
                        <div
                            class="appointment-text text-center lh-base mt-2"
                            v-html="appointmentWordingText2">
                        </div>
                    </div>
                    <siteFooter
                        v-if="carrierUrl"
                        ref="siteFooter"
                        cmsWidgetName="SiteFooterWidget"
                        :isStackedVertically="true"
                        :isForwardActionDisabled="!meta.valid"
                        @ForwardClicked="forwardButtonAction"
                        @backClicked="navigateBack" />
                </div>
            </div>
        </div>
    </Form>
</template>
<script>
// Components
import siteHeader from '@/iss-components/site-header/site-header.vue';
import vehicleBanner from '@/iss-components/vehicle-banner/vehicle-banner.vue';
import siteFooter from '@/iss-components/site-footer/site-footer.vue';
// Supporting files
import { fetchCmsContentForPage, processIfStatements } from '@/helpers/cms-content-helper';
import settleAllPromises from '@/helpers/layout-helper';
import { Form } from 'vee-validate';
import BaseFormMixin from '@/mixins/base-form-mixin.js';
import { useMainStore } from '@/store';
import { get12HourTimeFormat,
    get12HourTimeMobileFormat,
    convertDateStringToDate,
    getDisplayTextForDurationLength } from '@/helpers/date-helper.js';
import { toTitleCase } from '@/helpers/text-helper.js';
import { AppointmentTypeStrings } from '@/constants/schedule-constants';

export default {
    name: 'order-confirmation',
    components: {
        // eslint-disable-next-line vue/no-reserved-component-names
        Form,
        siteHeader,
        vehicleBanner,
        siteFooter
    },
    mixins: [BaseFormMixin],
    async beforeRouteEnter(to, from, next) {
        useMainStore().createSubmittedOrder();
        // Call APIs
        const cmsContentPromise = fetchCmsContentForPage(to.query.issPage);
        // Settle promises and get results
        const promiseResultMap = [
            {
                resultKey: 'cmsContent',
                promise: cmsContentPromise
            }];
            // use resultMap to populate layout content.
        const resultMap = await settleAllPromises(promiseResultMap);
        next((vm) => {
            vm.setCmsContent(resultMap.cmsContent);
        });
    },
    setup() {
        const mainStore = useMainStore();
        const { submittedOrder } = mainStore;
        return { mainStore, submittedOrder };
    },
    computed: {
        carrierName() {
            return this.mainStore.issConfig.clientName;
        },
        carrierUrl() {
            return this.mainStore.issConfig.successReturnURL;
        },
        orderConfirmationHeaderText() {
            return this.getCmsContent('OrderConfirmationContent', 'HeaderText');
        },
        orderConfirmationImage() {
            return this.getCmsContent('OrderConfirmationContent', 'Image');
        },
        appointmentType() {
            return this.submittedOrder.serviceLocation.appointmentType;
        },
        appointmentDate() {
            return this.submittedOrder.schedule.date;
        },
        appointmentStartTime() {
            return this.submittedOrder.schedule.startTime;
        },
        appointmentEndTime() {
            return this.submittedOrder.schedule.endTime;
        },
        appointmentDateFormatted() {
            // This conversion ensures we don't get get GMT induced date changes
            const dateObject = convertDateStringToDate(this.appointmentDate);
            // Ex: Tuesday, April 22
            return dateObject.toLocaleDateString('en-us', {
                weekday: 'long',
                month: 'long',
                day: 'numeric'
            });
        },
        appointmentTimeFormatted() {
            const formattedTime = this.formatAppointmentTime(this.appointmentType);
            return formattedTime;
        },
        mobileWordingText() {
            return this.getCmsContent('MobileWordingWidget', 'BodyText');
        },
        mobileWordingText2() {
            return this.getCmsContent('MobileWordingWidget', 'BodyText2');
        },
        dropOffAndInShopWordingText() {
            return this.getCmsContent('DropOffAndInShopWordingWidget', 'BodyText');
        },
        dropOffAndInShopWordingText2() {
            return this.getBodyText2FromCms('DropOffAndInShopWordingWidget');
        },
        serviceLocationAddress() {
            return this.submittedOrder.serviceLocation.address;
        },
        serviceLocationAddress2() {
            return this.submittedOrder.serviceLocation.address2;
        },
        serviceLocationCity() {
            return this.submittedOrder.serviceLocation.city;
        },
        serviceLocationState() {
            return this.submittedOrder.serviceLocation.state;
        },
        serviceLocationZipCode() {
            return this.submittedOrder.serviceLocation.zipCode;
        },
        serviceLocationFullAddress() {
            // eslint-disable-next-line max-len
            return `${this.serviceLocationAddress}, ${this.serviceLocationAddress2 ? `${this.serviceLocationAddress2},` : ''}<br/> ${this.serviceLocationCity}, ${this.serviceLocationState} ${this.serviceLocationZipCode}`;
        },
        providerAddress() {
            return toTitleCase(this.submittedOrder.serviceLocation.provider.address.streetAddress);
        },
        providerCity() {
            return toTitleCase(this.submittedOrder.serviceLocation.provider.address.city);
        },
        providerState() {
            return this.submittedOrder.serviceLocation.provider.address.state;
        },
        providerZipCode() {
            return this.submittedOrder.serviceLocation.provider.address.zipCode;
        },
        providerFullAddress() {
            // eslint-disable-next-line max-len
            return `${this.providerAddress},<br/> ${this.providerCity}, ${this.providerState} ${this.providerZipCode}`;
        },
        appointmentWordingText() {
            switch (this.appointmentType) {
                case AppointmentTypeStrings.MOBILE:
                case AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP:
                    return this.mobileWordingText?.replaceAll(
                        '{custom:address}',
                        this.serviceLocationFullAddress
                    );
                case AppointmentTypeStrings.DROP_OFF:
                    return this.dropOffAndInShopWordingText?.replaceAll(
                        '{custom:address}',
                        this.providerFullAddress
                    );
                case AppointmentTypeStrings.IN_SHOP:
                    return this.dropOffAndInShopWordingText?.replaceAll(
                        '{custom:address}',
                        this.providerFullAddress
                    );
                default:
                    return null;
            }
        },
        appointmentWordingText2() {
            switch (this.appointmentType) {
                case AppointmentTypeStrings.MOBILE:
                case AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP:
                    return this.mobileWordingText2;
                case AppointmentTypeStrings.DROP_OFF:
                    return this.dropOffAndInShopWordingText2;
                case AppointmentTypeStrings.IN_SHOP:
                    return this.dropOffAndInShopWordingText2?.replaceAll(
                        '{custom:inShopDuration}',
                        this.inShopAppointmentDuration
                    );
                default:
                    return null;
            }
        },
        mobileAppointment() {
            return this.submittedOrder.serviceLocation.appointmentType === AppointmentTypeStrings.MOBILE
                || this.submittedOrder.serviceLocation.appointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP;
        },
        inShopAppointment() {
            return this.submittedOrder.serviceLocation.appointmentType === AppointmentTypeStrings.IN_SHOP;
        },
        dropOffAppointment() {
            return this.submittedOrder.serviceLocation.appointmentType === AppointmentTypeStrings.DROP_OFF;
        },
        inShopAppointmentDuration() {
            const inshopDurationTime = getDisplayTextForDurationLength(
                this.submittedOrder.schedule.jobMinMinutes,
                this.submittedOrder.schedule.jobMaxMinutes
            );
            return inshopDurationTime;
        }
    },
    mounted() {
        if (this.carrierUrl) {
            this.$refs.siteFooter.updateButtonText(`Go back to ${this.carrierName}`);
        }
    },
    methods: {
        forwardButtonAction() {
            this.$router.navigateToExternalUrl(this.carrierUrl);
        },
        formatAppointmentTime(appointmentType) {
            switch (appointmentType) {
                case AppointmentTypeStrings.MOBILE:
                case AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP:
                    // eslint-disable-next-line max-len
                    return `Between ${get12HourTimeMobileFormat(this.appointmentStartTime)} - ${get12HourTimeMobileFormat(this.appointmentEndTime)}`;
                case AppointmentTypeStrings.DROP_OFF:
                    return 'Drop off before 9:30 AM';
                case AppointmentTypeStrings.IN_SHOP:
                    return `at ${get12HourTimeFormat(this.appointmentStartTime)}`;
                default:
                    return null;
            }
        },
        processIfStatements,
        getBodyText2FromCms(cmsWidgetName) {
            const body2Text = this.getCmsContent(cmsWidgetName, 'BodyText2');
            return this.processIfStatements(body2Text, 'custom', this.getCustomValueFromString);
        },
        getCustomValueFromString(str) {
            switch (str) {
                case 'inShopAppointment':
                    return this.inShopAppointment;
                case 'dropOffAppointment':
                    return this.dropOffAppointment;
                default:
                    return null;
            }
        }
    }
};
</script>
<style lang="scss" scoped>
$page-side-padding: 1.5rem;

.page-container-grouped-styles {
    overflow: auto;

    .main-content-container {
        padding: 0 1.5rem !important;
    }
}

.text-color--black {
    color: $black;
}

.appointment-details {
    margin-bottom: 1.5rem;
    padding: 1rem 1.5rem 1.5rem;
    box-shadow: 0 3px 10px rgb(0 0 0 / 0.2);
    border-radius: 5px;
}

.appointment-date-time P {
    color: $black;
    font-size: $h5-font-size;
    line-height: map-get($spacers, 6);
    margin-bottom: 0.5rem;

    + p {
        font-size: map-get($spacers, 4);
        line-height: 1.625rem;
        font-weight: $font-weight-bold;
    }
}

.appointment-text {
    :deep(p) {
        margin: 0;
    }
    :deep(strong) {
        font-weight: $font-weight-bold;
        color: $black;
    }
}
</style>
