<script>
import PropTypes from '../_util/vue-types'
import { getOptionProps } from '../_util/props-util'

function isString (str) {
  return typeof str === 'string'
}

export default {
  name: 'Step',
  props: {
    prefixCls: PropTypes.string,
    wrapperStyle: PropTypes.object,
    // itemWidth: PropTypes.oneOfType([
    //   PropTypes.number,
    //   PropTypes.string,
    // ]),
    status: PropTypes.string,
    iconPrefix: PropTypes.string,
    icon: PropTypes.node,
    // adjustMarginRight: PropTypes.oneOfType([
    //   PropTypes.number,
    //   PropTypes.string,
    // ]),
    stepNumber: PropTypes.string,
    description: PropTypes.any,
    title: PropTypes.any,
    progressDot: PropTypes.oneOfType([
      PropTypes.bool,
      PropTypes.func,
    ]),
    tailContent: PropTypes.any,
  },
  methods: {
    renderIconNode () {
      const {
        prefixCls, progressDot, stepNumber, status, title, description,
        iconPrefix,
      } = getOptionProps(this)
      const icon = this.icon || this.$slots.default
      let iconNode
      const iconClassName = {
        [`${prefixCls}-icon`]: true,
        [`${iconPrefix}icon`]: true,
        [`${iconPrefix}icon-${icon}`]: icon && isString(icon),
        [`${iconPrefix}icon-check`]: !icon && status === 'finish',
        [`${iconPrefix}icon-cross`]: !icon && status === 'error',
      }
      const iconDot = <span class={`${prefixCls}-icon-dot`}></span>
      // `progressDot` enjoy the highest priority
      if (progressDot) {
        if (typeof progressDot === 'function') {
          iconNode = (
            <span class={`${prefixCls}-icon`}>
              {progressDot(iconDot, { index: stepNumber - 1, status, title, description })}
            </span>
          )
        } else {
          iconNode = <span class={`${prefixCls}-icon`}>{iconDot}</span>
        }
      } else if (icon && !isString(icon)) {
        iconNode = <span class={`${prefixCls}-icon`}>{icon}</span>
      } else if (icon || status === 'finish' || status === 'error') {
        iconNode = <span class={iconClassName} />
      } else {
        iconNode = <span class={`${prefixCls}-icon`}>{stepNumber}</span>
      }
      return iconNode
    },
  },
  render () {
    const {
      prefixCls,
      status = 'wait', icon,
      description, title, tailContent,
      ...restProps
    } = getOptionProps(this)

    const classString = {
      [`${prefixCls}-item`]: true,
      [`${prefixCls}-item-${status}`]: true,
      [`${prefixCls}-item-custom`]: icon,
    }
    const stepProps = {
      props: {
        ...restProps,
      },
      class: classString,
      on: this.$listeners,
    }

    return (
      <div
        {...stepProps}
      >
        <div class={`${prefixCls}-item-tail`}>
          {tailContent}
        </div>
        <div class={`${prefixCls}-item-icon`}>
          {this.renderIconNode()}
        </div>
        <div class={`${prefixCls}-item-content`}>
          <div class={`${prefixCls}-item-title`}>
            {title}
          </div>
          {description && <div class={`${prefixCls}-item-description`}>{description}</div>}
        </div>
      </div>
    )
  },
}
</script>