import { CalendarWrapper } from '../lib/wrappers/CalendarWrapper'
import { TimeGridViewWrapper } from '../lib/wrappers/TimeGridViewWrapper'
import { waitEventDrag } from '../lib/wrappers/interaction-util'

describe('eventAllow', () => {
  pushOptions({
    now: '2016-09-04',
    initialView: 'timeGridWeek',
    scrollTime: '00:00',
    editable: true,
    events: [
      {
        title: 'event 1',
        start: '2016-09-04T01:00',
      },
    ],
  })

  it('disallows dragging when returning false', (done) => { // and given correct params
    let options = {
      eventAllow(dropInfo, event) {
        expect(typeof dropInfo).toBe('object')
        expect(dropInfo.start instanceof Date).toBe(true)
        expect(dropInfo.end instanceof Date).toBe(true)
        expect(typeof event).toBe('object')
        expect(event.title).toBe('event 1')
        return false
      },
    }
    spyOn(options, 'eventAllow').and.callThrough()

    let calendar = initCalendar(options)
    let calendarWrapper = new CalendarWrapper(calendar)
    let timeGridWrapper = new TimeGridViewWrapper(calendar).timeGrid

    let dragging = timeGridWrapper.dragEventToDate(
      calendarWrapper.getFirstEventEl(),
      '2016-09-04T03:00:00',
    )

    waitEventDrag(calendar, dragging).then((modifiedEvent) => {
      expect(modifiedEvent).toBeFalsy() // drop failure?
      expect(options.eventAllow).toHaveBeenCalled()
      done()
    })
  })

  it('allows dragging when returning true', (done) => {
    let options = {
      eventAllow() {
        return true
      },
    }
    spyOn(options, 'eventAllow').and.callThrough()

    let calendar = initCalendar(options)
    let calendarWrapper = new CalendarWrapper(calendar)
    let timeGridWrapper = new TimeGridViewWrapper(calendar).timeGrid

    let dragging = timeGridWrapper.dragEventToDate(
      calendarWrapper.getFirstEventEl(),
      '2016-09-04T03:00:00Z',
    )

    waitEventDrag(calendar, dragging).then((modifiedEvent) => {
      expect(modifiedEvent.start).toEqualDate('2016-09-04T03:00:00Z')
      expect(options.eventAllow).toHaveBeenCalled()
      done()
    })
  })
})
