/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import loaderUtils from 'loader-utils'

import {
  extractBlocks
} from './parser'

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

  const callback = this.async()
  const loaderQuery = loaderUtils.getOptions(this) || {}
  const resourceQuery = loaderUtils.parseQuery(this.resourceQuery) || {}
  const name = resourceQuery.name

  let contentPromise

  if (loaderQuery.extract) {
    contentPromise =
      extractBlocks(source, 'elements')
  }
  else {
    contentPromise = Promise.resolve({ content: source })
  }

  contentPromise.then(elements => {
    if (loaderQuery.raw) {
      return elements[name].content
    }
  }).then(result => {
    callback(null, result)
  }).catch(e => {
    callback(e, '')
  })
}
