<template>
  <div>
    <v-data-table :headers="headers" :items="priceList" :search="search">
      <template v-slot:top>
        <v-toolbar flat color="white">
          <v-toolbar-title>Preisliste</v-toolbar-title>
          <v-spacer></v-spacer>
          <v-text-field
            v-model="search"
            label="Suche Getränk"
            single-line
            hide-details
          >
            <template v-slot:append>
              <v-icon>{{ searchIcon }}</v-icon>
            </template>
          </v-text-field>
          <v-dialog v-model="dialog" v-if="isGastro">
            <template v-slot:activator="{ on }">
              <v-btn
                fab
                x-small
                color="primary"
                class="mb-2"
                v-on="on"
                style="margin: 5px"
              >
                <v-icon>{{ plus }}</v-icon>
              </v-btn>
            </template>
            <v-card>
              <v-card-title>
                <span class="headline">{{ formTitle }}</span>
              </v-card-title>

              <v-card-text>
                <v-container>
                  <v-row>
                    <v-col cols="12" sm="6" md="4">
                      <v-text-field
                        v-model="editedItem.name"
                        label="Name"
                        outlined
                      ></v-text-field>
                    </v-col>
                    <v-col cols="12" sm="6" md="4">
                      <v-autocomplete
                        return-object
                        v-model="editedItem.type"
                        label="Kategorie"
                        item-text="name"
                        item-value="id"
                        :items="types"
                        outlined
                        :search-input.sync="searchType"
                        no-data-text="Kategorie nicht vorhanden."
                      >
                        <template v-slot:append-item>
                          <v-list-item v-if="!inType(searchType)">
                            <v-list-item-title>
                              {{ searchType }}
                            </v-list-item-title>
                            <v-btn
                              dark
                              x-small
                              color="blue darken-1"
                              @click="addType()"
                              :disabled="inType(searchType)"
                              fab
                            >
                              <v-icon>
                                {{ plus }}
                              </v-icon>
                            </v-btn>
                          </v-list-item>
                        </template>
                      </v-autocomplete>
                    </v-col>
                    <v-col cols="12" sm="6" md="4">
                      <v-text-field
                        v-model="editedItem.price"
                        label="Preis in €"
                        outlined
                      ></v-text-field>
                    </v-col>
                    <v-col cols="12" sm="6" md="4">
                      <v-text-field
                        v-model="editedItem.price_big"
                        label="Preis groß in €"
                        outlined
                      ></v-text-field>
                    </v-col>
                    <v-col cols="12" sm="6" md="4">
                      <v-text-field
                        v-model="editedItem.price_club"
                        label="Preis Club in €"
                        outlined
                      ></v-text-field>
                    </v-col>
                    <v-col cols="12" sm="6" md="4">
                      <v-text-field
                        v-model="editedItem.price_club_big"
                        label="Preis Club groß in €"
                        outlined
                      ></v-text-field>
                    </v-col>
                    <v-col col="12" sm="6" md="4">
                      <v-text-field
                        v-model="editedItem.premium"
                        label="Aufpreis in €"
                        outlined
                      />
                    </v-col>
                    <v-col cols="12" sm="6" md="4">
                      <v-text-field
                        v-model="editedItem.premium_club"
                        label="Aufpreis Club in €"
                        outlined
                      />
                    </v-col>
                    <v-col cols="12" sm="6" md="4">
                      <v-text-field
                        v-model="editedItem.price_extern_club"
                        label="Preis extern Club in €"
                        outlined
                      />
                    </v-col>
                  </v-row>
                </v-container>
              </v-card-text>

              <v-card-actions>
                <v-spacer></v-spacer>
                <v-btn color="blue darken-1" text @click="close"
                  >Abbrechen</v-btn
                >
                <v-btn color="blue darken-1" text @click="save"
                  >Speichern</v-btn
                >
              </v-card-actions>
            </v-card>
          </v-dialog>
        </v-toolbar>
      </template>
      <template v-slot:item.type="{ item }">
        {{ computeType(item.type) }}
      </template>
      <template v-slot:item.price="{ item }">
        {{ item.price ? (item.price / 100).toFixed(2) : '' }}
      </template>
      <template v-slot:item.price_big="{ item }">
        {{ item.price_big ? (item.price_big / 100).toFixed(2) : '' }}
      </template>
      <template v-slot:item.price_club="{ item }">
        {{
          item.name.toLowerCase() == 'long island ice tea'.toLowerCase()
            ? 'Ein Klubmitglied bestellt keinen Long Island Icetea'
            : item.price_club
            ? (item.price_club / 100).toFixed(2)
            : ''
        }}
      </template>
      <template v-slot:item.price_club_big="{ item }">
        {{ item.price_club_big ? (item.price_club_big / 100).toFixed(2) : '' }}
      </template>
      <template v-slot:item.premium="{ item }">
        {{ item.premium ? (item.premium / 100).toFixed(2) : '' }}
      </template>
      <template v-slot:item.premium_club="{ item }">
        {{ item.premium_club ? (item.premium_club / 100).toFixed(2) : '' }}
      </template>
      <template v-slot:item.price_extern_club="{ item }">
        {{
          item.price_extern_club
            ? (item.price_extern_club / 100).toFixed(2)
            : ''
        }}
      </template>
      <template v-slot:item.action="{ item }">
        <v-icon small class="mr-2" @click="editItem(item)">
          {{ editIcon }}
        </v-icon>
        <v-icon small @click="deleteItem(item)">
          {{ deleteIcon }}
        </v-icon>
      </template>
    </v-data-table>
    <v-card tile v-if="isGastro">
      <v-card-title>
        Kategorien
        <v-spacer />
        <v-btn fab x-small @click="dialogType = true" color="primary">
          <v-icon>{{ plus }}</v-icon>
        </v-btn>
      </v-card-title>
      <v-card-text>
        <div tile v-for="type in types" :key="type.id">
          <v-card tile>
            <v-card-text class="black--text">
              <v-row class="ml-3 mr-3">
                {{ type.name }}
                <v-spacer />
                <v-btn icon @click="editType(type)">
                  <v-icon>
                    {{ editIcon }}
                  </v-icon>
                </v-btn>
                <v-btn icon @click="deleteType(type)">
                  <v-icon>
                    {{ deleteIcon }}
                  </v-icon>
                </v-btn>
              </v-row>
            </v-card-text>
          </v-card>
        </div>
      </v-card-text>
      <v-dialog v-model="dialogType">
        <v-card>
          <v-card-title>
            {{ dialogTypeTitle }}
          </v-card-title>
          <v-card-text>
            <v-container>
              <v-text-field
                v-model="editedType.name"
                outlined
                label="Name der Kategorie"
              />
            </v-container>
          </v-card-text>
          <v-card-actions>
            <v-spacer />
            <v-btn text color="blue darken-1" @click="closeType()">
              Abbrechen
            </v-btn>
            <v-btn
              text
              color="blue darken-1"
              @click="saveType()"
              :disabled="inType(editedType.name)"
            >
              Speichern
            </v-btn>
          </v-card-actions>
        </v-card>
      </v-dialog>
    </v-card>
  </div>
</template>

<script>
import { mapGetters, mapActions } from 'vuex'
import { mdiMagnify, mdiPlus, mdiPencil, mdiDelete } from '@mdi/js'
export default {
  name: 'PriceList',
  data() {
    return {
      editIcon: mdiPencil,
      deleteIcon: mdiDelete,
      searchIcon: mdiMagnify,
      plus: mdiPlus,
      searchType: null,
      search: null,
      dialog: null,
      dialogType: null,
      editedIndex: -1,
      headers: [
        {
          text: 'Name',
          value: 'name'
        },
        {
          text: 'Kategorie',
          value: 'type'
        },
        {
          text: 'Preis in €',
          value: 'price'
        },
        {
          text: 'Preis groß in €',
          value: 'price_big'
        },
        {
          text: 'Preis Club in €',
          value: 'price_club'
        },
        {
          text: 'Preis groß Club in €',
          value: 'price_club_big'
        },
        {
          text: 'Aufpreis in €',
          value: 'premium'
        },
        {
          text: 'Aufpreis Club in €',
          value: 'premium_club'
        },
        {
          text: 'Preis Club extern in €',
          value: 'price_extern_club'
        }
      ],
      editedItem: {
        name: null,
        type: { id: -1, name: null },
        price: null,
        price_big: null,
        price_club: null,
        price_club_big: null,
        premium: null,
        premium_club: null,
        price_extern_club: null
      },
      defaultItem: {
        name: null,
        type: { id: -1, name: null },
        price: null,
        price_big: null,
        price_club: null,
        price_club_big: null,
        premium: null,
        premium_club: null,
        price_extern_club: null
      },
      editedType: {
        id: -1,
        name: null
      },
      defaultType: {
        id: -1,
        name: null
      }
    }
  },
  methods: {
    ...mapActions({
      getPriceList: 'priceList/getPriceList',
      getTypes: 'priceList/getTypes',
      setDrink: 'priceList/setDrink',
      updateDrink: 'priceList/updateDrink',
      deleteDrink: 'priceList/deleteDrink',
      setDrinkType: 'priceList/setDrinkType',
      updateDrinkType: 'priceList/updateDrinkType',
      deleteDrinkType: 'priceList/deleteDrinkType'
    }),
    editType(item) {
      console.log(item)
      this.editedType = Object.assign({}, item)
      this.dialogType = true
    },
    closeType() {
      this.dialogType = false
      setTimeout(() => {
        this.editedType = Object.assign({}, this.defaultType)
      }, 300)
    },
    saveType() {
      this.editedType.id === -1
        ? this.setDrinkType(this.editedType)
        : this.updateDrinkType(this.editedType)
      this.closeType()
    },
    deleteType(item) {
      confirm('Bist du sicher, dass die diese Kategorie entfernen wills?') &&
        this.deleteDrinkType({ id: item.id })
    },
    addType() {
      this.setDrinkType({ name: this.searchType })
    },
    close() {
      this.dialog = false
      setTimeout(() => {
        this.editedItem = Object.assign({}, this.defaultItem)
        this.editedIndex = -1
      }, 300)
    },
    editItem(item) {
      this.editedIndex = item.id
      console.log('item', item)
      this.editedItem = Object.assign({}, item)
      for (let i in this.editedItem) {
        this.editedItem[i] = isNaN(this.editedItem[i])
          ? this.editedItem[i]
          : this.editedItem[i] == null || this.editedItem[i] == 0
          ? null
          : (this.editedItem[i] / 100).toFixed(2)
      }
      console.log(this.editedItem)
      this.editedItem.type = Object.assign(
        {},
        this.types.find(a => a.id == item.type)
      )
      this.dialog = true
    },

    deleteItem(item) {
      confirm('Bist du sicher, dass die dieses Getränk entfernen wills?') &&
        this.deleteDrink({ id: item.id })
    },
    save() {
      console.log(this.editedItem)
      console.log(this.editedIndex)
      console.log(!isNaN(this.editedItem.price_extern_club))
      var drink = {
        id: this.editedIndex,
        name: this.editedItem.name,
        type: this.editedItem.type.id,
        price: !isNaN(this.editedItem.price)
          ? this.editedItem.price * 100
          : null,
        price_big: !isNaN(this.editedItem.price_big)
          ? this.editedItem.price_big * 100
          : null,
        price_club: !isNaN(this.editedItem.price_club)
          ? this.editedItem.price_club * 100
          : null,
        price_club_big: !isNaN(this.editedItem.price_club_big)
          ? this.editedItem.price_club_big * 100
          : null,
        premium: !isNaN(this.editedItem.premium)
          ? this.editedItem.premium * 100
          : null,
        premium_club: !isNaN(this.editedItem.premium_club)
          ? this.editedItem.premium_club * 100
          : null,
        price_extern_club: !isNaN(this.editedItem.price_extern_club)
          ? this.editedItem.price_extern_club * 100
          : null
      }
      console.log(drink)
      drink.id === -1 ? this.setDrink(drink) : this.updateDrink(drink)
      this.editedItem = Object.assign({}, this.defaultItem)
      this.close()
    }
  },
  computed: {
    ...mapGetters({
      priceList: 'priceList/priceList',
      types: 'priceList/types',
      isGastro: 'isGastro'
    }),
    formTitle() {
      return this.editedIndex === -1 ? 'Neues Getränk' : 'Bearbeite Getränk'
    },
    inType() {
      return text => {
        return !!this.types.find(a => {
          if (a.name === null || text === null) {
            return true
          } else {
            return a.name.toLowerCase() === text.toLowerCase()
          }
        })
      }
    },
    dialogTypeTitle() {
      return this.editedType.id === -1
        ? 'Neue Kategorie'
        : 'Bearbeite Kategorie'
    },
    computeType() {
      return id => {
        return this.types.find(a => {
          return a.id === id
        }).name
      }
    }
  },
  created() {
    this.getPriceList()
    if (this.isGastro) {
      this.headers.push({
        text: 'Aktion',
        value: 'action',
        sortable: false,
        filterable: false
      })
      this.getTypes()
    }
  },
  watch: {
    dialog(val) {
      val || this.close()
    }
  }
}
</script>

<style scoped></style>