<template>
    <div v-if="showModalContent">
        <div v-if="notFullScreen" class="dimmer-overlay"></div>
        <div class="modal-loader" :class="layoutClass">
            <div class="row g-2 h-100 d-flex align-items-center">
                <div class="container-fluid overflow-hidden">
                    <div class="row h-100">
                        <div class="col text-center tagbg mb-4">
                            <div class="spinner-border text-danger" role="status">
                                <span class="visually-hidden">Loading...</span>
                            </div>
                        </div>
                    </div>
                    <div v-if="showTextCarouselContent" class="row">
                        <div class="col">
                            <div class="text-container slide">
                                <p>
                                    Tidying up the shop
                                    <span class="dot-1">.</span>
                                    <span class="dot-2">.</span>
                                    <span class="dot-3">.</span>
                                </p>
                                <p>
                                    Getting all the glass shined up
                                    <span class="dot-1">.</span>
                                    <span class="dot-2">.</span>
                                    <span class="dot-3">.</span>
                                </p>
                                <p>
                                    Planning your new view of the road
                                    <span class="dot-1">.</span>
                                    <span class="dot-2">.</span>
                                    <span class="dot-3">.</span>
                                </p>
                                <p>
                                    Nearly there
                                    <span class="dot-1">.</span>
                                    <span class="dot-2">.</span>
                                    <span class="dot-3">.</span>
                                </p>
                                <p>
                                    Finishing up
                                    <span class="dot-1">.</span>
                                    <span class="dot-2">.</span>
                                    <span class="dot-3">.</span>
                                </p>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
const windowPageShowCallback = function (evt) {
    if (evt.persisted) {
        setTimeout(function () {
            window.location.reload();
        }, 10);
    }
};

export default {
    name: "Modal",
    data() {
        return {
            isModalVisible: false,
            isModalTextCarouselVisible: false,
        };
    },
    props: {
        notFullScreen: {
            type: Boolean,
            default: false,
        },
        showLoader: {
            type: Boolean,
            default: false,
        },
        showTextCarousel: {
            type: Boolean,
            default: false,
        },
    },
    computed: {
        layoutClass() {
            return this.notFullScreen ? "card-layout" : "full-screen container-fluid";
        },
        showModalContent() {
            return this.isModalVisible || this.showLoader;
        },
        showTextCarouselContent() {
            return this.isModalTextCarouselVisible || this.showTextCarousel;
        },
    },
    methods: {
        showModal(showTextCarousel = true) {
            //Display modal
            this.isModalTextCarouselVisible = showTextCarousel;
            this.isModalVisible = true;
            //Force page reload on back button
            window.addEventListener("pageshow", windowPageShowCallback, false);
        },
        hideModal() {
            this.isModalVisible = false;
            window.removeEventListener("pageshow", windowPageShowCallback, false);
        },
    },
};
</script>

<style lang="scss">
.dimmer-overlay {
    position: fixed;
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    background-color: $white;
    z-index: 1056;
}

.modal-loader {
    position: fixed;
    z-index: 1057;
    overflow-x: hidden;
    overflow-y: auto;
    outline: 0;
    background: $white;

    &.full-screen {
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        width: 100%;
        height: 100%;
    }

    &.card-layout {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        padding: 1rem;
        border-radius: 0.5rem;

        & .text-container {
            display: none;
        }

        & .mb-4 {
            margin-bottom: 0;
        }
    }

    .tagbg {
        background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg fill='none' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 84 32'%3e%3cpath d='M22.39 27.313a3.53 3.53 0 0 0 7.058 0' fill='%23fff'/%3e%3cpath d='M22.39 27.313a3.53 3.53 0 0 0 7.058 0' stroke='%23000' stroke-width='.75' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M54.459 27.313a3.527 3.527 0 0 0 7.054 0' fill='%23fff'/%3e%3cpath d='M54.459 27.313a3.527 3.527 0 0 0 7.054 0' stroke='%23000' stroke-width='.75' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M42.06.8c8.08 0 11.89.935 11.89.935 3.58.576 5.696 7.207 5.696 7.207h.727c0-2.427 1.302-2.397 2.341-2 .723.292 1.363.76 1.86 1.361 1.319 1.547.465 1.674.465 1.674h-5.067l3.846 3.01v12.016c0 2.41-2.029 2.31-2.029 2.31H22.338s-2.029.1-2.029-2.31V12.996l3.84-3.009H19.07s-.853-.127.466-1.674a4.693 4.693 0 0 1 1.86-1.361c1.032-.397 2.341-.427 2.341 2h.736s2.117-6.64 5.696-7.21c0 0 3.81-.942 11.89-.942Z' fill='%23fff' stroke='%23000' stroke-width='.75' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M42.06 8.847c7.924 0 14.685.511 14.685.511 0-2.585-2.38-6.011-2.38-6.011S50.4 2.519 42.06 2.519s-12.303.828-12.303.828-2.38 3.426-2.38 6.011c0 0 6.76-.51 14.683-.51Z' fill='%23DA291C' stroke='%23000' stroke-width='.75' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M35.277 16.523a62.558 62.558 0 0 1 13.277 0m3.276-.439s2.384-2.257 8.608-2.257c0 0 1.179 2.657-2.54 3.37m-25.894-1.113s-2.387-2.257-8.611-2.257c0 0-1.16 2.579 2.543 3.37m-3.546 5.856s21.52 3.647 39.123 0' stroke='%23000' stroke-width='.75' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e");
        background-repeat: no-repeat;
        background-position: center center;
        background-size: 96px;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    .spinner-border {
        width: 6.5rem;
        height: 6.5rem;
        border: 0.45em solid currentColor;
        border-right-color: transparent;
    }

    .text-container {
        display: flex;
        width: 350px;
        overflow: hidden;
        white-space: nowrap;
        margin: 0 auto;
        position: relative;
        &:after {
            content: "";
            background: rgb(245, 245, 245);
            background: linear-gradient(
                270deg,
                rgba(245, 245, 245, 1) 0%,
                rgba(245, 245, 245, 0) 5%,
                rgba(245, 245, 245, 0) 95%,
                rgba(245, 245, 245, 1) 100%
            );
            position: absolute;
            width: 100%;
            height: 100%;
            z-index: 2;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
        }

        &.slide p {
            animation: slide-in 20s ease-in-out 1s forwards 1;
        }

        p {
            margin: 0 175px;
            transform: translateX(180px);
        }

        @keyframes slide-in {
            0% {
                transform: translateX(180px);
            }
            11% {
                transform: translateX(-80px);
            }
            22% {
                transform: translateX(-80px);
            }
            33% {
                transform: translateX(-600px);
            }
            44% {
                transform: translateX(-600px);
            }
            55% {
                transform: translateX(-1195px);
            }
            66% {
                transform: translateX(-1195px);
            }
            77% {
                transform: translateX(-1750px);
            }
            88% {
                transform: translateX(-1750px);
            }
            100% {
                transform: translateX(-2200px);
            }
        }

        .dot-1 {
            animation: blinking-elipsis 0.75s linear infinite;
            @keyframes blinking-elipsis {
                0% {
                    opacity: 1;
                }
                65% {
                    opacity: 1;
                }
                66% {
                    opacity: 0;
                }
                100% {
                    opacity: 0;
                }
            }
        }

        .dot-2 {
            animation: blinking-elipsis-2 0.75s linear infinite;
            @keyframes blinking-elipsis-2 {
                0% {
                    opacity: 0;
                }
                21% {
                    opacity: 0;
                }
                22% {
                    opacity: 1;
                }
                65% {
                    opacity: 1;
                }
                66% {
                    opacity: 0;
                }
                100% {
                    opacity: 0;
                }
            }
        }

        .dot-3 {
            animation: blinking-elipsis-3 0.75s linear infinite;
            @keyframes blinking-elipsis-3 {
                0% {
                    opacity: 0;
                }
                43% {
                    opacity: 0;
                }
                44% {
                    opacity: 1;
                }
                65% {
                    opacity: 1;
                }
                66% {
                    opacity: 0;
                }
                100% {
                    opacity: 0;
                }
            }
        }
    }
}
</style>
