import BooleanSetting from '../helpers/boolean_setting.vue'
import ChoiceSetting from '../helpers/choice_setting.vue'
import ScopeSelector from 'src/components/scope_selector/scope_selector.vue'
import IntegerSetting from '../helpers/integer_setting.vue'
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'

import SharedComputedObject from '../helpers/shared_computed_object.js'
import ServerSideIndicator from '../helpers/server_side_indicator.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
  faGlobe, faSync
} from '@fortawesome/free-solid-svg-icons'

library.add(
  faGlobe,
  faSync
)

const GeneralTab = {
  data () {
    return {
      subjectLineOptions: ['email', 'noop', 'masto'].map(mode => ({
        key: mode,
        value: mode,
        label: this.$t(`settings.subject_line_${mode === 'masto' ? 'mastodon' : mode}`)
      })),
      conversationDisplayOptions: ['tree', 'linear'].map(mode => ({
        key: mode,
        value: mode,
        label: this.$t(`settings.conversation_display_${mode}`)
      })),
      conversationOtherRepliesButtonOptions: ['below', 'inside'].map(mode => ({
        key: mode,
        value: mode,
        label: this.$t(`settings.conversation_other_replies_button_${mode}`)
      })),
      mentionLinkDisplayOptions: ['short', 'full_for_remote', 'full'].map(mode => ({
        key: mode,
        value: mode,
        label: this.$t(`settings.mention_link_display_${mode}`)
      })),
      thirdColumnModeOptions: ['none', 'notifications', 'postform'].map(mode => ({
        key: mode,
        value: mode,
        label: this.$t(`settings.third_column_mode_${mode}`)
      })),
      userProfileDefaultTabOptions: ['statuses', 'replies'].map(tab => ({
        key: tab,
        value: tab,
        label: this.$t(`user_card.${tab}`)
      })),
      profilesExpanded: false,
      newProfileName: '',
      loopSilentAvailable:
      // Firefox
      Object.getOwnPropertyDescriptor(HTMLVideoElement.prototype, 'mozHasAudio') ||
      // Chrome-likes
      Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, 'webkitAudioDecodedByteCount') ||
      // Future spec, still not supported in Nightly 63 as of 08/2018
      Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, 'audioTracks')

    }
  },
  components: {
    BooleanSetting,
    ChoiceSetting,
    IntegerSetting,
    InterfaceLanguageSwitcher,
    ScopeSelector,
    ServerSideIndicator
  },
  computed: {
    postFormats () {
      return this.$store.state.instance.postFormats || []
    },
    postContentOptions () {
      return this.postFormats.map(format => ({
        key: format,
        value: format,
        label: this.$t(`post_status.content_type["${format}"]`)
      }))
    },
    instanceSpecificPanelPresent () { return this.$store.state.instance.showInstanceSpecificPanel },
    instanceWallpaperUsed () {
      return this.$store.state.instance.background &&
        !this.$store.state.users.currentUser.background_image
    },
    language: {
      get: function () { return this.$store.getters.mergedConfig.interfaceLanguage },
      set: function (val) {
        this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val })
      }
    },
    settingsProfiles () {
      return (this.$store.state.instance.settingsProfiles || [])
    },
    settingsProfile: {
      get: function () { return this.$store.getters.mergedConfig.profile },
      set: function (val) {
        this.$store.dispatch('setOption', { name: 'profile', value: val })
        this.$store.dispatch('getSettingsProfile')
      }
    },
    settingsVersion () {
      return this.$store.getters.mergedConfig.profileVersion
    },
    translationLanguages () {
      const langs = this.$store.state.instance.supportedTranslationLanguages
      if (langs && langs.source) {
        return langs.source.map(lang => ({ key: lang.code, value: lang.code, label: lang.name }))
      }

      return []
    },
    translationLanguage: {
      get: function () { return this.$store.getters.mergedConfig.translationLanguage },
      set: function (val) {
        this.$store.dispatch('setOption', { name: 'translationLanguage', value: val })
      }
    },
    ...SharedComputedObject()
  },
  methods: {
    changeDefaultScope (value) {
      this.$store.dispatch('setServerSideOption', { name: 'defaultScope', value })
    },
    setTranslationLanguage (value) {
      this.$store.dispatch('setOption', { name: 'translationLanguage', value })
    },
    toggleExpandedSettings () {
      this.profilesExpanded = !this.profilesExpanded
    },
    loadSettingsProfile (name) {
      this.$store.commit('setOption', { name: 'profile', value: name })
      this.$store.dispatch('getSettingsProfile', true)
    },
    createSettingsProfile () {
      this.$store.dispatch('setOption', { name: 'profile', value: this.newProfileName })
      this.$store.dispatch('setOption', { name: 'profileVersion', value: 1 })
      this.$store.dispatch('syncSettings')
      this.newProfileName = ''
    },
    forceSync () {
      this.$store.dispatch('getSettingsProfile')
    },
    refreshProfiles () {
      this.$store.dispatch('listSettingsProfiles')
    },
    deleteSettingsProfile (name) {
      if (confirm(this.$t('settings.settings_profile_delete_confirm'))) {
        this.$store.dispatch('deleteSettingsProfile', name)
      }
    }
  }
}

export default GeneralTab
