import React, { PureComponent } from 'react';
import createIconSet from './createIconSet';
export default function createMultiStyleIconSet(styles, optionsInput = {}) {
    const styleNames = Object.keys(styles);
    if (styleNames.length === 0) {
        throw new Error('You need to add at least one style');
    }
    const options = {
        defaultStyle: styleNames[0],
        fallbackFamily: (_unused) => styleNames[0],
        glyphValidator: (_unused, __unused) => true,
        ...optionsInput,
    };
    const iconSets = styleNames.reduce((acc, name) => {
        const style = styles[name];
        acc[name] = createIconSet(style.glyphMap || {}, style.fontFamily || '', style.fontFile || '', style.fontStyle || {});
        return acc;
    }, {});
    function styleFromProps(props) {
        return Object.keys(props).reduce((result, propName) => styleNames.indexOf(propName) !== -1 && props[propName] === true
            ? propName
            : result, options.defaultStyle);
    }
    function getIconSetForProps(props) {
        const { name } = props;
        const style = styleFromProps(props);
        if (options.glyphValidator(name, style))
            return iconSets[style];
        const family = options.fallbackFamily(name);
        if (styleNames.indexOf(family) === -1) {
            return options.defaultStyle;
        }
        return iconSets[family];
    }
    function selectIconClass(iconSet, iconClass) {
        return iconClass.length > 0 ? iconSet[iconClass] : iconSet;
    }
    function reduceProps(props) {
        return Object.keys(props).reduce((acc, prop) => {
            if (styleNames.indexOf(prop) === -1) {
                acc[prop] = props[prop];
            }
            return acc;
        }, {});
    }
    function getStyledIconSet(style, name = '') {
        if (styleNames.indexOf(style) === -1) {
            return iconSets[options.defaultStyle];
        }
        return !name
            ? iconSets[styleFromProps({ [style]: true })]
            : getIconSetForProps({ name, [style]: true });
    }
    function getFontFamily(style = options.defaultStyle) {
        return getStyledIconSet(style).getFontFamily();
    }
    function getRawGlyphMap(style = options.defaultStyle) {
        return getStyledIconSet(style).getRawGlyphMap();
    }
    function hasIcon(name, style = options.defaultStyle) {
        return options.glyphValidator(name, style);
    }
    function createStyledIconClass(selectClass = '') {
        class IconClass extends PureComponent {
            render() {
                const selectedIconSet = getIconSetForProps(this.props);
                const SelectedIconClass = selectIconClass(selectedIconSet, selectClass);
                const props = reduceProps(this.props);
                return React.createElement(SelectedIconClass, props);
            }
        }
        IconClass.defaultProps = styleNames.reduce((acc, name) => {
            acc[name] = false;
            return acc;
        }, {});
        IconClass.font = Object.values(styles).reduce((acc, style) => {
            acc[style.fontFamily] = style.fontFile;
            return acc;
        }, {});
        IconClass.StyledIconSet = getStyledIconSet;
        IconClass.getFontFamily = getFontFamily;
        IconClass.getRawGlyphMap = getRawGlyphMap;
        IconClass.hasIcon = hasIcon;
        return IconClass;
    }
    const Icon = createStyledIconClass();
    Icon.Button = createStyledIconClass('Button');
    return Icon;
}
//# sourceMappingURL=createMultiStyleIconSet.js.map