<template>
  <q-card
    class="background: radial-gradient(circle, #35a2ff 0%, #014a88 100%) justify-start content-center items-center rounded-borders border-primary shadow-5 q-mb-xs"
    bordered
  >
    <header class="text-primary q-px-xs">
      <div class="col text-weight-bolder ellipsis">
        {{ event.type.name }}
      </div>

      <div v-if="event.description" class="col text-weight-medium" style="font-size: 10px">
        Info
        {{ event.description }}
      </div>
    </header>

    <div v-for="(job, index) in event.jobs" v-bind:key="index">
      <q-separator style="justify-start content-center" />
      <div class="text-weight-medium q-px-xs">
        {{ job.start | formatToHour }} - {{ job.end | formatToHour }}
      </div>
      <div class="q-px-xs">
        {{ job.type.name }}
      </div>
      <div class="col-auto q-px-xs" style="font-size: 10px">
        {{ job.comment }}
      </div>
      <div>
        <q-select
          filled
          v-model="job.services"
          :option-label="(opt) => userDisplay(opt)"
          multiple
          disable
          use-chips
          stack-label
          label="Dienste"
          class="col-auto q-px-xs"
          style="font-size: 6px"
          counter
          :max-values="job.required_services"
          :key="refreshKey"
        >
        </q-select>
        <div class="row col-12 justify-end">
          <q-btn v-if="false" />
          <q-btn
            v-if="!isUserEnrolled(job) && !jobFull(job)"
            flat
            color="primary"
            label="Eintragen"
            @click="enrollForJob(job)"
            :key="refreshKey"
          />
          <q-btn
            v-if="isUserEnrolled(job)"
            flat
            color="negative"
            label="Austragen"
            @click="signOutFromJob(job)"
            :key="refreshKey"
          />
        </div>
      </div>
    </div>
  </q-card>
</template>

<script lang="ts">
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
import { defineComponent, ref, onBeforeMount } from '@vue/composition-api';
import { Store } from 'vuex';
import { StateInterface } from 'src/store';
import { date } from 'quasar';

interface Props {
  event: FG.Event;
}
export default defineComponent({
  name: 'Eventslot',
  components: {},
  props: {
    event: {
      required: true,
    },
  },
  filters: {
    formatToHour: function (value: Date) {
      if (value) {
        return date.formatDate(value, 'HH:mm');
      }
    },
  },

  setup(props: Props, { root, emit }) {
    const store = <Store<StateInterface>>root.$store;
    const state = store.state.user;
    const availableUsers = null;
    const refreshKey = ref(0);

    const users = ref(state.users);
    function refresh() {
      root.$router.go(0);
      refreshKey.value += 1;
    }
    onBeforeMount(() => {
      store.dispatch('user/getUsers').catch((error) => {
        console.warn(error);
      });
    });

    function isUserEnrolled(job: FG.Job) {
      return (
        job.services.filter((service) => service.userid == state.currentUser?.userid).length >= 1
      );
    }
    function jobFull(job: FG.Job) {
      console.log('jobFull', job.services.length >= job.required_services);
      return job.services.length >= job.required_services;
    }
    function userDisplay(userid: string) {
      return state.users.find((user) => (user.userid = userid))?.display_name;
    }

    function enrollForJob(this: any, job: FG.Job) {
      console.log(job.services);
      if (state.currentUser) {
        const newService: FG.Service = {
          userid: state.currentUser?.userid,
          value: 1,
        };

        const newUserService = { user: newService };
        const UpdateInformation = {
          eventId: <number>this.event.id,
          JobId: job.id,
          service: newUserService,
        };
        void store.dispatch('schedule/updateEvent', UpdateInformation).catch((error) => {
          console.warn(error);
        });
      }
      refresh();
    }
    function signOutFromJob(this: any, job: FG.Job) {
      console.log(job.services);
      if (state.currentUser) {
        const newService: FG.Service = {
          userid: state.currentUser?.userid,
          value: -1,
        };

        const newUserService = { user: newService };
        const UpdateInformation = {
          eventId: <number>this.event.id,
          JobId: job.id,
          service: newUserService,
        };
        void store.dispatch('schedule/updateEvent', UpdateInformation).catch((error) => {
          console.warn(error);
        });
      }
      refresh();
    }

    return {
      refreshKey,
      availableUsers,
      enrollForJob,
      state,
      users,
      isUserEnrolled,
      signOutFromJob,
      jobFull,
      userDisplay,
      refresh,
    };
  },
});
</script>

<style scoped></style>