import { DayGridViewWrapper } from '../lib/wrappers/DayGridViewWrapper.js'
import { TimeGridViewWrapper } from '../lib/wrappers/TimeGridViewWrapper.js'

describe('weekNumbers', () => {
  describe('when using month view', () => {
    pushOptions({
      initialView: 'dayGridMonth',
      fixedWeekCount: true, // will make 6 rows
    })

    describe('with default weekNumbers', () => { // which is false!
      it('should not display week numbers at all', () => {
        let calendar = initCalendar()
        let dayGridWrapper = new DayGridViewWrapper(calendar).dayGrid
        expect(dayGridWrapper.getWeekNumberEls().length).toEqual(0)
      })
    })

    describe('with weekNumbers to false', () => {
      pushOptions({
        weekNumbers: false,
      })

      it('should not display week numbers at all', () => {
        let calendar = initCalendar()
        let dayGridWrapper = new DayGridViewWrapper(calendar).dayGrid
        expect(dayGridWrapper.getWeekNumberEls().length).toEqual(0)
      })
    })

    describe('with weekNumbers to true', () => {
      pushOptions({
        weekNumbers: true,
      })

      it('should display week numbers in the day cells only', () => {
        let calendar = initCalendar()
        let dayGridWrapper = new DayGridViewWrapper(calendar).dayGrid
        expect(dayGridWrapper.getWeekNumberEls().length).toBeGreaterThan(0)
      })
    })
  })

  describe('when using an timeGrid view', () => {
    pushOptions({
      initialView: 'timeGridWeek',
    })

    describe('with default weekNumbers', () => {
      it('should not display week numbers at all', () => {
        let calendar = initCalendar()
        let viewWrapper = new TimeGridViewWrapper(calendar)
        expect(viewWrapper.getHeaderWeekNumberLink()).toBeFalsy()
      })
    })

    describe('with weekNumbers to false', () => {
      pushOptions({
        weekNumbers: false,
      })

      it('should not display week numbers at all', () => {
        let calendar = initCalendar()
        let viewWrapper = new TimeGridViewWrapper(calendar)
        expect(viewWrapper.getHeaderWeekNumberLink()).toBeFalsy()
      })
    })

    describe('with weekNumbers to true', () => {
      pushOptions({
        weekNumbers: true,
      })

      it('should display week numbers in the top left corner only', () => {
        let calendar = initCalendar()
        let viewWrapper = new TimeGridViewWrapper(calendar)
        expect(viewWrapper.getHeaderWeekNumberLink()).toBeTruthy()
      })
    })
  })

  describe('when using in dayGrid view', () => {
    pushOptions({
      initialView: 'dayGridWeek',
    })

    // https://github.com/fullcalendar/fullcalendar/issues/5708
    it('displays events evenly', () => {
      let calendar = initCalendar({
        weekNumbers: true,
        initialDate: '2020-08-07',
        events: [
          { title: 'Event 1', start: '2020-08-02' },
          { title: 'Event 2', start: '2020-08-03' },
        ],
      })
      let gridWrapper = new DayGridViewWrapper(calendar).dayGrid
      let eventEls = gridWrapper.getEventEls()

      expect(
        Math.abs(
          eventEls[0].getBoundingClientRect().top -
          eventEls[1].getBoundingClientRect().top,
        ),
      ).toBeLessThan(1)
    })
  })
})
