import _mergeJSXProps from 'babel-helper-vue-jsx-merge-props';
import _defineProperty from 'babel-runtime/helpers/defineProperty';
import _extends from 'babel-runtime/helpers/extends';
import _toConsumableArray from 'babel-runtime/helpers/toConsumableArray';
import classNames from 'classnames';
import * as allIcons from '@ant-design/icons/lib/dist';
import VueIcon from '@ant-design/icons-vue';
import PropTypes from '../_util/vue-types';
import createFromIconfontCN from './IconFont';
import { svgBaseProps, withThemeSuffix, removeTypeTheme, getThemeFromTypeName, alias } from './utils';
import warning from '../_util/warning';
import { getTwoToneColor, setTwoToneColor } from './twoTonePrimaryColor';
import { filterEmpty, getClass } from '../_util/props-util';

// Initial setting
VueIcon.add.apply(VueIcon, _toConsumableArray(Object.keys(allIcons).map(function (key) {
  return allIcons[key];
})));
setTwoToneColor('#1890ff');
var defaultTheme = 'outlined';
var dangerousTheme = void 0;

var Icon = {
  functional: true,
  name: 'AIcon',
  props: {
    type: PropTypes.string,
    component: PropTypes.any,
    viewBox: PropTypes.any,
    spin: PropTypes.bool.def(false),
    theme: PropTypes.oneOf(['filled', 'outlined', 'twoTone']),
    twoToneColor: PropTypes.string
  },
  render: function render(h, context) {
    var _extends2;

    var props = context.props,
        slots = context.slots,
        listeners = context.listeners,
        data = context.data;
    var type = props.type,
        Component = props.component,
        viewBox = props.viewBox,
        spin = props.spin,
        theme = props.theme,
        twoToneColor = props.twoToneColor;

    var slotsMap = slots();
    var children = filterEmpty(slotsMap['default']);
    children = children.length === 0 ? undefined : children;
    warning(Boolean(type || Component || children), 'Icon should have `type` prop or `component` prop or `children`.');

    var classString = classNames(_extends({}, getClass(context), (_extends2 = {}, _defineProperty(_extends2, 'anticon', true), _defineProperty(_extends2, 'anticon-' + type, !!type), _extends2)));

    var svgClassString = classNames(_defineProperty({}, 'anticon-spin', !!spin || type === 'loading'));

    var innerNode = void 0;

    // component > children > type
    if (Component) {
      var innerSvgProps = {
        attrs: _extends({}, svgBaseProps, {
          viewBox: viewBox
        }),
        'class': svgClassString
      };
      if (!viewBox) {
        delete innerSvgProps.attrs.viewBox;
      }

      innerNode = h(
        Component,
        innerSvgProps,
        [children]
      );
    }
    if (children) {
      warning(Boolean(viewBox) || children.length === 1 && children[0].tag === 'use', 'Make sure that you provide correct `viewBox`' + ' prop (default `0 0 1024 1024`) to the icon.');
      var _innerSvgProps = {
        attrs: _extends({}, svgBaseProps),
        'class': svgClassString
      };
      innerNode = h(
        'svg',
        _mergeJSXProps([_innerSvgProps, {
          attrs: { viewBox: viewBox }
        }]),
        [children]
      );
    }

    if (typeof type === 'string') {
      var computedType = type;
      if (theme) {
        var themeInName = getThemeFromTypeName(type);
        warning(!themeInName || theme === themeInName, 'The icon name \'' + type + '\' already specify a theme \'' + themeInName + '\',' + (' the \'theme\' prop \'' + theme + '\' will be ignored.'));
      }
      computedType = withThemeSuffix(removeTypeTheme(alias(computedType)), dangerousTheme || theme || defaultTheme);
      innerNode = h(VueIcon, { 'class': svgClassString, attrs: { type: computedType, primaryColor: twoToneColor }
      });
    }
    // functional component not support nativeOn,https://github.com/vuejs/vue/issues/7526
    var iProps = _extends({}, data, {
      on: _extends({}, listeners, data.nativeOn),
      'class': classString,
      staticClass: ''
    });
    return h(
      'i',
      iProps,
      [innerNode]
    );
  }
};

Icon.createFromIconfontCN = createFromIconfontCN;
Icon.getTwoToneColor = getTwoToneColor;
Icon.setTwoToneColor = setTwoToneColor;

/* istanbul ignore next */
Icon.install = function (Vue) {
  Vue.component(Icon.name, Icon);
};

export default Icon;