<template>
  <div>
    <h1>{{ $t('databaseStep.title') }}</h1>
    <p>
      {{ $t('databaseStep.description') }}
    </p>
    <div class="margin-bottom-2">
      <SegmentControl
        :active-index.sync="selectedTypeIndex"
        :segments="types"
        :initial-active-index="0"
        @update:activeIndex="updateValue"
      ></SegmentControl>
    </div>
    <template v-if="hasName">
      <FormGroup :error="v$.name.$error">
        <FormInput
          v-model="name"
          :placeholder="$t('databaseStep.databaseNameLabel')"
          :label="$t('databaseStep.databaseNameLabel')"
          size="large"
          :error="v$.name.$error"
          @input=";[v$.name.$touch(), updateValue()]"
          @blur="v$.name.$touch"
        />
        <template #error>{{ v$.name.$errors[0].$message }}</template>
      </FormGroup>
    </template>
    <AirtableImportForm
      v-if="selectedType === 'airtable'"
      ref="airtable"
      @input="updateValue($event)"
    ></AirtableImportForm>
    <TemplateImportForm
      v-if="selectedType === 'template'"
      @selected-template="selectedTemplate"
    ></TemplateImportForm>
  </div>
</template>

<script>
import { useVuelidate } from '@vuelidate/core'
import { required, helpers } from '@vuelidate/validators'
import AirtableImportForm from '@baserow/modules/database/components/airtable/AirtableImportForm'
import TemplateImportForm from '@baserow/modules/database/components/onboarding/TemplateImportForm'
import { DatabaseOnboardingType } from '@baserow/modules/database/onboardingTypes'

export default {
  name: 'DatabaseStep',
  components: { AirtableImportForm, TemplateImportForm },
  props: {
    data: {
      required: true,
      type: Object,
    },
  },
  setup() {
    return { v$: useVuelidate({ $lazy: true }) }
  },
  data() {
    return {
      types: [
        {
          type: 'scratch',
          label: this.$t('databaseStep.scratch'),
        },
        {
          type: 'import',
          label: this.$t('databaseStep.import'),
        },
        {
          type: 'airtable',
          label: this.$t('databaseStep.airtable'),
        },
        {
          type: 'template',
          label: this.$t('databaseStep.template'),
        },
      ],
      selectedTypeIndex: 0,
      name: '',
    }
  },

  computed: {
    selectedType() {
      return this.types[this.selectedTypeIndex].type
    },
    hasName() {
      return ['scratch', 'import'].includes(this.selectedType)
    },
  },
  mounted() {
    this.updateValue()
  },
  methods: {
    isValid() {
      if (this.selectedType === 'airtable') {
        const airtable = this.$refs.airtable
        return !!airtable && !airtable.v$.$invalid && airtable.v$.$dirty
      } else if (this.selectedType === 'template') {
        const template = this.data[DatabaseOnboardingType.getType()].template
        return !!template
      } else {
        return !this.v$.$invalid && this.v$.$dirty
      }
    },
    updateValue(airtable = {}) {
      this.$emit('update-data', {
        name: this.name,
        type: this.selectedType,
        ...airtable,
      })
    },
    selectedTemplate(template) {
      this.$emit('update-data', {
        type: this.selectedType,
        template,
      })
    },
  },
  validations() {
    const rules = {}
    if (this.hasName) {
      rules.name = {
        required: helpers.withMessage(this.$t('error.requiredField'), required),
      }
    }
    return rules
  },
}
</script>