/*global module,require*/
var lrSnippet = require('connect-livereload')({
  port: 35730
});
var mountFolder = function (connect, dir) {
  return connect.static(require('path').resolve(dir));
};

module.exports = function (grunt) {
  'use strict';

  // load all grunt tasks
  require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);

  // configurable paths
  var projectConfig = {
    dist: 'dist',
    src: ''
  };

  try {
    projectConfig.src = require('./bower.json').appPath || projectConfig.src;
  } catch (e) {}

  grunt.initConfig({
    clean: {
      build: '<%= config.dist %>'
    },
    config: projectConfig,
    connect: {
      server: {
        options: {
          hostname: '0.0.0.0',
          middleware: function (connect) {
            return [
              lrSnippet,
              mountFolder(connect, projectConfig.src),
              mountFolder(connect, projectConfig.src + 'tests')
            ];
          },
          port: 9001
        }
      }
    },
    run: {
      options: {
      },
      bundleInstall: {
        cmd: 'bundle',
        args: [
          'install'
        ]
      }
    },
    copy: {
      main: {
        files: [
          // copy Bootstrap font files
          {expand: true, cwd: 'node_modules/bootstrap/dist/fonts/', src: ['*'], dest: 'dist/fonts/'},
          // copy Font Awesome font files
          {expand: true, cwd: 'node_modules/font-awesome/fonts/', src: ['*'], dest: 'dist/fonts/'},
          // copy PatternFly font files
          {expand: true, cwd: 'node_modules/patternfly/dist/fonts/', src: ['**'], dest: 'dist/fonts/'},
          // copy PatternFly less files
          {expand: true, cwd: 'node_modules/patternfly/less/', src: ['**'], dest: 'less/lib/patternfly/'},
          // copy PatternFly images
          {expand: true, cwd: 'node_modules/patternfly/dist/img/', src: ['**'], dest: 'dist/img'},
        ],
      },
    },
    csscount: {
      production: {
        src: [
          'dist/css/rcue*.min.css'
        ],
        options: {
          maxSelectors: 4096
        }
      }
    },
    cssmin: {
      production: {
        files: [{
          expand: true,
          cwd: 'dist/css',
          src: ['rcue*.css', '!*.min.css'],
          dest: 'dist/css',
          ext: '.min.css',
        }],
        options: {
          sourceMap: true
        }
      }
    },
    jekyll: {
      options: {
        src: 'node_modules/patternfly/tests/pages',
        bundleExec: 'true'
      },
      tests: {
        options: {
          config: '_config.yml',
          dest: 'tests'
        }
      }
    },
    less: {
      rcue: {
        files: {
          "dist/css/rcue.css": "less/rcue.less"
        },
        options: {
          paths: [
            "less/",
            "node_modules/"
          ],
          strictMath: true,
          sourceMap: true,
          outputSourceFiles: true,
          sourceMapFilename: 'dist/css/rcue.css.map',
          sourceMapURL: 'rcue.css.map'
        }
      },
      rcueAdditions: {
        files: {
          "dist/css/rcue-additions.css": "less/rcue-additions.less"
        },
        options: {
          paths: [
            "less/",
            "node_modules/"
          ],
          strictMath: true,
          sourceMap: true,
          outputSourceFiles: true,
          sourceMapFilename: 'dist/css/rcue-additions.css.map',
          sourceMapURL: 'rcue-additions.css.map'
        }
      }
    },
    watch: {
      copy: {
        files: 'node_modules/**/*',
        tasks: ['copy']
      },
      jekyll: {
        files: ['_config.yml', 'node_modules/patternfly/tests/pages/**/*'],
        tasks: ['jekyll']
      },
      less: {
        files: ['less/*.less', 'node_modules/patternfly/dist/less/*.less'],
        tasks: ['less'],
      },
      css: {
        files: ['dist/css/rcue*.css', 'dist/css/!*.min.css'],
        tasks: ['cssmin', 'csscount']
      },
      livereload: {
        files: ['dist/css/*.css', 'tests/*.html']
      },
      options: {
        livereload: 35730
      }
    }
  });

  grunt.registerTask('build', [
    'run:bundleInstall',
    'copy',
    'jekyll',
    'less',
    'cssmin',
    'csscount'
  ]);

  grunt.registerTask('server', [
    'connect:server',
    'watch'
  ]);

  grunt.registerTask('default', ['build']);
};
