module.exports = function(grunt) {
    grunt.initConfig({
        // ---
        // Variables
        // ---

        pkg: grunt.file.readJSON('package.json'),

        dirs: {
            src: 'src',
            dist: 'dist',
            test: 'test'
        },

        banner: [
            '/*!',
            ' * BootstrapValidator (<%= pkg.homepage %>)',
            ' * <%= pkg.description %>',
            ' *',
            ' * @version     v<%= pkg.version %>, built on <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %>',
            ' * @author      <%= pkg.author.url %>',
            ' * @copyright   (c) 2013 - <%= grunt.template.today("yyyy") %> Nguyen Huu Phuoc',
            ' * @license     Commercial: <%= pkg.homepage %>/license/',
            ' *              Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/',
            ' */\n'
        ].join('\n'),

        // ---
        // Tasks
        // ---

        copy: {
            main: {
                files: [
                    { cwd: '<%= dirs.src %>/css', src: '**', dest: '<%= dirs.dist %>/css', expand: true, flatten: true, filter: 'isFile' },
                    { cwd: '<%= dirs.src %>/js/language', src: '**', dest: '<%= dirs.dist %>/js/language', expand: true, flatten: true, filter: 'isFile' }
                ]
            }
        },

        cssmin: {
            minify: { expand: true, cwd: '<%= dirs.src %>/css/', src: ['*.css'], dest: '<%= dirs.dist %>/css/', ext: '.min.css' },
            add_banner: {
                options: {
                    stripBanners: true,
                    banner: '<%= banner %>'
                },
                files: {
                    '<%= dirs.dist %>/css/bootstrapValidator.min.css': ['<%= dirs.src %>/css/bootstrapValidator.css']
                }
            }
        },

        concat: {
            source: {
                options: {
                    separator: ';',
                    stripBanners: true,
                    banner: '<%= banner %>'
                },
                src: ['<%= dirs.src %>/js/bootstrapValidator.js', '<%= dirs.src %>/js/validator/*.js'],
                dest: '<%= dirs.dist %>/js/bootstrapValidator.js'
            },
            test: {
                src: ['<%= dirs.test %>/spec/*.js', '<%= dirs.test %>/spec/validator/*.js'],
                dest: '<%= dirs.test %>/spec.js'
            }
        },

        uglify: {
            options: {
                banner: '<%= banner %>'
            },
            build: {
                src: ['<%= dirs.dist %>/js/bootstrapValidator.js'],
                dest: '<%= dirs.dist %>/js/bootstrapValidator.min.js'
            }
        },

        jshint: {
            all: [
                '<%= dirs.src %>/js/**/*.js'
            ],
            options: {
                browser: true,
                camelcase: true,
                curly: true,
                eqeqeq: true,
                eqnull: true,
                es3: true,
                expr: true,
                laxbreak: true,   // Allow line breaking before && or ||
                loopfunc: true,
                newcap: true,
                noarg: true,
                onevar: true,
                sub: true,
                undef: true,
                white: true
            }
        },

        watch: {
            source: {
                files: ['<%= dirs.src %>/css/**', '<%= dirs.src %>/js/**'],
                tasks: ['build'],
                options: {
                    spawn: false
                }
            },
            test: {
                files: ['<%= dirs.test %>/spec/**'],
                tasks: ['concat:test']
            }
        }
    });

    grunt.registerTask('default', 'build');
    grunt.registerTask('build',   ['copy', 'cssmin', 'concat', 'uglify']);

    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-watch');
};
