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

    // Project configuration.
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),

        uglify: {
            options: {
                banner: '/* <%= pkg.name %> v<%= pkg.version %> MIT License\n' +
                        '(c) 2012-<%= grunt.template.today("yyyy") %> <%= pkg.author.name %> \n' +
                        'Contributors: <%= pkg.contributors[0].name %>, <%= pkg.contributors[1].name %> */\n',
                max_line_length: 500
            },
            build: {
                src: '<%= buildSourceFile %>',
                dest: '<%= pkg.name %>.min.js'
            }
        },

        jshint: {
            options: {},
            src: ['Gruntfile.js', '<%= sourceFiles %>', '<%= jsonFiles %>']
        },

        watch: {
            files: ['Gruntfile.js', 'lib/**/*.js', 'test/**/*.js', 'package.json'],
            tasks: ['jshint', 'mocha', 'uglify']
        },

        bumpup: ['package.json', 'bower.json'],

        release: {
            options: {
                bump: false, //default: true
                tagName: 'v<%= version %>', //default: '<%= version %>'
                commitMessage: 'release v<%= version %>', //default: 'release <%= version %>'
                tagMessage: 'tagging version v<%= version %>' //default: 'Version <%= version %>'
            }
        },

        replace: {
            files: {
                src: '<%= buildSourceFile %>',
                overwrite: true,
                replacements: [{
                    from: /'version': '\d{1,2}\.\d{1,3}\.\d{1,4}',/g,
                    to: "'version': '<%= pkg.version %>',"
                }, {
                    from: /murmurHash3js.js v\d{1,2}\.\d{1,3}\.\d{1,3}/g,
                    to: "murmurHash3js.js v<%= pkg.version %>"
                }]
            },
            readme: {
                src: 'README.md',
                overwrite: true,
                replacements: [{
                    from: /"\d{1,2}\.\d{1,3}\.\d{1,4}" \/\/ get version/g,
                    to: "\"<%= pkg.version %>\" \/\/ get version"
                }]
            }
        },

        // files
        buildSourceFile: 'lib/murmurHash3js.js ',
        sourceFiles: 'lib/**/*.js ',
        testFiles: 'test/**/*.js ',
        jsonFiles: '*.json '
    });

    grunt.registerTask('mocha', 'run mocha', function() {
        var done = this.async();
        require('child_process')
            .exec('npm test', function(err, stdout) {
                grunt.log.write(stdout);
                done(err);
            });
    });

    grunt.event.on('watch ', function(action, filepath) {
        grunt.log.writeln(filepath + ' has ' + action);
    });

    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-release');
    grunt.loadNpmTasks('grunt-bumpup');
    grunt.loadNpmTasks('grunt-text-replace');

    // Default task(s).
    grunt.registerTask('default', ['replace', 'jshint', 'mocha', 'uglify']);

};
