<template lang="pug">
  v-app.setup
    v-content
      v-container
        v-layout
          v-flex(xs12, lg6, offset-lg3)
            v-card.radius-7
              .text-center
                img.setup-logo(src='/svg/logo-wikijs.svg', alt='Wiki.js Logo')
              v-alert(tile, color='indigo lighten-5', :value='true')
                v-icon.mr-3(color='indigo') mdi-package-variant
                span.indigo--text You are about to install Wiki.js #[strong {{wikiVersion}}].
              v-card-text
                .overline.pl-3 Create Administrator Account
                v-container.pa-3(grid-list-xl)
                  v-layout(row, wrap)
                    v-flex(xs12)
                      v-text-field(
                        outlined
                        v-model='conf.adminEmail',
                        label='Administrator Email',
                        hint='The email address of the administrator account.',
                        persistent-hint
                        v-validate='{ required: true, email: true }',
                        data-vv-name='adminEmail',
                        data-vv-as='Administrator Email',
                        data-vv-scope='admin',
                        :error-messages='errors.collect(`admin.adminEmail`)'
                        ref='adminEmailInput'
                      )
                    v-flex(xs6)
                      v-text-field(
                        outlined
                        ref='adminPassword',
                        counter='255'
                        v-model='conf.adminPassword',
                        label='Password',
                        :append-icon="pwdMode ? 'mdi-eye-off' : 'mdi-eye'"
                        @click:append="() => (pwdMode = !pwdMode)"
                        :type="pwdMode ? 'password' : 'text'"
                        hint='At least 8 characters long.',
                        persistent-hint
                        v-validate='{ required: true, min: 8 }',
                        data-vv-name='adminPassword',
                        data-vv-as='Password',
                        data-vv-scope='admin',
                        :error-messages='errors.collect(`admin.adminPassword`)'
                      )
                    v-flex(xs6)
                      v-text-field(
                        outlined
                        ref='adminPasswordConfirm',
                        counter='255'
                        v-model='conf.adminPasswordConfirm',
                        label='Confirm Password',
                        :append-icon="pwdConfirmMode ? 'mdi-eye-off' : 'mdi-eye'"
                        @click:append="() => (pwdConfirmMode = !pwdConfirmMode)"
                        :type="pwdConfirmMode ? 'password' : 'text'"
                        hint='Verify your password again.',
                        persistent-hint
                        v-validate='{ required: true, min: 8 }',
                        data-vv-name='adminPasswordConfirm',
                        data-vv-as='Confirm Password',
                        data-vv-scope='admin',
                        :error-messages='errors.collect(`admin.adminPasswordConfirm`)'
                        @keyup.enter='install'
                      )
                v-divider.mb-4
                v-checkbox.ml-3(
                  color='primary',
                  v-model='conf.telemetry',
                  label='Allow Telemetry',
                  persistent-hint,
                  hint='Help Wiki.js developers improve this app with anonymized telemetry.'
                )
              v-alert(:value='error', type='error', icon='mdi-alert') {{ errorMessage }}
              v-divider.mt-3(v-if='!error')
              v-card-actions
                v-btn(color='primary', @click='install', :disabled='loading', x-large, flat, block)
                  v-icon(left) mdi-check
                  span Install

    v-dialog(v-model='loading', width='450', persistent)
      v-card(color='primary', dark).radius-7
        v-card-text.text-center.py-5
          .py-3(style='width: 64px; display:inline-block;')
            breeding-rhombus-spinner(
              :animation-duration='2000'
              :size='64'
              color='#FFF'
              )
          template(v-if='!success')
            .subtitle-1.white--text Finalizing your installation...
            .caption Just a moment
          template(v-else)
            .subtitle-1.white--text Installation complete!
            .caption Redirecting...
</template>

<script>
import axios from 'axios'
import _ from 'lodash'
import { BreedingRhombusSpinner } from 'epic-spinners'

export default {
  components: {
    BreedingRhombusSpinner
  },
  props: {
    wikiVersion: {
      type: String,
      required: true
    }
  },
  data() {
    return {
      loading: false,
      success: false,
      error: false,
      errorMessage: '',
      conf: {
        adminEmail: '',
        adminPassword: '',
        adminPasswordConfirm: '',
        telemetry: true
      },
      pwdMode: true,
      pwdConfirmMode: true
    }
  },
  mounted() {
    _.delay(() => {
      this.$refs.adminEmailInput.focus()
    }, 500)
  },
  methods: {
    async install () {
      const validationSuccess = await this.$validator.validateAll('admin')
      if (!validationSuccess || this.conf.adminPassword !== this.conf.adminPasswordConfirm) {
        return
      }

      this.loading = true
      this.success = false
      this.error = false
      this.$forceUpdate()

      _.delay(async () => {
        try {
          const resp = await axios.post('/finalize', this.conf)
          if (resp.data.ok === true) {
            this.success = true
            _.delay(() => {
              window.location.assign('/login')
            }, 3000)
          } else {
            this.error = true
            this.errorMessage = resp.data.error
            this.loading = false
          }
        } catch (err) {
          window.alert(err.message)
        }
      }, 1000)
    }
  }
}

</script>

<style lang='scss'>
.setup {
  .v-application--wrap {
    padding-top: 10vh;
    background-color: darken(mc('grey', '900'), 5%);
    background-image: url(/svg/motif-circuit.svg) !important;
    background-repeat: repeat;
  }

  &-logo {
    width: 300px;
    margin: 3rem 0 2rem 0;
  }
}
</style>
