<template>
  <v-container>
    <v-dialog v-model="checkValidate" max-width="290">
      <v-card>
        <v-card-title>
          Willst du wirklich??
        </v-card-title>
        <v-card-text v-if="stornoMessage">
          Willst du wirklich den Betrag
          {{ (stornoMessage.amount / 100).toFixed(2) }}€ von
          {{ stornoMessage.user.firstname }}
          {{ stornoMessage.user.lastname }} stornieren?
        </v-card-text>
        <v-card-actions>
          <v-spacer />
          <v-btn text @click="cancelStorno">Abbrechen</v-btn>
          <v-btn text @click="acceptStorno">Stornieren</v-btn>
        </v-card-actions>
      </v-card>
    </v-dialog>
    <v-dialog v-model="dialog" max-width="290">
      <v-card>
        <v-card-title class="headline"
          >Transaktion ist länger als 15 Sekunden her!</v-card-title
        >
        <v-card-text>
          Da die Transaktion länger als 15 Sekunden her ist, kann eine
          Stornierung nicht durchgeführt werden. Wende dich bitte an den
          Finanzer.
        </v-card-text>
        <v-card-actions>
          <v-spacer />
          <v-btn text @click="dialog = false">
            Verstanden
          </v-btn>
        </v-card-actions>
      </v-card>
    </v-dialog>
    <v-dialog
            v-if="overLimitUser"
            v-model="overLimitUser"
            max-width="290"
            persistent
    >
      <v-card>
        <v-card-title>Warnung</v-card-title>
        <v-card-text>
          {{ overLimitUser.firstname }} {{ overLimitUser.lastname }} übersteigt
          das Anschreibelimit von
          {{ (overLimitUser.limit / 100).toFixed(2) }} €. Danach kann dieses
          Mitglied nichts mehr anschreiben. Will er das wirklich?
        </v-card-text>
        <v-card-actions>
          <v-spacer />
          <v-btn text @click="cancel()">Abbrechen</v-btn>
          <v-btn text @click="continueAdd(overLimitUser)">Anschreiben</v-btn>
        </v-card-actions>
      </v-card>
    </v-dialog>
    <v-dialog v-if="overOverLimit" v-model="overOverLimit" max-width="290" persistent>
      <v-card>
        <v-card-title>Anschreiben nicht möglich</v-card-title>
        <v-card-text>
          {{ overOverLimit.firstname }}
          {{ overOverLimit.lastname }} überschreitet das Anschreibelimit zuviel.
          Das Anschreiben wurde daher gestoppt und zurückgesetzt.
        </v-card-text>
        <v-card-actions>
          <v-btn text @click="overOverLimit = null">Verstanden</v-btn>
        </v-card-actions>
      </v-card>
    </v-dialog>
    <AddAmountSkeleton v-if="loading" />
    <v-navigation-drawer v-model="menu" right app clipped>
      <v-list-item-group :key="componentRenderer">
        <v-list-item inactive>
          <v-list-item-title class="headline">
            Verlauf
          </v-list-item-title>
        </v-list-item>
        <v-divider />
        <div
          v-for="message in messages"
          three-line
          :key="messages.indexOf(message)"
        >
          <div v-if="message">
            <v-list-item three-line inactive @click="storno(message)">
              <v-list-item-content>
                <v-progress-linear indeterminate v-if="message.loading" />
                <v-list-item-title>{{ now(message.date) }}</v-list-item-title>
                <v-list-item-subtitle>
                  {{ createSum(message) }} {{ createMessage(message) }}
                </v-list-item-subtitle>
                <v-list-item-subtitle class="red--text" v-if="message.storno"
                  >STORNIERT!!!
                </v-list-item-subtitle>
                <v-list-item-subtitle class="red--text" v-else-if="message.error">
                  ERROR!
                </v-list-item-subtitle>
                <v-list-item-action-text v-if="under5minutes(message.date) && !message.error"
                  >Klicken um zu Stornieren
                </v-list-item-action-text>
              </v-list-item-content>
            </v-list-item>
          </div>
        </div>
      </v-list-item-group>
    </v-navigation-drawer>
    <v-card v-if="!loading" :loading="addLoading">
      <v-card-title>
        {{ user.firstname }} {{ user.lastname }}
        <v-spacer />
        <v-btn @click="menu = !menu" icon>
          <v-icon>{{ menuIcon }}</v-icon>
        </v-btn>
      </v-card-title>
      <v-card-subtitle v-if="user.limit + getAllSum() > 0">
        Nur noch {{ ((user.limit + getAllSum()) / 100).toFixed(2) }} €
        übrig!!
      </v-card-subtitle>
      <v-card-text>
        <v-row>
          <v-col cols="10">
            <v-row>
              <v-col cols="6" sm="4">
                <v-btn
                  class="creditBtn"
                  block
                  @click="addingAmount(200)"
                  :color="color"
                  :disabled="user.locked"
                  >2 €</v-btn
                >
              </v-col>
              <v-col cols="6" sm="4">
                <v-btn
                  class="creditBtn"
                  block
                  @click="addingAmount(100)"
                  :color="color"
                  :disabled="user.locked"
                  >1 €</v-btn
                >
              </v-col>
              <v-col cols="6" sm="4">
                <v-btn
                  class="creditBtn"
                  block
                  @click="addingAmount(50)"
                  :color="color"
                  :disabled="user.locked"
                  >0,50 €</v-btn
                >
              </v-col>
              <v-col cols="6" sm="4">
                <v-btn
                  class="creditBtn"
                  block
                  @click="addingAmount(40)"
                  :color="color"
                  :disabled="user.locked"
                  >0,40 €</v-btn
                >
              </v-col>
              <v-col cols="6" sm="4">
                <v-btn
                  class="creditBtn"
                  block
                  @click="addingAmount(20)"
                  :color="color"
                  :disabled="user.locked"
                  >0,20 €</v-btn
                >
              </v-col>
              <v-col cols="6" sm="4">
                <v-btn
                  class="creditBtn"
                  block
                  @click="addingAmount(10)"
                  :color="color"
                  :disabled="user.locked"
                  >0,10 €</v-btn
                >
              </v-col>
              <v-col cols="8">
                <v-text-field
                  outlined
                  type="number"
                  v-model="value"
                  label="Benutzerdefinierter Betrag"
                  :disabled="user.locked"
                ></v-text-field>
              </v-col>
              <v-col cols="4">
                <v-btn
                  fab
                  :color="color"
                  @click="addAmountMore()"
                  :disabled="user.locked"
                >
                  <v-icon>{{ plus }}</v-icon>
                </v-btn>
              </v-col>
            </v-row>
          </v-col>
          <v-col align-self="center">
            <v-row>
              <v-list-item>
                <v-list-item-content class="text-center">
                  <v-list-item-action-text :class="getColor(getAllSum())"
                    >{{ (getAllSum() / 100).toFixed(2) }}
                    €
                  </v-list-item-action-text>
                  <v-list-item-action-text v-if="toSetAmount">
                    - {{ (toSetAmount / 100).toFixed(2) }}
                  </v-list-item-action-text>
                </v-list-item-content>
              </v-list-item>
            </v-row>
          </v-col>
        </v-row>
        <v-alert v-if="user.locked" type="error"
          >{{ user.firstname }} darf nicht mehr anschreiben.
          {{ user.firstname }} sollte sich lieber mal beim Finanzer
          melden.</v-alert
        >
      </v-card-text>
    </v-card>
    <v-snackbar
      v-for="message in messages"
      :key="messages.indexOf(message)"
      :color="message.error ? 'error' : 'success'"
      bottom
      :timeout="0"
      :multi-line="true"
      v-model="message.visible"
      vertical
    >
      <div class="title">
        <p style="font-size: 5em; margin: 20px">{{ createSum(message) }}</p>
        {{ createMessage(message) }}
      </div>
      <div>
        {{ now(message.date) }}
      </div>
      <v-btn color="white" icon @click="message.visible = false">
        <v-icon>
          {{ close }}
        </v-icon>
      </v-btn>
    </v-snackbar>
    <ConnectionError/>
  </v-container>
</template>

<script>
import { mapGetters, mapActions } from 'vuex'
// eslint-disable-next-line no-unused-vars
import { mdiMenu, mdiPlus, mdiClose } from '@mdi/js'
import AddAmountSkeleton from './Skeleton/AddAmountSkeleton'
import ConnectionError from "@/components/ConnectionError";
export default {
  name: 'AddAmount',
  components: {ConnectionError, AddAmountSkeleton },
  data() {
    return {
      color: 'green accent-4',
      value: null,
      plus: mdiPlus,
      menu: false,
      dialog: false,
      componentRenderer: 0,
      timer: '',
      menuIcon: mdiMenu,
      close: mdiClose,
      checkValidate: false,
      stornoMessage: null,
      timeout: null,
      toSetAmount: null,
      overLimitUser: null,
      overOverLimit: null,
    }
  },
  created() {
    this.timer = setInterval(this.forceRender, 1000)
  },
  methods: {
    ...mapActions({
      addAmount: 'user/addAmount',
      commitStorno: 'user/storno'
    }),
    continueAdd(user) {
      this.overLimitUser = null
      user.checkedOverLimit = true
      if (this.value) {
        this.addAmount(Math.round(Math.abs(this.value * 100)))
        setTimeout(() => {
          this.value = null
          this.toSetAmount = null
        }, 300)
      } else {
        user.timeout = setTimeout(() => {
          this.addAmount(this.toSetAmount)
          setTimeout(() => {
            this.toSetAmount = null
          }, 300)
        }, 2000)
      }
    },
    cancel() {
      this.toSetAmount = null
      this.value = null
      this.overLimitUser = null
    },
    checkOverLimitIsValid(user) {
      if (this.toSetAmount) {
        if (Math.abs(this.getAllSum() - Number.parseInt(this.toSetAmount)) > user.limit + 500) {
          this.overOverLimit = user
          this.toSetAmount = null
          this.value = null
          return false
        }
      }
      return true
    },
    checkOverLimit(user) {
      if (this.toSetAmount) {
        if (Math.abs( this.getAllSum() - this.toSetAmount) > user.limit) {
          return user.checkedOverLimit ? false : true
        }
      }
      return false
    },
    addingAmount(amount) {
      clearTimeout(this.timeout)
      this.toSetAmount = this.toSetAmount ? this.toSetAmount + amount : amount
      if (this.checkOverLimitIsValid(this.user)) {
        if (this.checkOverLimit(this.user)) {
          this.overLimitUser = this.user
        } else {
          this.timeout = setTimeout(() => {
            this.addAmount(this.toSetAmount)
            setTimeout(() => {
              this.toSetAmount = null
            }, 300)
          }, 2000)
        }
      }
    },
    forceRender() {
      this.componentRenderer += 1
    },
    getColor(value) {
      return value >= 0 ? 'title green--text' : 'title red--text'
    },
    getAllSum() {
      if (this.user)
        return (
          this.user.creditList[this.year][2].sum +
          this.user.creditList[this.year][1].last
        )
      return 0
    },
    storno(message) {
      if (!message.error) {
        if (!this.under5minutes(message.date)) this.dialog = true
        else {
          this.checkValidate = true
          this.stornoMessage = message
        }
      }
    },
    acceptStorno() {
      this.commitStorno({
        amount: this.stornoMessage.amount,
        date: this.stornoMessage.date
      })
      setTimeout(() => {
        this.cancelStorno()
      }, 300)
    },
    cancelStorno() {
      this.stornoMessage = null
      this.checkValidate = null
    },
    addAmountMore() {
      this.toSetAmount = this.toSetAmount
              ? this.toSetAmount + Math.round(Math.abs(this.value * 100))
              : Math.round(Math.abs(this.value * 100))
      if (this.checkOverLimitIsValid(this.user)) {
        if (this.checkOverLimit(this.user)) {
          this.overLimitUser = this.user
        }
        else {
          this.addAmount(Math.abs(this.value * 100))
          setTimeout(() => {
            this.value = null
          }, 300)
        }
      }
    },
    createSum(message) {
      var text = '' + (message.amount / 100).toFixed(2) + '€'
      return text
    },
    createMessage(message) {
      var text = ''
      if (message.error) {
        text =
          ' konnten nicht zu ' +
          message.user.firstname +
          ' ' +
          message.user.lastname +
          ' hinzufügen.'
      } else {
        text =
          ' wurde zu ' +
          message.user.firstname +
          ' ' +
          message.user.lastname +
          ' hinzugefügt.'
      }
      return text
    }
  },
  computed: {
    ...mapGetters({
      user: 'user/user',
      year: 'user/year',
      loading: 'user/loading',
      addLoading: 'user/addLoading',
      messages: 'user/messages'
    }),
    under5minutes() {
      return now => {
        var actual = new Date()
        return actual - now < 15000
      }
    },
    now() {
      return now => {
        var actual = new Date()
        var zero = new Date(0)
        var date = new Date(actual - now)
        if (date.getFullYear() === zero.getFullYear()) {
          if (date.getMonth() === zero.getMonth()) {
            if (date.getDate() === zero.getDate()) {
              if (date.getHours() === zero.getDate()) {
                if (date.getMinutes() < 1) {
                  return 'vor ' + date.getSeconds() + ' Sekunden'
                } else if (date.getMinutes() < 10) {
                  return 'vor ' + date.getMinutes() + ' Minuten'
                } else {
                  return (
                    (now.getHours() < 10 ? '0' : '') +
                    now.getHours() +
                    ':' +
                    (now.getMinutes() < 10 ? '0' : '') +
                    now.getMinutes()
                  )
                }
              } else {
                return (
                  (now.getHours() < 10 ? '0' : '') +
                  now.getHours() +
                  ':' +
                  (now.getMinutes() < 10 ? '0' : '') +
                  now.getMinutes()
                )
              }
            }
          }
        }
        return (
          now.getDate() +
          '.' +
          now.getMonth() +
          '.' +
          now.getFullYear() +
          ' ' +
          (now.getHours() < 10 ? '0' : '') +
          now.getHours() +
          ':' +
          (now.getMinutes() < 10 ? '0' : '') +
          now.getMinutes()
        )
      }
    }
  },
  beforeDestroy() {
    clearInterval(this.timer)
  }
}
</script>

<style scoped></style>