<template lang="pug">
main.view--onboarding
    article(
        style='display: flex; flex-direction: column; align-items: center'
        v-if='currentStep !== survey?.steps?.length'
    )
        .answers(v-for='(value, key) in answered')
            span(v-if='key == "name" && value && currentStep == 2') Hi {{ value }}!
        br
        .step(v-for='(step, i) in survey?.steps')
            component(
                :answered='answered'
                :currentStep='currentStep'
                :is='step.component'
                :question='step'
                :responses='responses'
                :survey='survey'
                @handle-submit='onSubmit'
                @update-answers='updateAnswers'
                v-if='step && currentStep == i'
            )
        .invalidResponseMessage(
            style='text-align: center'
            v-if='invalidResponse'
        )
            p {{ survey.steps[currentStep].invalidInputPrompt }}

        footer
            p(v-if='currentStep != 0') You have completed: {{ currentStep }} / {{ survey?.steps?.length }} survey steps

    article(v-else)
        SurveyCompleteView(:answers='answered' :surveySteps='survey?.steps')
</template>

<script>
import { Authenticator } from '../services/auth.service.js'
import { surveyFactory } from '@/utils'
import stepViews from '@/components/onboarding'
import SurveyCompleteView from './SurveyCompleteView.vue'
let hashedAccessToken = null
let currentProfileId = null

export default {
    name: 'OnboardingView',
    components: {
        ...stepViews,
        SurveyCompleteView,
    },
    data: () => ({
        answered: {},
        aspectQuestions: [],
        responses: [],
        currentStep: 0,
        survey: null,
        invalidResponse: false,
        authenticator: {},
    }),
    async created() {
        this.survey = await surveyFactory.createSurvey()
        this.authenticator = new Authenticator()
        hashedAccessToken = this.grabStoredCookie('siimee_access')
        try {
            const sessionData = await this.validateSession(hashedAccessToken)
            currentProfileId = sessionData.profileId
            this.responses = sessionData.responses
            this.currentStep = this.responses.length + 3
            this.goToStep(this.currentStep)
        } catch (err) {
            console.error('ERROR :=>', err)
            this.goToStep(0)
        }
    },
    methods: {
        onSubmit() {
            console.log(JSON.stringify(this.answered))
        },
        async goToStep(num) {
            this.currentStep = num
        },
        grabStoredCookie(cookieKey) {
            const cookies = document.cookie
                .split('; ')
                .reduce((prev, current) => {
                    const [name, ...value] = current.split('=')
                    prev[name] = value.join('=')
                    return prev
                }, {})
            const cookieVal =
                cookieKey in cookies ? cookies[`${cookieKey}`] : undefined
            return cookieVal
        },
        async validateSession(hashedAccessToken) {
            if (!hashedAccessToken)
                return console.warn('WARNING :=> accessToken is not defined')
            const validatedToken = await this.authenticator.validateSession(
                hashedAccessToken,
            )
            if (validatedToken.error) {
                throw new Error(validatedToken.error)
            } else {
                return validatedToken
            }
        },
        async updateAnswers(payload) {
            if (payload) {
                const k = payload.question.survey_stage
                this.answered[k] = payload.input
                // Once validated, don't log password in answered object
                this.answered[k] = k === 'password' ? undefined : payload.input
                // Hacky WorkAround for Validating Answers
                if (!this.survey.validateAnswer(payload)) {
                    this.invalidResponse = true
                    return
                }
                // Formats initial responses for response table
                const response = {}
                response.response_key_id = payload.question.response_key_id
                response.val = payload.input
                this.responses.push(response)
                if (k === 'aspects') return
            }
            // NOTE: If user has finished minimum profile creation,
            // Adds survey answers to responses table and verifies tokens on each step
            if (currentProfileId) {
                await surveyFactory.addNewSurveyAnswer(
                    this.responses[this.responses.length - 1],
                    currentProfileId,
                )
                try {
                    await this.validateSession(hashedAccessToken)
                } catch (err) {
                    this.currentStep = 0
                    this.goToStep(this.currentStep)
                    throw new Error(err)
                }
            }
            if (this.currentStep > this.survey.steps.length) {
                this.onSubmit(this.answered)
            } else {
                this.goToStep(this.currentStep + 1)
            }
        },
    },
}
</script>

<style lang="sass">
.view--onboarding
    width: 100%
    max-width: 428px
    background-color: #fff
    color: #1F2024
    font-family: Century Gothic,CenturyGothic,AppleGothic,sans-serif
    margin: 0 auto

    article
        height: 100vh

    .answers
        text-align: center

    .w-button
            display: flex
            width: 315px
            height: 60px
            border-radius: 6
            background-color: #D5D5D5
            color: #1F2024
            margin: 11px auto
            font-weight: bold
            font-size: 16px
            text-transform: uppercase
            &.next-btn
                border-radius: 6px
                background-color: #5BA626
                color: #1F2024
                height: 50px
                width: 315px
                font-size: 18px
                padding: 7px

    .w-card
        background-color: #1F2024
        justify-content: center
        align-items: center
        width: 100%


        h3
            text-transform: uppercase
            text-align: center
            font-size: 28px
            font-weight: bold
            color: white
            margin-top: 88px

        p
            color: white
            font-size: 18px
            padding: 11px
            text-align: center
            margin: 22px auto
            font-weight: bold

        input
            display: flex
            width: 315px
            height: 60px
            padding: 11px
            border-radius: 6
            background-color: #D5D5D5
            color: #1F2024
            margin: 11px auto
            font-weight: bold
            font-size: 16px

            .w-select
                padding: 11px
                color: #1F2024

            .search-type
                color: #1F2024
                height: 50px

        &.question
            p
                font-size: 18px
                text-align: left
                margin: 7px auto
                font-weight: normal
            section
                p
                    margin: 0
                    font-weight: bold
                    text-transform: capitalize
    .w-radio__input

        &.primary
            background-color: #FFFFFF
            border: #BCC5D3 1px solid

    .w-card__content
        .w-button
            height: 50px
            background-color: #5BA626
</style>
