<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',
          protectedEdit: true,
        },
        {
          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
      :protected-edit="update && field.protectedEdit"
      class="margin-bottom-2"
      @enabled-protected-edit="values.postgresql_password = ''"
      @disable-protected-edit="values.postgresql_password = undefined"
    >
      <template #label>{{
        $t(`postgreSQLDataSync.${field.translationPrefix}`)
      }}</template>
      <FormInput
        v-model="v$.values[field.name].$model"
        size="large"
        :type="field.type"
        :error="fieldHasErrors(field.name)"
        :disabled="disabled"
        @blur="v$.values[field.name].$touch()"
      >
      </FormInput>
      <template #error>
        {{ v$.values[field.name].$errors[0]?.$message }}
      </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="v$.values.postgresql_port.$model"
            size="large"
            :error="fieldHasErrors('postgresql_port')"
            :disabled="disabled"
            @blur="v$.values.postgresql_port.$touch"
          >
          </FormInput>
          <template #error>
            {{ v$.values.postgresql_port.$errors[0]?.$message }}
          </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="v$.values.postgresql_sslmode.$model"
            :disabled="disabled"
            size="large"
          >
            <DropdownItem
              v-for="option in sslModeOptions"
              :key="option"
              :name="option"
              :value="option"
            ></DropdownItem>
          </Dropdown>
        </FormGroup>
      </div>
    </div>
  </form>
</template>

<script>
import { useVuelidate } from '@vuelidate/core'
import { required, requiredIf, numeric, helpers } from '@vuelidate/validators'
import form from '@baserow/modules/core/mixins/form'

export default {
  name: 'PostgreSQLDataSync',
  mixins: [form],
  props: {
    update: {
      type: Boolean,
      required: false,
      default: false,
    },
    disabled: {
      type: Boolean,
      required: false,
      default: false,
    },
  },
  setup() {
    return { v$: useVuelidate({ $lazy: true }) }
  },
  data() {
    const allowedValues = [
      'postgresql_host',
      'postgresql_username',
      'postgresql_port',
      'postgresql_database',
      'postgresql_password',
      'postgresql_schema',
      'postgresql_table',
      'postgresql_sslmode',
    ]
    return {
      allowedValues,
      values: {
        postgresql_host: '',
        postgresql_username: '',
        postgresql_port: '5432',
        postgresql_database: '',
        // If `undefined`, it's not included in the patch update request, and will then
        // not be changed.
        postgresql_password: this.update ? undefined : '',
        postgresql_schema: 'public',
        postgresql_table: '',
        postgresql_sslmode: 'prefer',
      },
      sslModeOptions: [
        'disable',
        'allow',
        'prefer',
        'require',
        'verify-ca',
        'verify-full',
      ],
    }
  },
  validations() {
    return {
      values: {
        postgresql_host: {
          required: helpers.withMessage(
            this.$t('error.requiredField'),
            required
          ),
        },
        postgresql_username: {
          required: helpers.withMessage(
            this.$t('error.requiredField'),
            required
          ),
        },
        postgresql_password: {
          required: helpers.withMessage(
            this.$t('error.requiredField'),
            requiredIf(() => {
              return this.values.postgresql_password !== undefined
            })
          ),
        },
        postgresql_database: {
          required: helpers.withMessage(
            this.$t('error.requiredField'),
            required
          ),
        },
        postgresql_schema: {
          required: helpers.withMessage(
            this.$t('error.requiredField'),
            required
          ),
        },
        postgresql_table: {
          required: helpers.withMessage(
            this.$t('error.requiredField'),
            required
          ),
        },
        postgresql_sslmode: {
          required: helpers.withMessage(
            this.$t('error.requiredField'),
            required
          ),
        },
        postgresql_port: {
          required: helpers.withMessage(
            this.$t('error.requiredField'),
            required
          ),
          numeric: helpers.withMessage(this.$t('error.invalidNumber'), numeric),
        },
      },
    }
  },
}
</script>