<template>
  <div>
    <h2 class="box__title">{{ $t('configureDataSyncSettings.title') }}</h2>
    <div v-if="fetchLoading">
      <div class="loading"></div>
    </div>
    <div v-if="!fetchLoaded">
      <Error :error="error"></Error>
    </div>
    <div v-else-if="fetchLoaded">
      <component
        :is="dataSyncComponent"
        ref="form"
        :default-values="dataSync"
        :update="true"
        :disabled="updateLoading || jobIsRunning"
        class="margin-bottom-2"
        @submitted="submitted"
        @values-changed="completed = false"
      />

      <Error :error="error"></Error>
      <div class="modal-progress__actions">
        <ProgressBar
          v-if="jobIsRunning || jobHasSucceeded"
          :value="job.progress_percentage"
          :status="jobHumanReadableState"
        />
        <div class="align-right">
          <div class="flex">
            <Button
              v-if="completed"
              tag="a"
              type="secondary"
              size="large"
              @click="$emit('hide')"
              >{{ $t('action.hide') }}</Button
            >
            <template v-if="!completed">
              <Checkbox
                v-model="syncTableValue"
                :disabled="updateLoading || jobIsRunning"
                >{{ $t('configureDataSyncSettings.syncTable') }}</Checkbox
              >
              <Button
                type="primary"
                size="large"
                :loading="updateLoading || jobIsRunning"
                :disabled="updateLoading || jobIsRunning"
                @click="$refs.form.submit()"
              >
                {{ $t('action.save') }}
              </Button>
            </template>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import dataSync from '@baserow/modules/database/mixins/dataSync'
import DataSyncService from '@baserow/modules/database/services/dataSync'
import TableForm from '@baserow/modules/database/components/table/TableForm.vue'

export default {
  name: 'ConfigureDataSyncSettings',
  components: { TableForm },
  mixins: [dataSync],
  props: {
    database: {
      type: Object,
      required: true,
    },
    table: {
      type: Object,
      required: true,
    },
  },
  data() {
    return {
      fetchLoading: false,
      fetchLoaded: false,
      dataSync: null,
      completed: false,
      syncTableValue: true,
    }
  },
  computed: {
    dataSyncComponent() {
      return this.$registry
        .get('dataSync', this.dataSync.type)
        .getFormComponent()
    },
  },
  mounted() {
    this.hideError()
    this.fetchDataSource(this.table)
  },
  methods: {
    onJobDone() {
      this.completed = true
    },
    async fetchDataSource(table) {
      this.fetchLoading = true

      try {
        const { data } = await DataSyncService(this.$client).get(
          table.data_sync.id
        )
        this.dataSync = data
        this.fetchLoaded = true
      } catch (error) {
        this.handleError(error)
      } finally {
        this.fetchLoading = false
      }
    },
    async submitted(values) {
      // Remove the `undefined` values, because those contain not updated secrets that
      // are only meant to be included in the update request if they've changed
      // because they're not exposed by the backend.
      const valuesWithoutUndefined = Object.fromEntries(
        Object.entries(values).filter(([_, v]) => v !== undefined)
      )
      await this.update(this.table, valuesWithoutUndefined, this.syncTableValue)
      if (!this.syncTableValue) {
        this.completed = true
      }
    },
  },
}
</script>