<template>
  <form @submit.prevent="submit">
    <p class="margin-bottom-2 margin-top-3">
      {{ $t('postgreSQLDataSync.description') }}
    </p>
    <FormGroup
      v-for="field in [
        { name: 'postgresql_host', translationPrefix: 'host', type: 'text' },
        {
          name: 'postgresql_username',
          translationPrefix: 'username',
          type: 'text',
        },
        {
          name: 'postgresql_password',
          translationPrefix: 'password',
          type: 'password',
        },
        {
          name: 'postgresql_database',
          translationPrefix: 'database',
          type: 'text',
        },
        {
          name: 'postgresql_schema',
          translationPrefix: 'schema',
          type: 'text',
        },
        { name: 'postgresql_table', translationPrefix: 'table', type: 'text' },
      ]"
      :key="field.name"
      :error="fieldHasErrors(field.name)"
      required
      small-label
      class="margin-bottom-2"
    >
      <template #label>{{
        $t(`postgreSQLDataSync.${field.translationPrefix}`)
      }}</template>
      <FormInput
        v-model="values[field.name]"
        size="large"
        :type="field.type"
        :error="fieldHasErrors(field.name)"
        @blur="$v.values[field.name].$touch()"
      >
      </FormInput>
      <template #error>
        <div
          v-if="$v.values[field.name].$dirty && !$v.values[field.name].required"
        >
          {{ $t('error.requiredField') }}
        </div>
      </template>
    </FormGroup>
    <div class="row">
      <div class="col col-5">
        <FormGroup
          :error="fieldHasErrors('postgresql_port')"
          required
          small-label
          class="margin-bottom-2"
        >
          <template #label>{{ $t('postgreSQLDataSync.port') }}</template>
          <FormInput
            v-model="values.postgresql_port"
            size="large"
            :error="fieldHasErrors('postgresql_port')"
            @blur="$v.values.postgresql_port.$touch()"
          >
          </FormInput>
          <template #error>
            <div
              v-if="
                $v.values.postgresql_port.$dirty &&
                !$v.values.postgresql_port.required
              "
            >
              {{ $t('error.requiredField') }}
            </div>
            <div
              v-else-if="
                $v.values.postgresql_port.$dirty &&
                !$v.values.postgresql_port.numeric
              "
            >
              {{ $t('error.invalidNumber') }}
            </div>
          </template>
        </FormGroup>
      </div>
      <div class="col col-7">
        <FormGroup required small-label class="margin-bottom-2">
          <template #label>{{ $t('postgreSQLDataSync.sslMode') }}</template>
          <Dropdown v-model="values.postgresql_sslmode" size="large">
            <DropdownItem
              v-for="option in sslModeOptions"
              :key="option"
              :name="option"
              :value="option"
            ></DropdownItem>
          </Dropdown>
        </FormGroup>
      </div>
    </div>
  </form>
</template>

<script>
import { required, numeric } from 'vuelidate/lib/validators'

import form from '@baserow/modules/core/mixins/form'

export default {
  name: 'PostgreSQLDataSync',
  mixins: [form],
  data() {
    return {
      allowedValues: [
        'postgresql_host',
        'postgresql_username',
        'postgresql_password',
        'postgresql_port',
        'postgresql_database',
        'postgresql_schema',
        'postgresql_table',
        'postgresql_sslmode',
      ],
      values: {
        postgresql_host: '',
        postgresql_username: '',
        postgresql_password: '',
        postgresql_port: '5432',
        postgresql_database: '',
        postgresql_schema: 'public',
        postgresql_table: '',
        postgresql_sslmode: 'prefer',
      },
      sslModeOptions: [
        'disable',
        'allow',
        'prefer',
        'require',
        'verify-ca',
        'verify-full',
      ],
    }
  },
  validations: {
    values: {
      postgresql_host: { required },
      postgresql_username: { required },
      postgresql_password: { required },
      postgresql_database: { required },
      postgresql_schema: { required },
      postgresql_table: { required },
      postgresql_sslmode: { required },
      postgresql_port: { required, numeric },
    },
  },
}
</script>