import * as moment from 'moment'
import Calendar from '../vc-calendar'
import VcDatePicker from '../vc-calendar/src/Picker'
import Icon from '../icon'
import { hasProp, getOptionProps, initDefaultProps } from '../_util/props-util'
import BaseMixin from '../_util/BaseMixin'
import { WeekPickerProps } from './interface'
import interopDefault from '../_util/interopDefault'

function formatValue (value, format) {
  return (value && value.format(format)) || ''
}
function noop () {}

export default {
  // static defaultProps = {
  //   format: 'YYYY-wo',
  //   allowClear: true,
  // };

  // private input: any;
  props: initDefaultProps(WeekPickerProps(), {
    format: 'gggg-wo',
    allowClear: true,
  }),
  name: 'AWeekPicker',
  mixins: [BaseMixin],
  model: {
    prop: 'value',
    event: 'change',
  },
  data () {
    const value = this.value || this.defaultValue
    if (value && !interopDefault(moment).isMoment(value)) {
      throw new Error(
        'The value/defaultValue of DatePicker or MonthPicker must be ' +
        'a moment object',
      )
    }
    return {
      sValue: value,
    }
  },
  watch: {
    value (val) {
      this.setState({ sValue: val })
    },
  },

  methods: {
    weekDateRender (current) {
      const selectedValue = this.sValue
      const { prefixCls } = this
      if (selectedValue &&
        current.year() === selectedValue.year() &&
        current.week() === selectedValue.week()) {
        return (
          <div class={`${prefixCls}-selected-day`}>
            <div class={`${prefixCls}-date`}>
              {current.date()}
            </div>
          </div>
        )
      }
      return (
        <div class={`${prefixCls}-calendar-date`}>
          {current.date()}
        </div>
      )
    },
    handleChange  (value) {
      if (!hasProp(this, 'value')) {
        this.setState({ sValue: value })
      }
      this.$emit('change', value, formatValue(value, this.format))
    },
    clearSelection (e) {
      e.preventDefault()
      e.stopPropagation()
      this.handleChange(null)
    },

    focus () {
      this.$refs.input.focus()
    },

    blur () {
      this.$refs.input.blur()
    },
  },

  render () {
    const props = getOptionProps(this)
    const {
      prefixCls, disabled, pickerClass, popupStyle,
      pickerInputClass, format, allowClear, locale, localeCode, disabledDate,
      sValue: pickerValue, $listeners, $scopedSlots,
    } = this
    const { focus = noop, blur = noop } = $listeners

    if (pickerValue && localeCode) {
      pickerValue.locale(localeCode)
    }

    const placeholder = hasProp(this, 'placeholder') ? this.placeholder : locale.lang.placeholder
    const weekDateRender = this.dateRender || $scopedSlots.dateRender || this.weekDateRender
    const calendar = (
      <Calendar
        showWeekNumber
        dateRender={weekDateRender}
        prefixCls={prefixCls}
        format={format}
        locale={locale.lang}
        showDateInput={false}
        showToday={false}
        disabledDate={disabledDate}
      />
    )
    const clearIcon = (!disabled && allowClear && this.sValue) ? (
      <Icon
        type='cross-circle'
        class={`${prefixCls}-picker-clear`}
        onClick={this.clearSelection}
      />
    ) : null
    const input = ({ value }) => {
      return (
        <span>
          <input
            ref='input'
            disabled={disabled}
            readOnly
            value={(value && value.format(format)) || ''}
            placeholder={placeholder}
            class={pickerInputClass}
            onFocus={focus}
            onBlur={blur}
          />
          {clearIcon}
          <span class={`${prefixCls}-picker-icon`} />
        </span>
      )
    }
    const vcDatePickerProps = {
      props: {
        ...props,
        calendar,
        prefixCls: `${prefixCls}-picker-container`,
        value: pickerValue,
      },
      on: {
        ...$listeners,
        change: this.handleChange,
      },
      style: popupStyle,
    }
    return (
      <span class={pickerClass}>
        <VcDatePicker
          {...vcDatePickerProps}
        >
          {input}
        </VcDatePicker>
      </span>
    )
  },
}