import { IGenericSection } from "../../../../generic/types";
import { getMethods } from "../methods";
import { IRWCAnswerComponent, IRWCMessage } from "../../../types";
import { RWCv5Message } from "../../../classes/v5";

export const transformSection = ( { children }: IGenericSection) => {
    const groupedTypes = ['card', 'button'];
    const components = [] as Array<IRWCAnswerComponent>;
    const messages = [] as Array<IRWCMessage>;
    const [ buttons, cards, rest ] = children.reduce((acc, item) => {
        const [buttons, cards, rest] = acc;
        if (groupedTypes.includes(item.type)) {
            return item.type === 'card' ? [buttons, [...cards, item], rest] : [[...buttons, item], cards, rest];
        }

        return [buttons, cards, [...rest, item]];
    }, [[], [], []]);

    if (cards.length) components.push(getMethods("carousel")({children: cards}));
    if (buttons.length) components.push(getMethods("buttonList")({ children: buttons}));

    for (const item of rest) {
        const res = getMethods(item.type)(item);
        let comps, msgs;
        if (res instanceof RWCv5Message) {
            messages.push(res);
            continue;
        } else {
            comps = res?.components || res;
            msgs = res?.messages || [];
        }

        messages.push(...msgs);
        Array.isArray(comps) ? components.push(...comps) : components.push(comps);
    }

    return {components, messages};
};