export default class FormDataToObject {

static toObject(formData) {
  var formDataToObject = new FormDataToObject(formData)
  return formDataToObject.toObject()
}

constructor(formData) {
  this.formData = formData
}

toObject() {
  var result = {}

  for(var entry of this.formData.entries()) {
    var key = entry[0]
    var value = entry[1]

    this.treatInitial(key, value, result)
  }

  return result
}

treatInitial(key, value, result) {
  var firstMatch = key.match(/^(.+?)(\[([\s\S]+$))/)

  if (firstMatch) {
    var inputName = firstMatch[1]
    var rest = firstMatch[2]

    if (inputName in result) {
      var newResult = result[inputName]
    } else if (rest == "[]") {
      var newResult = []
      result[inputName] = newResult
    } else {
      var newResult = {}
      result[inputName] = newResult
    }

    this.treatSecond(value, rest, newResult)
  } else {
    result[key] = value
  }
}

treatSecond(value, rest, result) {
  var secondMatch = rest.match(/^\[(.*?)\]([\s\S]*)$/)
  var key = secondMatch[1]
  var newRest = secondMatch[2]

  if (rest == "[]") {
    result.push(value)
  } else if (newRest == "") {
    result[key] = value
  } else {
    if (key in result) {
      var newResult = result[key]
    } else if (newRest == "[]") {
      var newResult = []
      result[key] = newResult
    } else {
      var newResult = {}
      result[key] = newResult
    }

    this.treatSecond(value, newRest, newResult)
  }
}

}