import { IGenericFields } from '../../../generic/types';
import { ISlackSection, ISlackTextObject } from '../../types/index';
import { getMethods } from '../methods';

function transformFields({ props, children }: IGenericFields): Array<ISlackSection>;
function transformFields({ props, children }: IGenericFields): Array<ISlackTextObject>;
function transformFields ({ props, children }: IGenericFields) {
  const textTypes = ['plain_text', 'mrkdwn'];
  const column = props.column || 2;
  // if two columns transform to Slack fields list,
  // otherwise transform to list of the Slack sections
  if (column === 2) {
    return children.map(item => {
      const transformed = getMethods(item.type)(item);
      if (!textTypes.includes(transformed?.type) && transformed.text) { // handle section-like elements, e.g. header
        return transformed.text;
      }
      return transformed;
    });
  } else {
    const result =  [];
    for (let i = 0; i < children.length + column - 1; i = i + column) {
      const section = getMethods('section')({ 
        children: children.slice(i, i + column)
      });
      
      if (Array.isArray(section)) {
        result.push(...section);
      } else { 
        result.push(section);
      }
    }
    return result;
  }

}

export {
  transformFields
};