import { IGenericWrapper } from '../../../generic/types/wrapper';
import { RWCv4Message } from '../../classes/v4';
import { IRWCMessage } from '../../types';

import  { getMethods } from './methods';

function mapBlocks(
  blocks: Array<any>, mergeTextSections = true, prefix?: string, suffix?: string
): Array<IRWCMessage> {
  const result = [];
  for (let i = 0; i < blocks.length; i++) {
    const block = blocks[i];
    result.push(getMethods(block.type)(block));
  }

  const sections = result.length > 0 
    ? result.reduce(
        (acc, item)  => Array.isArray(item) 
          ? acc.concat(...item) 
          : acc.concat(item), 
      [])
    : [];

  if (mergeTextSections) {
    prefix = prefix === undefined ? '<div style="margin: 8px 0;">' : prefix;
    suffix = suffix === undefined ? '</div>' : suffix;
    return sections.reduce((acc, item) => {
      if (acc.length === 0 || item.answerComponent?.component) {
        return acc.concat(new RWCv4Message(item));
      }

      const previous = acc[acc.length-1];
      if (previous.answerComponent?.component || previous.medias?.length) {
        return acc.concat(new RWCv4Message(item));
      }

      if (item.message) {
        if (!previous.message) {
          previous.message = `${prefix}${item.message}${suffix}`.trim();
        } else {
          if (!previous.message.startsWith(prefix) || !previous.message.endsWith(suffix)) {
            previous.message = `${prefix}${previous.message}${suffix}`.trim();
          }
          previous.message = `${previous.message}${prefix}${item.message}${suffix}`.trim();
        }

        previous.messageText = previous.message;
        return acc;
      }
    }, []);
  }

  return sections.map(item => new RWCv4Message(item));
}

export function transformGenericToRWCv4(
  { children, props }: IGenericWrapper, 
  mergeTextSections=props?.rwc?.mergeTextSections, 
  prefix?: string, 
  suffix?: string
) {
  return {
    messages: mapBlocks(children, mergeTextSections, prefix, suffix)
  };
}
