"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
function _export(target, all) {
    for(var name in all)Object.defineProperty(target, name, {
        enumerable: true,
        get: Object.getOwnPropertyDescriptor(all, name).get
    });
}
_export(exports, {
    get component () {
        return component;
    },
    get mergeConfig () {
        return mergeConfig;
    }
});
const _react = /*#__PURE__*/ _interop_require_default(require("react"));
const _emotion = require("./emotion");
function _interop_require_default(obj) {
    return obj && obj.__esModule ? obj : {
        default: obj
    };
}
const mergeConfig = (baseConfig, userConfig)=>{
    const res = {
        ...baseConfig,
        ...userConfig
    };
    if (res.variations) {
        // copy variations base css
        // eslint-disable-next-line guard-for-in
        for(const key in res.variations){
            const variant = baseConfig.variations[key];
            res.variations[key].css = variant?.css;
            /* start of bad decision */ if (!res.variations[key].true && variant?.true) {
                res.variations[key].true = variant.true;
            }
            /* end of bad decision */ if (variant?.attrs) {
                res.variations[key].attrs = variant.attrs;
            }
        }
    }
    // eslint-disable-next-line guard-for-in
    for(const key in baseConfig.defaults || {}){
        if (!(key in res.defaults)) {
            res.defaults[key] = baseConfig.defaults[key];
        }
    }
    return res;
};
// INFO: Метод, который проводит слияние двух объектов
// INFO: если значение явно указанно как undefined/null/пустая строка, то будет взято значение указанное в default
function mergeWithoutNullable(defaults, componentProps) {
    const props = Object.keys(defaults).reduce((acc, key)=>{
        return {
            ...acc,
            [key]: [
                null,
                undefined,
                ''
            ].includes(componentProps[key]) ? defaults[key] : componentProps[key]
        };
    }, {});
    return {
        ...componentProps,
        ...props
    };
}
function component(config) {
    const Comp = config.layout((0, _emotion._component)(config));
    return /*#__PURE__*/ _react.default.forwardRef((props, ref)=>{
        const mergedProps = mergeWithoutNullable(config?.defaults, props);
        return /*#__PURE__*/ _react.default.createElement(Comp, {
            ...mergedProps,
            ref: ref
        });
    });
}
