/*
 * Copyright 2014-2018 the original author or authors.
 *
 * Licensed 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.
 */

'use strict';
const {join, resolve} = require('path');
const webpack = require('webpack');

const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin');
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin');
const LodashModuleReplacementPlugin = require('lodash-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

const extractCSS = new ExtractTextPlugin({
  filename: 'assets/css/[name].css',
  allChunks: true
});
const extractSASS = new ExtractTextPlugin({
  filename: 'assets/css/[name].css',
  allChunks: true
});

const config = {
  entry: {'sba-core': ['babel-polyfill', './src/main/frontend/index.js']},
  output: {
    path: resolve(__dirname, './target/dist'),
    filename: 'assets/js/[name].js',
    chunkFilename: 'assets/js/[name].js',
    publicPath: ''
  },
  resolve: {
    extensions: ['.js', '.vue'],
    alias: {
      '@': join(__dirname, 'src/main/frontend'),
      'root': join(__dirname, 'node_modules')
      //uncomment to use vue with html compiler:
      // 'vue$': 'vue/dist/vue.esm.js'
    }
  },
  node: {
    fs: 'empty'
  },
  module: {
    rules: [
      {
        test: /\.(js|vue)$/,
        loader: 'eslint-loader',
        enforce: 'pre'
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
            js: 'babel-loader',
            scss: ['css-hot-loader'].concat(
              ExtractTextPlugin.extract({
                use: [
                  {loader: 'css-loader'},
                  {loader: 'postcss-loader'},
                  {
                    loader: 'sass-loader', options: {includePaths: [join(__dirname, 'node_modules')]}
                  }],
                fallback: 'style-loader'
              }))
          },
          transformToRequire: {
            img: 'src'
          }
        }
      },
      {
        test: /\.js$/,
        use: 'babel-loader',
        include: [
          resolve(__dirname, 'src/main/frontend'),
          resolve(__dirname, 'node_modules/pretty-bytes')
        ]
      },
      {
        test: /\.css$/,
        use: ['css-hot-loader'].concat(
          ExtractTextPlugin.extract({
            use: ['css-loader', 'postcss-loader'],
            fallback: 'style-loader'
          }))
      },
      {
        test: /\.scss$/,
        use: ['css-hot-loader'].concat(
          ExtractTextPlugin.extract({
            use: [
              {loader: 'css-loader'},
              {loader: 'postcss-loader'},
              {loader: 'sass-loader', options: {includePaths: [join(__dirname, 'node_modules')]}}],
            fallback: 'style-loader'
          }))
      },
      {
        test: /\.html$/,
        use: [{
          loader: 'html-loader',
          options: {
            root: resolve(__dirname, 'src/main/frontend'),
            attrs: ['img:src']
          }
        }]
      },
      {
        test: /\.svg$/,
        loader: 'vue-svg-loader',
      },
      {
        test: /\.(png|jpg|jpeg|gif|eot|ttf|woff|woff2|svgz)(\?.+)?$/,
        use: [{
          loader: 'url-loader',
          options: {
            limit: 1000,
            name: 'assets/img/[name].[ext]'
          }
        }]
      }
    ]
  },
  plugins: [
    new CleanWebpackPlugin(['target/dist'], {
      root: __dirname,
      verbose: true,
      dry: false,
    }),
    new webpack.DefinePlugin({
      '__PROJECT_VERSION__': `'${process.env.PROJECT_VERSION || ''}'`
    }),
    new webpack.NamedModulesPlugin(),
    new LodashModuleReplacementPlugin(),
//    new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/),
    new webpack.optimize.ModuleConcatenationPlugin(),
    new CommonsChunkPlugin({
      name: 'vendors',
      minChunks: (module) => module.resource && /node_modules/.test(module.resource)
    }),
    extractSASS,
    extractCSS,
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: './src/main/frontend/index.html',
      inject: false,
      hash: process.env.NODE_ENV === 'production',
    }),
    new HtmlWebpackPlugin({
      filename: 'login.html',
      template: './src/main/frontend/login.html',
      inject: false,
      hash: process.env.NODE_ENV === 'production',
    }),
    new BundleAnalyzerPlugin({
      analyzerMode: 'static',
      openAnalyzer: false,
      reportFilename: '../report.html'
    })
  ],
  devtool: '#eval-source-map'
};

if (process.env.NODE_ENV === 'production') {
  config.devtool = '#source-map';
  // http://vue-loader.vuejs.org/en/workflow/production.html
  config.plugins = config.plugins.concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      compress: {
        warnings: false
      },
      sourceMap: true
    }),
    new OptimizeCSSPlugin()
  ])
}

module.exports = config;