import React from "react";
import { _component } from "./styled-components";
export 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
    };
}
export function component(config) {
    const Comp = config.layout(_component(config));
    return /*#__PURE__*/ React.forwardRef((props, ref)=>{
        const mergedProps = mergeWithoutNullable(config?.defaults, props);
        return /*#__PURE__*/ React.createElement(Comp, {
            ...mergedProps,
            ref: ref
        });
    });
}
