<template>
  <q-page padding>
    <q-card>
      <q-form @submit="save" @reset="reset">
        <q-card-section class="fit row justify-start content-center items-center">
          <q-card-section class="fit">
            <div class="text-h6">Veranstaltung erstellen</div>
          </q-card-section>
          <q-select
            filled
            use-input
            label="Veranstaltungstyp"
            input-debounce="0"
            class="col-xs-12 col-sm-6 q-pa-sm"
            v-model="event.type"
            :options="eventtypes"
            option-label="name"
            option-value="name"
            map-options
            clearable
            :rules="[notEmpty]"
          />
          <IsoDateInput
            class="col-xs-12 col-sm-6 q-pa-sm"
            v-model="event.start"
            label="Veranstaltungsbeginn"
            :rules="[noValidDate, notEmpty]"
          />
        </q-card-section>
        <q-card-section class="fit justify-start content-center items-center">
          <q-input
            class="col-xs-12 col-sm-6 q-pa-sm"
            label="Beschreibung"
            type="textarea"
            v-model="event.description"
            filled
          />
        </q-card-section>
        <q-card-section>
          <q-btn color="primary" label="Schicht hinzufügen" @click="addJob()" />
        </q-card-section>

        <q-card-section v-for="(job, index) in event.jobs" :key="index">
          <q-card class="q-my-auto">
            <job
              :job="job"
              :job-can-delete="jobDeleteDisabled"
              @set-start="setStart"
              @set-required="setRequired"
              @set-end="setEnd"
              @set-comment="setComment"
              @set-job-type="setJobType"
              @remove-job="removeJob(index)"
            />
          </q-card>
        </q-card-section>
        <q-card-actions align="right">
          <q-btn label="Reset" type="reset" />
          <q-btn color="primary" type="submit" label="Speichern" />
        </q-card-actions>
      </q-form>
    </q-card>
  </q-page>
</template>

<script lang="ts">
import { defineComponent, ref, onBeforeMount, computed } from 'vue';
import IsoDateInput from 'src/components/utils/IsoDateInput.vue';
import Job from './Job.vue';
import { Store } from 'vuex';
import { StateInterface } from 'src/store';
import { ScheduleInterface } from '../../store/schedule';
import { date } from 'quasar';

export default defineComponent({
  name: 'CreateEvent',
  components: { IsoDateInput, Job },
  setup(_, { root }) {
    const store = <Store<StateInterface>>root.$store;
    const state = <ScheduleInterface>store.state.schedule;
    const eventtypes = computed(() => state.eventTypes);
    const jobDeleteDisabled = computed(() => event.value.jobs.length < 2);

    const newJob = ref<FG.Job>(({
      id: NaN,
      start: undefined,
      end: undefined,
      comment: '',
      services: [],
      required_services: 2,
    } as unknown) as FG.Job);

    const event = ref<FG.Event>({
      id: NaN,
      start: new Date(),
      description: '',
      jobs: [Object.assign({}, newJob.value)],
    } as FG.Event);

    onBeforeMount(() => {
      void store.dispatch('schedule/getEventTypes');
      void store.dispatch('schedule/getJobTypes');
    });

    function setStart(data: { job: FG.Job; value: Date }) {
      data.job.start = data.value;
    }

    function setEnd(data: { job: FG.Job; value: Date }) {
      data.job.end = data.value;
    }

    function setComment(data: { job: FG.Job; value: string }) {
      data.job.comment = data.value;
    }

    function setJobType(data: { job: FG.Job; value: FG.JobType }) {
      data.job.type = data.value;
    }

    function setRequired(data: { job: FG.Job; value: number }) {
      data.job.required_services = data.value;
    }

    function addJob() {
      const addJob = Object.assign({}, newJob.value);
      event.value.jobs.unshift(addJob);
    }

    //function removeJob(id: number) {
    //  let jobtoremove = event.value.jobs.findIndex(job => job.id == id);
    //  if (jobtoremove != undefined) {
    //    event.value.jobs.splice(jobtoremove, 1);
    //  }
    //}

    function removeJob(index: number) {
      event.value.jobs.splice(index, 1);
    }

    function save() {
      console.log('Event:', event);
      void store
        .dispatch('schedule/addEvent', event.value)
        .catch((error) => {
          console.warn(error);
        })
        .then(() => {
          reset();
        });
    }

    function reset() {
      event.value.id = NaN;
      event.value.start = new Date();
      event.value.description = '';
      event.value.type = { id: -1, name: '' };
      event.value.jobs = [Object.assign({}, newJob.value)];
    }
    function notEmpty(val: string) {
      return !!val || 'Feld darf nicht leer sein!';
    }
    function noValidDate(val: string) {
      return !!date.isValid(val) || 'Datum/Zeit muss gesetzt sein!';
    }

    function isAfterDate(val: Date) {
      // return event.value.jobsstart.getTime() > val.getTime() || 'Ende muss hinter dem Start liegen';
    }
    return {
      jobDeleteDisabled,
      addJob,
      eventtypes,
      removeJob,
      notEmpty,
      noValidDate,
      save,
      reset,
      event,
      isAfterDate,
      setStart,
      setEnd,
      setComment,
      setJobType,
      setRequired,
    };
  },
});
</script>

<style></style>