<template>
  <div>
    <b-modal
      ref="modalEmissionManagerCreate"
      :title="$t('scheduleEditor.titleCreate', { show: selectedShow.name })"
      :cancel-title="$t('cancel')"
      size="lg"
      @ok="create"
    >
      <b-alert variant="warning" :show="pastEventWarning">
        <span v-html="$t('scheduleEditor.pastEventWarning')" />
      </b-alert>

      <server-errors :errors="serverErrors" />

      <div v-if="loaded.modal && !submitting">
        <b-row>
          <b-col cols="12">
            <label class="tw-w-full tw-font-bold">
              <span class="tw-inline-block tw-pb-2">{{ $t('rrule.rrule') }}</span>
              <b-form-select v-model="valuePick.rrule" :options="rruleOptions" />
            </label>
          </b-col>
        </b-row>

        <b-row>
          <b-col cols="3">
            <label class="tw-w-full tw-font-bold">
              <span class="tw-inline-block tw-pb-2">{{ $t('scheduleEditor.fromDate') }}</span>
              <b-form-input v-model="valuePick.firstDate" type="date" />
            </label>
          </b-col>
          <b-col v-if="valuePick.rrule !== 1" cols="3">
            <label class="tw-w-full tw-font-bold">
              <span class="tw-inline-block tw-pb-2" v-html="$t('scheduleEditor.toDate')" />
              <b-form-input v-model="valuePick.lastDate" type="date" />
            </label>
          </b-col>
          <b-col cols="3">
            <label class="tw-w-full tw-font-bold">
              <span class="tw-inline-block tw-pb-2">{{ $t('scheduleEditor.from') }}</span>
              <b-form-input v-model="valuePick.startTime" type="time" />
            </label>
          </b-col>
          <b-col cols="3">
            <label class="tw-w-full tw-font-bold">
              <span class="tw-inline-block tw-pb-2">{{ $t('scheduleEditor.to') }}</span>
              <b-form-input v-model="valuePick.endTime" type="time" />
            </label>
          </b-col>
        </b-row>
      </div>
      <div v-else>
        <b-row>
          <b-col align="center">
            <img src="/assets/radio.gif" :alt="$t('loading')" />
          </b-col>
        </b-row>
      </div>

      <template #modal-footer="{ ok, cancel }">
        <div class="tw-flex tw-justify-between tw-items-center tw-w-full">
          <span
            v-html="$t('scheduleEditor.projectedDuration', { duration: projectedTimeslotDuration })"
          />

          <div class="tw-space-x-2">
            <b-button @click="cancel()">
              {{ $t('cancel') }}
            </b-button>
            <b-button variant="primary" @click="ok()"> OK </b-button>
          </div>
        </div>
      </template>
    </b-modal>
  </div>
</template>

<script>
import { mapGetters } from 'vuex'
import prettyDate from '../../mixins/prettyDate'
import rrules from '../../mixins/rrules'
import ServerErrors from '@/components/ServerErrors.vue'
import { getISODateString, getTimeString } from '@/utilities'
function narf_do() {
  console.log('gogo ')
}
narf_do()

export default {
  components: { ServerErrors },
  mixins: [prettyDate, rrules],
  emits: ['conflict'],
  data() {
    return {
      newSchedule: null,
      loadedModal: false,
      submitting: false,
      pastEventWarning: false,
      serverErrors: [],
      initialLastDate: null,
      valuePick: {
        firstDate: null,
        startTime: null,
        endTime: null,
        lastDate: null,
        rrule: 1,
      },
    }
  },

  computed: {
    loaded() {
      return {
        shows: this.$store.state.shows.loaded['shows'],
        modal: this.loadedModal,
      }
    },

    projectedTimeslotDuration() {
      const { firstDate, startTime, endTime } = this.valuePick

      const d1 = new Date(`${firstDate} ${startTime}`)
      const d2 = new Date(`${this.initialLastDate} ${endTime}`)

      const diffInNs = (d2 - d1) * 1000 * 1000
      const diffInMinutes = this.nanosecondsToMinutes(diffInNs)

      return this.minutesToHm(diffInMinutes)
    },

    ...mapGetters({
      selectedShow: 'shows/selectedShow',
    }),
  },

  methods: {
    async create(event) {
      // prevent the modal from closing automatically on click
      event.preventDefault()
      // check for past dates; as past dates will be ignored by steering we
      // want to make the user aware - otherwise it might get confusing in
      // conflict resolution
      let now = this.apiDate(new Date())
      if (this.valuePick.firstDate < now) {
        this.valuePick.firstDate = now
        this.pastEventWarning = true
        return
      } else {
        this.pastEventWarning = false
      }
      // take all values that have been picked and put them into our new
      // schedule. so far we do not need any transformations.
      this.newSchedule.schedule.first_date = this.valuePick.firstDate
      this.newSchedule.schedule.start_time = this.valuePick.startTime
      this.newSchedule.schedule.end_time = this.valuePick.endTime
      this.newSchedule.schedule.last_date = this.valuePick.lastDate
      this.newSchedule.schedule.rrule = this.valuePick.rrule
      this.newSchedule.schedule.by_weekday = this.getWeekdayFromApiDate(this.valuePick.firstDate)

      // ok then, let's submit and see if any conflicts arise
      this.submitting = true
      this.serverErrors = []
      try {
        await this.$store.dispatch('shows/submitSchedule', {
          showId: this.selectedShow.id,
          schedule: this.newSchedule,
        })
        this.$refs.modalEmissionManagerCreate.hide()
      } catch (e) {
        const responseData = e.response?.data
        if (e.response?.status === 409) {
          this.$emit('conflict', responseData)
          this.$refs.modalEmissionManagerCreate.hide()
        } else {
          this.serverErrors = e.errors ?? []
        }
      } finally {
        this.submitting = false
      }
    },

    // initialise a new schedule and open the modal
    open(start, end) {
      let firstDate = getISODateString(start)
      const startTime = getTimeString(start)
      const endTime = getTimeString(end)
      const lastDate = getISODateString(end)
      const now = this.apiDate(new Date())
      if (firstDate < now) {
        firstDate = now
        this.pastEventWarning = true
      } else {
        this.pastEventWarning = false
      }
      this.valuePick.firstDate = firstDate
      this.valuePick.startTime = startTime
      this.valuePick.endTime = endTime
      this.valuePick.lastDate = lastDate
      this.initialLastDate = lastDate
      this.newSchedule = {
        schedule: {
          rrule: 1,
          show: 0,
          by_weekday: 0,
          first_date: firstDate,
          start_time: startTime,
          end_time: endTime,
          last_date: lastDate,
          is_repetition: false,
          add_days_no: 0,
          add_business_days_only: false,
          default_playlist_id: 0,
          automation_id: 0,
        },
      }
      this.loadedModal = true
      this.submitting = false
      this.$refs.modalEmissionManagerCreate.show()
    },
  },
}
</script>

<style scoped>
.row {
  margin-bottom: 1em;
}
</style>