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

const formRWCMessage = (data: Array<IRWCAnswerComponent> | IRWCAnswerComponent): IRWCMessage => {
    const source = Array.isArray(data) ? [...data] : [data];

    const [message, medias] = source.reduce((acc, component) => {
        const [message, medias] = acc;
        if (component.name === "rwc-text") {
            return [message + '' + component.vBind?.text, medias];
        }

        if (component.name === "rwc-medias") {
            return [message, [...(component.vBind?.medias || []), ...medias]];
        }

        return [message, medias];
    }, ["", []]);

    return new RWCv5Message(message, data, medias);
};

export const transformGenericToRWCv5 = (msg: IGenericWrapper) => {
    const { children } = msg;

    const res: Array<IRWCMessage> = children.reduce((acc, child) => {
        const res = getMethods(child.type)(child);
        if (res instanceof RWCv5Message) {
            acc.push(res);
            return acc;
        }
        const components = res.components || (Array.isArray(res) ? res : [res]);
        const messages = res.messages || [];

         if(components.length) acc.push(formRWCMessage(components));
         acc.push(...messages);

        return acc;
    }, []);

    return {
        messages: [...res]
    };
};