import { mount } from '@vue/test-utils'
import { asyncExpect } from '@/tests/utils'
import moment from 'moment'
import MockDate from 'mockdate'
import DatePicker from '..'
import {
  selectDateFromBody,
  openPanel,
  clearInput,
  nextYear,
  nextMonth,
  hasSelected,
  $$,
} from './utils'
import focusTest from '../../../tests/shared/focusTest'
describe('DatePicker', () => {
  focusTest(DatePicker)
  beforeEach(() => {
    document.body.outerHTML = ''
    MockDate.set(moment('2016-11-22'))
  })
  afterEach(() => {
    MockDate.reset()
  })
  it('prop locale should works', async () => {
    const locale = {
      lang: {
        placeholder: 'Избери дата',
        rangePlaceholder: [
          'Начална дата',
          'Крайна дата',
        ],
        today: 'Днес',
        now: 'Сега',
        backToToday: 'Към днес',
        ok: 'Добре',
        clear: 'Изчистване',
        month: 'Месец',
        year: 'Година',
        timeSelect: 'Избор на час',
        dateSelect: 'Избор на дата',
        monthSelect: 'Избор на месец',
        yearSelect: 'Избор на година',
        decadeSelect: 'Десетилетие',
        previousMonth: 'Предишен месец (PageUp)',
        nextMonth: 'Следващ месец (PageDown)',
        previousYear: 'Последна година (Control + left)',
        nextYear: 'Следваща година (Control + right)',
        previousDecade: 'Предишно десетилетие',
        nextDecade: 'Следващо десетилетие',
        previousCentury: 'Последен век',
        nextCentury: 'Следващ век',
        yearFormat: 'YYYY',
        dateFormat: 'D M YYYY',
        dayFormat: 'D',
        dateTimeFormat: 'D M YYYY HH:mm:ss',
        monthBeforeYear: true,
      },
      timePickerLocale: {
        placeholder: 'Избор на час',
      },
    }
    const birthday = moment('2000-01-01', 'YYYY-MM-DD')
    const wrapper = mount({
      render () {
        return 
      },
    })
    await asyncExpect(() => {
      expect(wrapper.html()).toMatchSnapshot()
    })
  })
  // Fix https://github.com/ant-design/ant-design/issues/8885
  it('control value after panel closed', async () => {
    const Test = {
      data () {
        return {
          cleared: false,
          value: moment(),
        }
      },
      methods: {
        onChange  (value) {
          let cleared = this.cleared
          if (cleared) {
            value = moment(moment(value).format('YYYY-MM-DD 12:12:12'))
            cleared = false
          }
          if (!value) {
            cleared = true
          }
          this.value = value
          this.cleared = cleared
        },
      },
      render () {
        return (
          
        )
      },
    }
    const wrapper = mount(Test, { sync: false, attachToDocument: true })
    await asyncExpect(() => {
      // clear input
      clearInput(wrapper)
    })
    await asyncExpect(() => {
      openPanel(wrapper)
    })
    await asyncExpect(() => {
      selectDateFromBody(moment('2016-11-13'))
    }, 0)
    await asyncExpect(() => {
      expect($$('.ant-calendar-input')[0].value).toBe('2016-11-13 12:12:12')
    })
    await asyncExpect(() => {
      selectDateFromBody(moment('2016-11-14'))
    })
    await asyncExpect(() => {
      expect($$('.ant-calendar-input')[0].value).toBe('2016-11-14 12:12:12')
    })
    await asyncExpect(() => {
    })
  })
  it('triggers onChange only when date was selected', async () => {
    const handleChange = jest.fn()
    const wrapper = mount({
      render () {
        return 
      },
    }, { sync: false, attachToDocument: true })
    await asyncExpect(() => {
      openPanel(wrapper)
    }, 0)
    await asyncExpect(() => {
      nextYear()
    }, 1000)
    await asyncExpect(() => {
      expect(handleChange).not.toBeCalled()
    }, 0)
    await asyncExpect(() => {
      nextMonth()
    }, 0)
    await asyncExpect(() => {
      expect(handleChange).not.toBeCalled()
    })
    await asyncExpect(() => {
      selectDateFromBody(moment('2017-12-22'))
    }, 1000)
    await asyncExpect(() => {
      expect(handleChange).toBeCalled()
    }, 0)
  })
  it('clear input', async () => {
    const wrapper = mount(DatePicker, { sync: false, attachToDocument: true })
    await asyncExpect(() => {
      openPanel(wrapper)
    }, 0)
    await asyncExpect(() => {
      selectDateFromBody(moment('2016-11-23'))
    }, 100)
    await asyncExpect(() => {
      clearInput(wrapper)
    }, 1000)
    await asyncExpect(() => {
      openPanel(wrapper)
    }, 0)
    await asyncExpect(() => {
      expect(hasSelected(wrapper, moment('2016-11-22'))).toBe(true)
    }, 0)
  })
})