<template>
  <ThemeProvider class="theme-settings">
    <Tabs>
      <Tab
        v-for="themeConfigBlock in themeConfigBlocks"
        :key="themeConfigBlock.getType()"
        :title="themeConfigBlock.label"
      >
        <div class="padding-top-2">
          <ThemeConfigBlock
            :default-values="builder.theme"
            :theme-config-block-type="themeConfigBlock"
            @values-changed="update($event)"
          />
        </div>
      </Tab>
    </Tabs>
  </ThemeProvider>
</template>

<script>
import ThemeProvider from '@baserow/modules/builder/components/theme/ThemeProvider'
import ThemeConfigBlock from '@baserow/modules/builder/components/theme/ThemeConfigBlock'

import { mapActions } from 'vuex'
import { notifyIf } from '@baserow/modules/core/utils/error'
import _ from 'lodash'

export default {
  name: 'ThemeSettings',
  components: { ThemeProvider, ThemeConfigBlock },
  provide() {
    return { builder: this.builder }
  },
  props: {
    builder: {
      type: Object,
      required: true,
    },
  },
  computed: {
    themeConfigBlocks() {
      return this.$registry.getOrderedList('themeConfigBlock')
    },
  },
  methods: {
    ...mapActions({
      setThemeProperty: 'theme/setProperty',
      forceSetThemeProperty: 'theme/forceSetProperty',
    }),
    async update(newValues) {
      const differences = Object.fromEntries(
        Object.entries(newValues).filter(
          ([key, value]) => !_.isEqual(value, this.builder.theme[key])
        )
      )
      try {
        await Promise.all(
          Object.entries(differences).map(([key, value]) =>
            this.setThemeProperty({ builder: this.builder, key, value })
          )
        )
      } catch (error) {
        notifyIf(error, 'application')
      }
    },
  },
}
</script>