const dedent = require('dedent')
const objectorarray = require('objectorarray')
const parse = require('fast-json-parse')

module.exports = endent

const ENDENT_ID = 'twhZNwxI1aFG3r4'

function endent (strings, ...values) {
  const raw = typeof strings === 'string' ? [strings] : strings.raw

  let result = ''

  for (let i = 0; i < raw.length; i++) {
    result += raw[i]

    if (i < values.length) {
      let value = values[i]
      let isJson = false

      if (parse(value).value) {
        value = parse(value).value
        isJson = true
      }

      if ((value && value[ENDENT_ID]) || isJson) {
        let rawlines = result.split('\n')
        let l = rawlines[rawlines.length - 1].search(/\S/)
        let endentation = l > 0 ? ' '.repeat(l) : ''
        let valueJson = isJson ? JSON.stringify(value, null, 2) : value[ENDENT_ID]
        let valueLines = valueJson.split('\n')

        valueLines.forEach((l, index) => {
          if (index > 0) {
            result += ('\n' + endentation + l)
          } else {
            result += l
          }
        })
      } else if (typeof value === 'string' && value.includes('\n')) {
        let endentations = result.match(/(?:^|\n)( *)$/)

        if (typeof value === 'string') {
          let endentation = endentations ? endentations[1] : ''
          result += value
            .split('\n')
            .map((str, i) => {
              str = (ENDENT_ID + str)
              return i === 0 ? str : `${endentation}${str}`
            })
            .join('\n')
        } else {
          result += value
        }
      } else {
        result += value
      }
    }
  }
  result = dedent(result)
  return result.split(ENDENT_ID).join('')
}

endent.pretty = (data) => {
  return objectorarray(data) ? {[ENDENT_ID]: JSON.stringify(data, null, 2)} : data
}
