import { Hypermedia, HypermediaAction, HypermediaField } from 'first-npm-package-nicule/core';

export function groupAs(newName: string, fieldNamesToGroup: Array<string>, flex: Array<number> = [1]): (hypermediaAction: HypermediaAction, hypermedia: Hypermedia) => HypermediaAction {
    return (hypermediaAction: HypermediaAction) => {
        const { fields: oldFields, ...rest } = hypermediaAction;
        const fields = [];
        const groupedFields = [];
        let insertionIndex: number;
        oldFields.forEach((oldField, index) => {
            if (fieldNamesToGroup.includes(oldField.name)) {
                if (insertionIndex === undefined) {
                    insertionIndex = index;
                }
                groupedFields.push(oldField);
            } else {
                fields.push(oldField);
            }
        });
        const newField: HypermediaField = {
            name: newName,
            fields: groupedFields,
            type: 'group',
            flex
        };
        fields.splice(insertionIndex, 0, newField);

        return {
            ...rest,
            fields
        };
    };
}
