import flatpickr from 'flatpickr';
import 'flatpickr/dist/flatpickr.min.css';
import { Widget } from "./Widget";
import { Mandarin } from "flatpickr/dist/l10n/zh.js"
import { print } from '../printsdk/printIndex';
//   locale: Mandarin, 
import 'flatpickr/dist/themes/material_orange.css';
//   locale: Mandarin, 
// flatpickr.localize(Mandarin);
flatpickr.setDefaults({
  time_24hr: true,
  // 是否显示pm am
  locale: Mandarin,
  allowInput: true,

});
/**
 * @class ui.DateSelect
 * @since ui
 */
export class DateSelect extends Widget {

  /**
 * @hideconstructor
 * @param {string} [type] 日期选择类型,可选值为date|daterange|year|month|datetime|datetimerange。
 * @param {string} [placeholder] 占位符内容。
 * @param {string|string[]} [value] 选择具体的日期,格式为:yyyy-MM-dd|yyyy-MM-dd HH:mm
 * @param {Function} [onChange] 更新选择日期触发事件。
 * @param {Boolean} [disabled] 是否禁用日期组件。
 * @param {Object} [style] 组件样式。
 * @return ui.DateSelect
 */
  type: string;
  placeholder: string;
  value: string | string[];
  onChange: Function;
  disabled: boolean;
  constructor(
    {
      type = 'date',
      placeholder = '请输入数值',
      value = '',
      onChange = (value: string | string[]) => { print("选择的日期:" + value) },
      disabled = false,
      style = {}
    }: {
      type?: string,
      placeholder?: string, value?: string | string[], onChange?: Function, disabled?: boolean, style?: object
    }

  ) {
    super(null)
    this.type = type
    this.value = value
    this.placeholder = placeholder
    this.onChange = onChange
    this.disabled = disabled
    let render = this.render(this.type, this.placeholder, this.value, this.onChange, this.disabled)
    super(render, style)
    if (!(this instanceof DateSelect)) {
      return new DateSelect({ type, placeholder, value, onChange, disabled, style });
    }

  }

  private render(type: string, placeholder: string, value: string | string[], onChange: Function, disabled?: boolean) {
    // date | daterange | year | month | datetime | datetimerange。
    const form = document.createElement('form')
    form.classList.add('ui-datepicker-form')
    const inp = document.createElement('input') as HTMLInputElement;
    // inp.addEventListener('focus', () => {
    //   inp.style.border = '1px solid blue';
    // });
    inp.classList.add('ui-datepicker')
    inp.placeholder = placeholder
    disabled ? inp.disabled = disabled : false
    // switch (type) {
    //   case 'datetime':
    //     flatpickr(inp, {
    //       enableTime: true,
    //       dateFormat: "Y年m月d日 H:i",
    //       defaultDate: this.value,
    //       onChange: function (selectedDates, dateStr, instance) {
    //         onChange?.(dateStr);
    //       },
    //     });
    //     form.appendChild(inp);
    //     break;
    //   case 'daterange':
    //     const picker = flatpickr(inp, {
    //       mode: 'range',
    //       dateFormat: "Y年m月d日",
    //       defaultDate: value,
    //       onChange: function (selectedDates, dateStr, instance) {
    //         onChange?.(dateStr);
    //       },
    //     });
    if (type == 'datetime') {
      const datepicker = flatpickr(inp, {
        enableTime: true,
        dateFormat: "Y年m月d日 H:i",
        defaultDate: value,

        onChange: function (selectedDates, dateStr, instance) {
          onChange(dateStr)
        },
      });
      form.appendChild(inp)

    }
    if (type == 'daterange') {
      let rangevValue = [].concat(value)
      // console.log('啊实打实阿萨德的value', value);
      const datepicker = flatpickr(inp, {
        mode: 'range',
        dateFormat: "Y年m月d日",

        defaultDate: rangevValue,
        onChange: function (selectedDates, dateStr, instance) {
          onChange(dateStr)
        },
      });
      // datepicker.setDate(value);
      form.appendChild(inp)

    }
    if (type == 'date') {
      flatpickr(inp, {
        defaultDate: value,
        dateFormat: "Y年m月d日",
        onChange: function (selectedDates, dateStr, instance) {
          onChange(dateStr)
        },
      });
      form.appendChild(inp)

    }
    if (type == 'datetimerange') {
      let rangevValue = [].concat(value)
      // console.log('这是传入的value', value);
      // console.log('这是拷贝value', rangevValue);
      const datepicker = flatpickr(inp, {
        mode: "range",
        enableTime: true,

        dateFormat: "Y年m月d日 H:i",
        defaultDate: rangevValue,
        onChange: function (selectedDates, dateStr, instance) {
          onChange(dateStr)
        },
      });
      form.appendChild(inp)

    }
    if (type == 'year') {
      flatpickr(inp, {
        dateFormat: "Y年",

        defaultDate: value,
        onChange: function (selectedDates, dateStr, instance) {
          onChange(dateStr)
        },
      });
      form.appendChild(inp)

    }
    if (type == 'month') {
      flatpickr(inp, {
        dateFormat: "m月",
        defaultDate: value,

        onChange: function (selectedDates, dateStr, instance) {
          onChange(dateStr)
        },
      });
      form.appendChild(inp)
    }
    return form
  }
  /**
   * 设置日期选择器类型。
   * @param {string} type 日期选择器类型,可选值为date|daterange|year|month|datetime|datetimerange
   * @return ui.DateSelect
   */
  setType(type: string) {

    this.type = type;
    let render = this.render(this.type, this.placeholder, this.value, this.onChange, this.disabled)
    // Remove old elements
    while (this.el.firstChild) {
      this.el.removeChild(this.el.firstChild);
    }
    // Append new elements
    this.el.appendChild(render);

  }
  /**
 * 获取日期选择器类型。
 */
  getType() {
    return this.type
  }
  /**
   * 设置占位符内容。
   * @param {string} placeholder 
   * @returns  ui.DateSelect
   */
  setPlaceholder(placeholder: string) {
    this.placeholder = placeholder
    let render = this.render(this.type, this.placeholder, this.value, this.onChange, this.disabled)
    // Remove old elements
    while (this.el.firstChild) {
      this.el.removeChild(this.el.firstChild);
    }
    // Append new elements
    this.el.appendChild(render);
  }
  /**
* 返回占位符内容
*/
  getPlaceholder() {
    return this.placeholder
  }
  /**
   *  设置日期内容。
   * @param {string | string[]}value 
   * @return  ui.DateSelect
   */
  setValue(value: string | string[]) {
    this.value = value
    let render = this.render(this.type, this.placeholder, this.value, this.onChange, this.disabled)
    // Remove old elements
    while (this.el.firstChild) {
      this.el.removeChild(this.el.firstChild);
    }
    // Append new elements
    this.el.appendChild(render);
  }
  /**
* 返回日期内容
*/
  getValue() {
    return this.value
  }
  /**
   * 设置是否禁用。
   * @param {Boolean} disabled 
   * @return  ui.DateSelect
   */
  setDisabled(disabled: boolean) {
    this.disabled = disabled
    let render = this.render(this.type, this.placeholder, this.value, this.onChange, this.disabled)
    // Remove old elements
    while (this.el.firstChild) {
      this.el.removeChild(this.el.firstChild);
    }
    // Append new elements
    this.el.appendChild(render);
  }
  /**
 * 返回是否禁用。
 */
  getDisabled() {
    return this.disabled
  }
  /**
   * 设置日期选择器组件样式。
   * @param {Object} style 日期选择器样式。
   * 
   */
  setStyle(style: object) {
    for (let key in style) {
      if (key === 'position') {
        const pos = this.posDic[style[key]];
        if (pos) {
          (this.el as HTMLElement).classList.add('positioned', ...pos);
        }
      } else {
        this.styleDic.set(key, style[key]);
        (this.el as HTMLElement).style[key] = style[key];
      }
    }
    return this
  }
  /**
* 返回日期选择器样式
*/
  getStyle() {
    return this.styleDic.style
  }
}