import { extend } from '../vue';
import { SLOT_NAME_DEFAULT } from '../constants/slots';
import { hasNormalizedSlot, normalizeSlot } from '../utils/normalize-slot';
import { concat } from '../utils/array';

// @vue/component
const normalizeSlotMixin = extend({
  methods: {
    // Returns `true` if the either a `$scopedSlot` or `$slot` exists with the specified name
    // `name` can be a string name or an array of names
    hasNormalizedSlot() {
      let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : SLOT_NAME_DEFAULT;
      let scopedSlots = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.$scopedSlots;
      let slots = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.$slots;
      return hasNormalizedSlot(name, scopedSlots, slots);
    },
    // Returns an array of rendered VNodes if slot found, otherwise `undefined`
    // `name` can be a string name or an array of names
    normalizeSlot() {
      let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : SLOT_NAME_DEFAULT;
      let scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      let scopedSlots = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.$scopedSlots;
      let slots = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.$slots;
      const vNodes = normalizeSlot(name, scope, scopedSlots, slots);
      return vNodes ? concat(vNodes) : vNodes;
    }
  }
});

export { normalizeSlotMixin };
