const path = require('path')
const each = require('lodash/fp/each')

const MomentLocalesPlugin = require('moment-locales-webpack-plugin')
const BundleTrackerPlugin = require('webpack-bundle-tracker')
const CompressionPlugin = require('compression-webpack-plugin')
const CopyPlugin = require('copy-webpack-plugin')

class RelativeBundleTrackerPlugin extends BundleTrackerPlugin {
  convertPathChunks (chunks) {
    each(each(chunk => {
      chunk.path = path.relative(this.options.path, chunk.path)
    }))(chunks)
  }

  writeOutput (compiler, contents) {
    if (contents.status === 'done') {
      this.convertPathChunks(contents.chunks)
    }
    super.writeOutput(compiler, contents)
  }
}

const dotenv = require('dotenv')
dotenv.config({
  path: './sapl/.env'
})

var FRONTEND_CUSTOM = process.env.FRONTEND_CUSTOM === undefined ? false : process.env.FRONTEND_CUSTOM === 'True'

var HOST_NAME = 'localhost'

module.exports = {
  runtimeCompiler: true,
  publicPath: process.env.NODE_ENV === 'production' ? '/static/sapl/frontend' : `http://${HOST_NAME}:8080/`,
  outputDir: FRONTEND_CUSTOM ? 'dist' : './sapl/static/sapl/frontend',

  chainWebpack: config => {
    config.plugins.delete('html')
    config.plugins.delete('preload')
    config.plugins.delete('prefetch')

    config.resolve
      .alias.set('@', path.join(__dirname + "/frontend/", 'src'))

    config
      .plugin('CopyPlugin')
      .use(CopyPlugin, [{
        patterns: [
          {
            from: path.join(__dirname + "/frontend/", 'public'),
            to: '.'
          },
        ],
      }])

    config
      .plugin('RelativeBundleTrackerPlugin')
      .use(RelativeBundleTrackerPlugin, [{
        path: '.',
        filename: FRONTEND_CUSTOM ? './webpack-stats.json' : './sapl/webpack-stats.json'
      }])

    config
      .plugin('MomentLocalesPlugin')
      .use(MomentLocalesPlugin, [{
        localesToKeep: ['pt-BR']
      }])

    if (process.env.NODE_ENV === 'production') {
      config.optimization.minimizer('terser').tap((args) => {
        args[0].terserOptions.compress.drop_console = true
        args[0].extractComments = true
        args[0].cache = true
        return args
      })

      config
        .plugin('CompressionPlugin')
        .use(CompressionPlugin, [{
        }])
    } else {
      config
        .devtool('source-map')
    }

    config.resolve.alias
      .set('__STATIC__', 'static')

    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        options.transformAssetUrls = {
          img: 'src',
          image: 'xlink:href',
          'b-img': 'src',
          'b-img-lazy': ['src', 'blank-src'],
          'b-card': 'img-src',
          'b-card-img': 'img-src',
          'b-carousel-slide': 'img-src',
          'b-embed': 'src'
        }

        return options
      })

    config.devServer
      .public('')
      .port(8080)
      .hot(true)
      .watchOptions({
        poll: true
      })
      .watchContentBase(true)
      .https(false)
      .headers({
        'Access-Control-Allow-Origin': '*'
      })
      .contentBase([
        path.join(__dirname + "/frontend/", 'public'),
        path.join(__dirname + "/frontend/", 'src', 'assets')
      ])

    config
      .plugin('provide')
      .use(require('webpack/lib/ProvidePlugin'), [{
        $: 'jquery',
        jquery: 'jquery',
        'window.jQuery': 'jquery',
        jQuery: 'jquery',
        _: 'lodash'
      }])

    config.entryPoints.delete('app')

    config
      .entry('global')
      .add('./frontend/src/__global/main.js')
      .end()

    config.entry('compilacao')
      .add('./frontend/src/__apps/compilacao/main.js')
      .end()

    config.entry('painel')
      .add('./frontend/src/__apps/painel/main.js')
      .end()

    config.entry('parlamentar')
      .add('./frontend/src/__apps/parlamentar/main.js')
      .end()
  }
}