import * as plugins from './smartstring.plugins.js';

/**
 * splits a string into an array
 * @param stringArg
 */
const splitStringAtLineBreak = (stringArg: string): string[] => {
  let resultArray = stringArg.split('\n');
  return cleanStringArray(resultArray);
};

/**
 * joins a string together again
 * @param stringArrayArg
 */
const joinStringWithLineBreaks = (stringArrayArg: string[]): string => {
  let resultString: string = '';
  for (let line of stringArrayArg) {
    resultString = resultString + line + '\n'; // add new line at end
  }
  return resultString;
};

/**
 * cleans first and last line in case they are empty
 * @param stringArrayArg
 */
const cleanStringArray = (stringArrayArg: string[]): string[] => {
  let testRegex = /^[\s]*$/;
  if (testRegex.test(stringArrayArg[0])) {
    stringArrayArg.shift();
  }
  if (testRegex.test(stringArrayArg[stringArrayArg.length - 1])) {
    stringArrayArg.pop();
  }
  return stringArrayArg;
};

/**
 * indent an array
 * @param stringArg
 * @param spaceAmount
 */
export const indent = (stringArg: string, spaceAmount: number): string => {
  let localStringArray = splitStringAtLineBreak(stringArg);
  for (let stringArg of localStringArray) {
    stringArg = ' '.repeat(spaceAmount) + stringArg;
  }
  let resultString = joinStringWithLineBreaks(localStringArray);
  return resultString;
};

/**
 * indents a string with prefix
 * @param stringArg
 * @param prefixArg
 */
export const indentWithPrefix = (stringArg: string, prefixArg: string): string => {
  let resultString: string;
  let stringArray = splitStringAtLineBreak(stringArg);
  let resultArray: string[] = [];
  for (let stringItem of stringArray) {
    resultArray.push(prefixArg + stringItem);
  }
  resultString = joinStringWithLineBreaks(resultArray);
  return resultString;
};

export const normalize = (stringArg: string): string => {
  let resultString: string;
  let splitStringArray: string[] = splitStringAtLineBreak(stringArg);
  let minCommonLeftOffset: number;

  const deIndentRegex = /^(\s*)/;
  const emptyLineRegex = /^(\s*)$/;

  for (let stringItem of splitStringArray) {
    let offsetString = deIndentRegex.exec(stringItem)[1];
    if (
      (typeof minCommonLeftOffset === 'undefined' || offsetString.length < minCommonLeftOffset) &&
      !emptyLineRegex.test(stringItem)
    ) {
      minCommonLeftOffset = offsetString.length;
    }
  }
  let resultSplitStringArray = [];
  for (let stringItem of splitStringArray) {
    resultSplitStringArray.push(stringItem.substr(minCommonLeftOffset));
  }
  resultString = joinStringWithLineBreaks(resultSplitStringArray);
  return resultString;
};
