var _ = require('lodash')

var webpack = require('webpack')
var CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin')
var ProgressPlugin = require('webpack/lib/ProgressPlugin')

var pathutil = require('./lib/util/pathutil')
var log = require('./lib/util/logger').createLogger('webpack:config')

module.exports = {
  webpack: {
    context: __dirname,
    cache: true,
    entry: {
      app: pathutil.resource('app/app.js'),
      authldap: pathutil.resource('auth/ldap/scripts/entry.js'),
      authmock: pathutil.resource('auth/mock/scripts/entry.js')
    },
    output: {
      path: pathutil.resource('build'),
      publicPath: '/static/app/build/',
      filename: 'entry/[name].entry.js',
      chunkFilename: '[id].[hash].chunk.js'
    },
    stats: {
      colors: true
    },
    resolve: {
      root: [
        pathutil.resource('app/components')
      ],
      modulesDirectories: [
        'web_modules',
        'bower_components',
        'node_modules'
      ],
      alias: {
        'angular-bootstrap': 'angular-bootstrap/ui-bootstrap-tpls',
        'localforage': 'localforage/dist/localforage.js',
        'socket.io': 'socket.io-client',
        'stats': 'stats.js/src/Stats.js',
        'underscore.string': 'underscore.string/index'
      }
    },
    module: {
      loaders: [
        { test: /\.css$/, loader: 'style!css' },
        { test: /\.scss$/, loader: 'style!css!sass'},
        { test: /\.less$/, loader: 'style!css!less'},
        { test: /\.json$/, loader: 'json' },
        { test: /\.jpg$/, loader: 'url?limit=1000&mimetype=image/jpeg' },
        { test: /\.png$/, loader: 'url?limit=1000&mimetype=image/png' },
        { test: /\.gif$/, loader: 'url?limit=1000&mimetype=image/gif' },
        { test: /\.svg/, loader: 'url?limit=1&mimetype=image/svg+xml' },
        { test: /\.woff/, loader: 'url?limit=1&mimetype=application/font-woff'},
        { test: /\.otf/, loader: 'url?limit=1&mimetype=application/font-woff' },
        { test: /\.ttf/, loader: 'url?limit=1&mimetype=application/font-woff' },
        { test: /\.eot/, loader: 'url?limit=1&mimetype=vnd.ms-fontobject' },
        { test: /\.jade$/, loader: 'template-html-loader' },
        { test: /\.html$/, loader: 'html-loader' },
        { test: /angular\.js$/, loader: 'exports?angular'},
        { test: /angular-cookies\.js$/, loader: 'imports?angular=angular'},
        { test: /angular-route\.js$/, loader: 'imports?angular=angular'},
        { test: /angular-touch\.js$/, loader: 'imports?angular=angular'},
        { test: /angular-animate\.js$/, loader: 'imports?angular=angular'},
        { test: /angular-growl\.js$/, loader: 'imports?angular=angular'},
        { test: /uuid\.js$/, loader: 'imports?require=>undefined'},
        { test: /dialogs\.js$/, loader: 'script'}
      ],
      preLoaders: [
        {
          test: /\.js$/,
          exclude: /node_modules|bower_components/,
          loader: 'jshint-loader'
        }
      ],
      noParse: [
        //pathutil.resource('bower_components')
      ]
    },
    plugins: [
      new webpack.ResolverPlugin(
        new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin(
          'bower.json'
          , ['main']
        )
      )
    , new webpack.ResolverPlugin(
        new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin(
          '.bower.json'
          , ['main']
        )
      )
    , new CommonsChunkPlugin('entry/commons.entry.js')
    , new ProgressPlugin(_.throttle(
        function(progress, message) {
          log.info(
            'Build progress %d%% (%s)'
          , Math.floor(progress * 100)
          , message ? message : (progress >= 1 ? 'complete' : 'unknown')
          )
        }
      , 1000
      ))
    ]
  },
  webpackServer: {
    debug: true,
    devtool: 'eval',
    stats: {
      colors: true
    }
  }
}
