<template>
  <v-layout wrap justify-start>
    <v-flex ml-3 xs9>
      <v-text-field id="label-name"
        label="Name"
        v-model="mutableName"
      />
    </v-flex>
    <v-flex ml-3 xs9>
      <v-textarea id="label-description"
        label="Description"
        v-model="mutableDescription"
        placeholder="The description can be seen when hovering above the label"
        auto-grow
      />
    </v-flex>
    <v-flex ml-2 xs12>
      <compact-picker style="width:85%;box-shadow:none;" v-model="mutableColour"/>
    </v-flex>
    <v-flex ml-1 mb-3 xs4>
        <v-btn id="create-label-btn" v-if="!is_update" :loading="loading" color="teal" @click="createLabel">Create</v-btn>
        <v-btn id="update-label-btn" v-else color="teal" :loading="loading" @click="updateLabel">Update</v-btn>
    </v-flex>
  </v-layout>
</template>

<script lang="ts">
import Vue from "vue"
import Component from "vue-class-component"
import { Prop, Watch } from "vue-property-decorator"
import * as api from "@/api";
import { Compact } from "vue-color"
import { FeedbackLabels } from "@/store/modules/feedback-labels";

@Component({
  components: {
    'compact-picker': Compact,
  }
})
export default class FeedbackLabelForm extends Vue {
  @Prop({ type: String, default: "" }) readonly name!: string
  @Prop({ type: String, default: "" }) readonly description!: string
  @Prop({ type: String, default: "#4D4D4D" }) readonly colour!: string
  @Prop({ type: Number, required: false }) readonly pk!: number
  @Prop({ type: Boolean, default: false }) readonly is_update!: boolean

  mutableColour = this.colour
  mutableName = this.name
  mutableDescription = this.description

  loading = false

  @Watch('pk')
  onPkChange() { this.resetFields() }

  resetFields () {
    this.mutableName = this.name
    this.mutableDescription = this.description
    this.mutableColour = this.colour
  }

  get label () {
    return {
      name: this.mutableName,
      description: this.mutableDescription,
      // @ts-ignore
      colour: this.mutableColour.hex || this.mutableColour  // hex may be undefined when colour comes from the updater
    }
  }

  get feedbackLabels () {
    return FeedbackLabels.availableLabels
  }

  async createLabel () {
    this.loading = true

    const duplicate = this.feedbackLabels.find((val) => {
      return val.name === this.label.name
    })

    if (duplicate) {
      this.$notify({
        title: "Label creation error",
        text: "A label with the same name already exists. " + 
          "You can, however, update the label",
        type: 'error',
        duration: -1
      })
      this.resetFields()
      this.loading = false
      return;
    }

    let res
    try {
      res = await api.createLabel(this.label)
    } catch (ex) {
      // user will be notified by the interceptor
      this.resetFields()
      this.loading = false
      return;
    }

    FeedbackLabels.ADD_LABEL(res)
    this.resetFields()
    this.loading = false
  }

  async updateLabel () {
    this.loading = true
    const label = {
      ...this.label,
      pk: this.pk,
    }

    let res
    try {
      res = await api.updateLabel(label)
    } catch (ex) {
      // user will be notified by the interceptor
      this.loading = false
      return;
    }

    FeedbackLabels.UPDATE_LABEL(label)
    this.$emit("label-updated", label.pk)
    this.loading = false
  }
}
</script>

<style>

</style>