import loaderUtils from 'loader-utils'
import path from 'path'
import fs from 'fs'
import md5 from 'md5'

import * as config from './config'
import * as legacy from './legacy'

import {
  parseFragment
} from './parser'
import {
  getNameByPath,
  getRequireString,
  stringifyLoaders
} from './util'

const loaderPath = __dirname
const defaultLoaders = {
  main: path.resolve(loaderPath, 'loader.js'),
  extract: path.resolve(loaderPath, 'extract.js'),
  template: path.resolve(loaderPath, 'template.js'),
  style: path.resolve(loaderPath, 'style.js'),
  script: path.resolve(loaderPath, 'script.js'),
  json: path.resolve(loaderPath, 'json.js'),
  babel: 'babel-loader'
}

function getLoaderString (type, config) {
  config = config || {}
  let customLoader
  let loaders

  if (config.lang && config.customLang[config.lang]) {
    customLoader = config.customLang[config.lang]
  }

  if (type === 'main') {
    loaders = [{
      name: defaultLoaders.main
    }]
    return stringifyLoaders(loaders)
  }

  if (type === 'element') {
    loaders = [{
      name: defaultLoaders.main,
      query: {
        element: config.source ? undefined : true
      }
    }]
    if (!config.source) {
      loaders.push({
        name: defaultLoaders.extract,
        query: {
          index: config.name,
          type: 'elements'
        }
      })
    }
    return stringifyLoaders(loaders)
  }

  if (type === 'template') {
    loaders = [{
      name: defaultLoaders.json
    }, {
      name: defaultLoaders.template
    }]
    if (customLoader) {
      loaders = loaders.concat(customLoader)
    }
    if (!config.source) {
      loaders.push({
        name: defaultLoaders.extract,
        query: {
          type: 'template'
        }
      })
    }
    if (config.element) {
      loaders.push({
        name: defaultLoaders.extract,
        query: {
          index: config.elementName,
          type: 'elements'
        }
      })
    }
    return stringifyLoaders(loaders)
  }

  if (type === 'style') {
    loaders = [{
      name: defaultLoaders.json
    }, {
      name: defaultLoaders.style
    }]
    if (customLoader) {
      loaders = loaders.concat(customLoader)
    }
    if (!config.source) {
      loaders.push({
        name: defaultLoaders.extract,
        query: {
          index: 0,
          type: 'styles'
        }
      })
    }
    if (config.element) {
      loaders.push({
        name: defaultLoaders.extract,
        query: {
          index: config.elementName,
          type: 'elements'
        }
      })
    }
    return stringifyLoaders(loaders)
  }

  if (type === 'script') {
    loaders = [{
      name: defaultLoaders.script
    }]
    if (customLoader) {
      loaders = loaders.concat(customLoader)
    }
    else {
      loaders.push({
        name: defaultLoaders.babel,
        query: {
          presets: ['es2015'],
          plugins: ['transform-runtime'],
          comments: 'false'
        }
      })
    }
    if (!config.source) {
      loaders.push({
        name: defaultLoaders.extract,
        query: {
          index: 0,
          type: 'scripts'
        }
      })
    }
    if (config.element) {
      loaders.push({
        name: defaultLoaders.extract,
        query: {
          index: config.elementName,
          type: 'elements'
        }
      })
    }
    return stringifyLoaders(loaders)
  }

  if (type === 'config') {
    loaders = [{
      name: defaultLoaders.json
    }]
    if (!config.source) {
      loaders.push({
        name: defaultLoaders.extract,
        query: {
          type: 'config'
        }
      })
    }
    return stringifyLoaders(loaders)
  }

  if (type === 'data') {
    loaders = [{
      name: defaultLoaders.json
    }]
    if (!config.source) {
      loaders.push({
        name: defaultLoaders.extract,
        query: {
          type: 'data'
        }
      })
    }
    return stringifyLoaders(loaders)
  }
}

function loader (source) {
  this.cacheable && this.cacheable()
  const options = this.options.weex || {}
  const customLang = options.lang || {}

  const loaderQuery = loaderUtils.parseQuery(this.query)
  const resourceQuery = loaderUtils.parseQuery(this.resourceQuery)
  const resourcePath = this.resourcePath
  const isElement = loaderQuery.element
  const isEntry = resourceQuery.entry
  const name = isEntry ? md5(resourcePath) :
                          (resourceQuery.name ||
                            getNameByPath(resourcePath))

  let output = ''

  const frag = parseFragment(source)

  const elementNames = []
  if (frag.element.length) {
    for (let i = 0; i < frag.element.length; i++) {
      const element = frag.element[i]
      if (!element.name) {
        this.emitError('Element block need a name attribute')
        return ''
      }
      elementNames.push(element.name)

      let src = resourcePath
      if (element.src) {
        src = element.src
      }

      output += getRequireString(
                  this,
                  getLoaderString('element', {
                    customLang,
                    name: element.name,
                    source: element.src
                  }),
                  `${src}?name=${element.name}`
                )
    }
  }

  if (frag.deps.length) {
    for (const dep of frag.deps) {
      const filepath = path.resolve(path.dirname(resourcePath), `${dep}.we`)
      if (elementNames.indexOf(dep) < 0
            && fs.existsSync(filepath)) {
        output += getRequireString(
                    this,
                    getLoaderString('main'),
                    `./${dep}.we`
                  )
      }
    }
  }

  if (!frag.template.length) {
    this.emitError('Template block is required')
    return ''
  }
  else {
    const template = frag.template[0]
    let src = resourcePath
    if (template.src) {
      src = template.src
    }
    output += 'var __weex_template__ = ' +
                getRequireString(
                  this,
                  getLoaderString('template', {
                    customLang,
                    lang: template.lang,
                    element: isElement,
                    elementName: isElement ? name : undefined,
                    source: template.src
                  }),
                  src
                )
  }

  if (frag.style.length) {
    const style = frag.style[0]
    let src = resourcePath
    if (style.src) {
      src = style.src
    }
    output += 'var __weex_style__ = ' +
                getRequireString(
                  this,
                  getLoaderString('style', {
                    customLang,
                    lang: style.lang,
                    element: isElement,
                    elementName: isElement ? name : undefined,
                    source: style.src
                  }),
                  src
                )
  }

  if (frag.script.length) {
    const script = frag.script[0]
    let src = resourcePath
    if (script.src) {
      src = script.src
    }
    output += 'var __weex_script__ = ' +
                getRequireString(
                  this,
                  getLoaderString('script', {
                    customLang,
                    lang: script.lang,
                    element: isElement,
                    elementName: isElement ? name : undefined,
                    source: script.src
                  }),
                  src
                )
  }

  if (isEntry && frag.data.length) {
    const data = frag.data[0]
    let src = resourcePath
    if (data.src) {
      src = data.src
    }
    output += 'var __weex_data__ = ' +
                getRequireString(
                  this,
                  getLoaderString('data', {
                    source: data.src
                  }),
                  src
                )
  }

  if (isEntry && frag.config.length) {
    const config = frag.config[0]
    let src = resourcePath
    if (config.src) {
      src = config.src
    }
    output += 'var __weex_config__ = ' +
                getRequireString(
                  this,
                  getLoaderString('config', {
                    source: config.src
                  }),
                  src
                )
  }

  output += `
__weex_define__('@weex-component/${name}', [], function(__weex_require__, __weex_exports__, __weex_module__) {
` + (
  frag.script.length > 0 ? `
    __weex_script__(__weex_module__, __weex_exports__, __weex_require__)
    if (__weex_exports__.__esModule && __weex_exports__.default) {
      __weex_module__.exports = __weex_exports__.default
    }
` : ''
) +
`
    __weex_module__.exports.template = __weex_template__
` + (
  frag.style.length > 0 ? `
    __weex_module__.exports.style = __weex_style__
` : ''
) + `
})
`
  if (isEntry) {
    output += `
__weex_bootstrap__('@weex-component/${name}'`
  + (frag.config.length > 0 ? `,__weex_config__` : ',undefined')
  + (frag.data.length > 0 ? `,__weex_data__` : ',undefined')
+ `)`
  }

  return output
}

loader.setLogLevel = level => {
  config.logLevel = level
}

for (const key in legacy) {
  loader[key] = legacy[key]
}

module.exports = loader
