import { ISlackOptionObject, ISlackOptionGroupObject } from '../../types';
import { IGenericOptions, IGenericGroupOptions } from '../../../generic/types/utils/options';
import { transformTextObject } from '../items/text';
import { parseMarkdownToSlackMrkdwn } from '../../parsers/parse-markdown-to-slack-mrkdwn';

function convertGenericSingleOption(item): ISlackOptionObject {
  const type = item?.slack?.type || 'plain_text';
  const text = item?.label || item?.value || item?.name;
  const value = item?.value || item?.name || item?.key;
  const res: ISlackOptionObject = {
    text: {
      type: type,
      text: type === 'plain_text' ?  text : parseMarkdownToSlackMrkdwn(text)
    },

    value
  };

  const emoji = item?.slack?.emoji;
  const verbatim = item?.slack?.verbatim;

  if (typeof emoji === 'boolean') {
    res.text.emoji = emoji;
  }

  if (typeof verbatim === 'boolean') {
    res.text.verbatim = verbatim;
  }

  const description = item.slack?.description;
  const url = item.slack?.url;

  if (description) res.description = transformTextObject(description);
  if (url) res.url = url;

  return res;
}

function convertGenericOptions(arr: Array<IGenericOptions>): Array<ISlackOptionObject> {
  return arr.map(item => convertGenericSingleOption(item));
}

function convertGenericSingleOptionGroup(item) {
  return {
    label: transformTextObject(item.label),
    options: item.options.map(item => convertGenericSingleOption(item))
  };
}

function convertGenericOptionsGroup(arr: Array<IGenericGroupOptions>): Array<ISlackOptionGroupObject> {
  const res: Array<ISlackOptionGroupObject> = [];

  for (let i = 0; i < arr.length; i++) {
    const item = arr[i];
    
    res.push(convertGenericSingleOptionGroup(item));
  }

  return res;
}

export {
  convertGenericOptions,
  convertGenericOptionsGroup,
  convertGenericSingleOption,
  convertGenericSingleOptionGroup
};