// Extends the String type and other string helper functions
import wrapAnsi from 'wrap-ansi'

// Adds a .toTitleCase() function to every string
String.prototype.toTitleCase = function () {
  return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()})
}

// Wraps the string to the console (or specified) width, ignoring any ansi formatting codes
String.prototype.wordWrap = function (width = 80) {
  return wrapAnsi(this, width)
}

export const repeatString = (str, n) => {
    return new Array(1 + (n || 0)).join(str)
}

String.prototype.centerInConsole = function (width = 80) {
  const consoleWidth = process.stdout.columns
  const padding = Math.floor((consoleWidth - width) / 2)
  const lines = this.split('\n')
  const centered = lines.map(line => repeatString(" ", padding) + line)
  return centered.join('\n')
}

// Centers a one-line string within the given number of characters by adding padding to the left
String.prototype.centerInLine = function (lineWidth, width = 80) {
  const padding = Math.floor((width - lineWidth) / 2)
  return repeatString(" ", padding) + this
}

export const centerLines = (str) => {
  const lines = str.split('\n')
  const centered = lines.map(line => line.centerInLine(line.length, process.stdout.columns))
  return centered.join('\n')
}