// global module:false
module.exports = function(grunt) {

    'use strict';

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

        meta: {
          banner: '/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - ' +
                  '<%= grunt.template.today("yyyy-mm-dd") %>\n' +
                  '<%= pkg.homepage ? "* " + pkg.homepage : "" %>\n' +
                  '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' +
                  ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */\n\n',

          minibanner: '/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - ' +
                      '<%= grunt.template.today("yyyy-mm-dd") %> - ' +
                      '<%= pkg.homepage ? "* " + pkg.homepage + " - " : "" %>' +
                      'Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' +
                      ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */ '
        },

        concat: {
            options: {
                stripBanners: true,
                banner: '<%= meta.banner %>'
            },
            dist_js: {
                src: ['src/jquery.coords.js', 'src/jquery.collision.js', 'src/utils.js',
                      'src/jquery.draggable.js', 'src/jquery.<%= pkg.name %>.js'],
                dest: 'dist/jquery.<%= pkg.name %>.js'
            },
            dist_extras_js: {
                src: ['src/jquery.coords.js', 'src/jquery.collision.js', 'src/utils.js',
                      'src/jquery.draggable.js', 'src/jquery.<%= pkg.name %>.js',
                      'src/jquery.<%= pkg.name %>.extras.js'],
                dest: 'dist/jquery.<%= pkg.name %>.with-extras.js'
            },
            dist_css: {
                src: ['src/jquery.<%= pkg.name %>.css'],
                dest: 'dist/jquery.<%= pkg.name %>.css'
            },
            dist_demo_js: {
                src: ['src/jquery.coords.js', 'src/jquery.collision.js',
                      'src/utils.js', 'src/jquery.draggable.js',
                      'src/jquery.<%= pkg.name %>.js'],
                dest: 'gh-pages/dist/jquery.<%= pkg.name %>.js'
            },
            dist_extras_demo_js: {
                src: ['src/jquery.coords.js', 'src/jquery.collision.js',
                      'src/utils.js', 'src/jquery.draggable.js',
                      'src/jquery.<%= pkg.name %>.js',
                      'src/jquery.<%= pkg.name %>.extras.js'],
                dest: 'gh-pages/dist/jquery.<%= pkg.name %>.with-extras.js'
            },
            dist_demo_css: {
                src: ['src/jquery.<%= pkg.name %>.css'],
                dest: 'gh-pages/dist/jquery.<%= pkg.name %>.css'
            }
        },

        uglify: {
            options: {
                banner: '<%= meta.minibanner %>'
            },
            dist: {
                files: {
                    'dist/jquery.<%= pkg.name %>.min.js': ['<%= concat.dist_js.dest %>']
                }
            },
            dist_extras: {
                files: {
                    'dist/jquery.<%= pkg.name %>.with-extras.min.js': [
                        '<%= concat.dist_extras_js.dest %>'
                    ]
                }
            },
            dist_demo: {
                files: {
                    'gh-pages/dist/jquery.<%= pkg.name %>.min.js': [
                        '<%= concat.dist_js.dest %>'
                    ],
                }
            },
            dist_extras_demo: {
                files: {
                    'gh-pages/dist/jquery.<%= pkg.name %>.with-extras.min.js': [
                        '<%= concat.dist_extras_js.dest %>'
                    ]
                }
            }
        },
        cssmin: {
            compress: {
                options: {
                    keepSpecialComments: 0,
                    banner: '<%= meta.minibanner %>'
                },
                files: {
                    'dist/jquery.<%= pkg.name %>.min.css': [
                        'dist/jquery.<%= pkg.name %>.css'
                    ],
                    'gh-pages/dist/jquery.<%= pkg.name %>.min.css': [
                        'dist/jquery.<%= pkg.name %>.css'
                    ]
                }
            }
        },

        jshint: {
            files: ['Gruntfile.js', 'src/**.js'],
            options: {
                jshintrc: true,
                reporter: require('jshint-stylish')
            }
        },

        yuidoc: {
            compile: {
                name: 'gridster.js',
                description: 'gridster.js, a drag-and-drop multi-column jQuery grid plugin',
                version: '0.1.0',
                url: 'http://gridster.net/',
                logo: 'https://ducksboard.com/static/images/svg/logo-ducksboard-black-small.svg',
                options: {
                    paths: 'src/',
                    outdir: 'gh-pages/docs/'
                }
            }
        },

        bump: {
            options: {
                files: ['package.json'],
                updateConfigs: ['pkg'],
                commit: true,
                commitMessage: 'Release v%VERSION%',
                commitFiles: ['package.json', 'CHANGELOG.md', 'dist/'], // '-a' for all files
                createTag: true,
                tagName: 'v%VERSION%',
                tagMessage: 'Version %VERSION%',
                push: false,
                pushTo: 'origin',
                // options to use with '$ git describe'
                gitDescribeOptions: '--tags --always --abbrev=1 --dirty=-d'
            }
        },

        changelog: {
            options: {
                dest: 'CHANGELOG.md'
            }
        },

        watch: {
            files: ['libs/*.js', 'src/*.js', 'src/*.css', 'Gruntfile.js'],
            tasks: ['concat', 'uglify', 'cssmin']
        },

        karma: {
            gridster: {
                configFile: 'test/karma.conf.js'
            }
        }
    });


    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-contrib-yuidoc');
    grunt.loadNpmTasks('grunt-bump');
    grunt.loadNpmTasks('grunt-conventional-changelog');
    grunt.loadNpmTasks('grunt-karma');

    // Default task.
    grunt.registerTask('default', ['jshint', 'concat', 'uglify', 'cssmin']);
    grunt.registerTask('build', ['default']);
    grunt.registerTask('docs', ['yuidoc']);
    grunt.registerTask('test', ['karma']);

    grunt.registerTask('release', [
        'build', 'bump-only:patch', 'build', 'docs', 'changelog']);
    grunt.registerTask('release:minor', [
        'build', 'bump-only:minor', 'build', 'docs', 'changelog']);
    grunt.registerTask('release:major', [
        'build', 'bump-only:major', 'build', 'docs', 'changelog']);
    grunt.registerTask('release:git', [
        'build', 'bump-only:git', 'build', 'docs', 'changelog', 'bump-commit']);
    grunt.registerTask('release:commit', [
        'bump-commit']);

};