import loaderUtils from 'loader-utils'

import {
  extractBlocks
} from './parser'
import {
  splitSourceLine,
  generateMap
} from './util'

module.exports = function (source) {
  this.cacheable && this.cacheable()

  const callback = this.async()
  const loaderQuery = loaderUtils.parseQuery(this.query)
  const type = loaderQuery.type
  let index = loaderQuery.index

  if (index != null && index.match(/^\d+$/)) {
    index = parseInt(index)
  }

  extractBlocks(source, type)
    .then(result => {
      if (index != null) {
        result = result[index]
      }
      const content = result.content.trim()
      let map
      if (this.sourceMap && type === 'scripts') {
        let contentLineCount = 0
        const iterator = splitSourceLine(content)
                          .map((input, line) => {
                            contentLineCount++
                            line = line + 1
                            return {
                              original: {
                                line: line + result.line,
                                column: 0
                              },
                              generated: {
                                line: line,
                                column: 0
                              }
                            }
                          })

        const commentSource = splitSourceLine(source)
                          .map((input, line) => {
                            line = line + 1
                            if (line <= result.line
                                  || line > result.line + contentLineCount) {
                              return '// ' + input + ' /* generated by weex-loader */'
                            }
                            else {
                              return input
                            }
                          }).join('\n')

        map = generateMap(this, commentSource, iterator)
      }

      return [content, map]
    }).then(([content, map]) => {
      callback(null, content, map && map.toJSON())
    }).catch(e => {
      callback(e, '')
    })
}
