import { Component } from './Component'
import { createVNode } from './createVNode'
import { isVNode } from './isVNode'
import { VNode } from './VNode'

/**
 * x
 *
 * @param  name {string | Component}
 * @param  props {object}
 * @param  ... {object}
 * @return {VNode}
 */
export function x (
  name: string | Component | ((name, props, ...rest) => VNode),
  props: any,
  ...rest: any[]
): VNode {
  const children: VNode[] = []

  while (rest.length) {
    const node = rest.pop()
    if (node && Array.isArray(node)) {
      rest = rest.concat(node)
    } else if (node != null && node !== true && node !== false) {
      children.unshift((isVNode(node) && node) || createVNode(true, node))
    }
  }

  return createVNode(false, name, props || {}, children)
}
