import { useEffect, useState, useCallback } from 'react';
import { equals } from 'ramda';
import { addAttribute, editAttribute, removeAttribute } from '@reltio/mdm-sdk';
import { useMdmAction } from '../../../contexts/MdmModuleContext';
export var useEditMetaInfo = function (_a) {
    var initialAttributeValue = _a.initialAttributeValue, attributeType = _a.attributeType;
    var modifyAttribute = useMdmAction('modifyAttribute');
    var _b = useState(initialAttributeValue), attributeValue = _b[0], setAttributeValue = _b[1];
    useEffect(function () {
        setAttributeValue(initialAttributeValue);
    }, [initialAttributeValue]);
    var nestingLevel = 1;
    var hasChanges = !equals(attributeValue, initialAttributeValue);
    var addAttributes = useCallback(function (attributes) {
        setAttributeValue(function (prevAttrValue) {
            return attributes.reduce(function (attrValue, attribute) {
                var attributeType = attribute.attributeType, parentUri = attribute.parentUri, index = attribute.index;
                return addAttribute({
                    entity: attrValue,
                    attributeType: attributeType,
                    parentUri: parentUri,
                    index: index,
                    nestingLevel: nestingLevel
                });
            }, prevAttrValue);
        });
    }, []);
    var changeAttribute = useCallback(function (_a) {
        var value = _a.value, attributeType = _a.attributeType, uri = _a.uri;
        setAttributeValue(function (prevAttrValue) {
            return editAttribute({
                entity: prevAttrValue,
                attributeType: attributeType,
                uri: uri,
                value: value,
                nestingLevel: nestingLevel
            });
        });
    }, []);
    var deleteAttribute = useCallback(function (_a) {
        var attributeType = _a.attributeType, uri = _a.uri;
        setAttributeValue(function (prevAttrValue) {
            return removeAttribute({ entity: prevAttrValue, attributeType: attributeType, uri: uri, nestingLevel: nestingLevel });
        });
    }, []);
    var clearLocalChanges = useCallback(function () {
        setAttributeValue(initialAttributeValue);
    }, [initialAttributeValue]);
    var applyLocalChanges = useCallback(function () {
        modifyAttribute({ value: attributeValue, attributeType: attributeType, uri: attributeValue.uri });
    }, [attributeValue, attributeType, modifyAttribute]);
    return {
        addAttributes: addAttributes,
        changeAttribute: changeAttribute,
        deleteAttribute: deleteAttribute,
        clearLocalChanges: clearLocalChanges,
        applyLocalChanges: applyLocalChanges,
        attributeValue: attributeValue,
        hasChanges: hasChanges
    };
};
