module.exports = function(grunt){

'use strict';

// Force use of Unix newlines
grunt.util.linefeed = '\n';

// Project configuration.
grunt.initConfig({
    //Metadata
    pkg: grunt.file.readJSON('package.json'),
    banner: [
        '/*!',
        ' * Datepicker for Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)',
        ' *',
        ' * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)',
        ' */'
    ].join('\n') + '\n',

    // Task configuration.
    clean: {
        dist: ['dist', '*-dist.zip']
    },
    jshint: {
        options: {
            jshintrc: 'js/.jshintrc'
        },
        main: {
            src: 'js/bootstrap-datepicker.js'
        },
        locales: {
            src: 'js/locales/*.js'
        },
        gruntfile: {
            options: {
                jshintrc: 'grunt/.jshintrc'
            },
            src: 'Gruntfile.js'
        }
    },
    jscs: {
        options: {
            config: 'js/.jscsrc'
        },
        main: {
            src: 'js/bootstrap-datepicker.js'
        },
        locales: {
            src: 'js/locales/*.js'
        },
        gruntfile: {
            src: 'Gruntfile.js'
        }
    },
    qunit: {
        main: 'tests/tests.html',
        timezone: 'tests/timezone.html',
        options: {
            console: false
        }
    },
    concat: {
        options: {
            stripBanners: true
        },
        main: {
            src: 'js/bootstrap-datepicker.js',
            dest: 'dist/js/<%= pkg.name %>.js'
        }
    },
    uglify: {
        options: {
            preserveComments: 'some'
        },
        main: {
            src: '<%= concat.main.dest %>',
            dest: 'dist/js/<%= pkg.name %>.min.js'
        },
        locales: {
            files: [{
                expand: true,
                cwd: 'js/locales/',
                src: '*.js',
                dest: 'dist/locales/',
                rename: function(dest, name){
                    return dest + name.replace(/\.js$/, '.min.js');
                }
            }]
        }
    },
    less: {
        options: {
            sourceMap: true,
            outputSourceFiles: true
        },
        standalone_bs2: {
            options: {
                sourceMapURL: '<%= pkg.name %>.standalone.css.map'
            },
            src: 'build/build_standalone.less',
            dest: 'dist/css/<%= pkg.name %>.standalone.css'
        },
        standalone_bs3: {
            options: {
                sourceMapURL: '<%= pkg.name %>3.standalone.css.map'
            },
            src: 'build/build_standalone3.less',
            dest: 'dist/css/<%= pkg.name %>3.standalone.css'
        },
        main_bs2: {
            options: {
                sourceMapURL: '<%= pkg.name %>.css.map'
            },
            src: 'build/build.less',
            dest: 'dist/css/<%= pkg.name %>.css'
        },
        main_bs3: {
            options: {
                sourceMapURL: '<%= pkg.name %>3.css.map'
            },
            src: 'build/build3.less',
            dest: 'dist/css/<%= pkg.name %>3.css'
        }
    },
    usebanner: {
        options: {
            banner: '<%= banner %>'
        },
        css: 'dist/css/*.css',
        js: 'dist/js/**/*.js'
    },
    cssmin: {
        options: {
            compatibility: 'ie8',
            keepSpecialComments: '*',
            advanced: false
        },
        main: {
            files: {
                'dist/css/<%= pkg.name %>.min.css': 'dist/css/<%= pkg.name %>.css',
                'dist/css/<%= pkg.name %>3.min.css': 'dist/css/<%= pkg.name %>3.css'
            }
        },
        standalone: {
            files: {
                'dist/css/<%= pkg.name %>.standalone.min.css': 'dist/css/<%= pkg.name %>.standalone.css',
                'dist/css/<%= pkg.name %>3.standalone.min.css': 'dist/css/<%= pkg.name %>3.standalone.css'
            }
        }
    },
    csslint: {
        options: {
            csslintrc: 'less/.csslintrc'
        },
        dist: [
            'dist/css/bootstrap-datepicker.css',
            'dist/css/bootstrap-datepicker3.css',
            'dist/css/bootstrap-datepicker.standalone.css',
            'dist/css/bootstrap-datepicker3.standalone.css'
        ]
    },
    compress: {
        main: {
            options: {
                archive: '<%= pkg.name %>-<%= pkg.version %>-dist.zip',
                mode: 'zip',
                level: 9,
                pretty: true
            },
            files: [
                {
                    expand: true,
                    cwd: 'dist/',
                    src: '**'
                }
            ]
        }
    },
    'string-replace': {
        js: {
            files: [{
                src: 'js/bootstrap-datepicker.js',
                dest: 'js/bootstrap-datepicker.js'
            }],
            options: {
                replacements: [{
                    pattern: /\$(\.fn\.datepicker\.version)\s=\s*("|\')[0-9\.a-z].*("|');/gi,
                    replacement: "$.fn.datepicker.version = '" + grunt.option('newver') + "';"
                }]
            }
        },
        npm: {
            files: [{
                src: 'package.json',
                dest: 'package.json'
            }],
            options: {
                replacements: [{
                    pattern: /\"version\":\s\"[0-9\.a-z].*",/gi,
                    replacement: '"version": "' + grunt.option('newver') + '",'
                }]
            }
        }
    }
});

// These plugins provide necessary tasks.
require('load-grunt-tasks')(grunt, {scope: 'devDependencies'});
require('time-grunt')(grunt);

// JS distribution task.
grunt.registerTask('dist-js', ['concat', 'uglify:main', 'uglify:locales', 'usebanner:js']);

// CSS distribution task.
grunt.registerTask('less-compile', 'less');
grunt.registerTask('dist-css', ['less-compile', 'cssmin:main', 'cssmin:standalone', 'usebanner:css']);

// Full distribution task.
grunt.registerTask('dist', ['clean:dist', 'dist-js', 'dist-css']);

// Code check tasks.
grunt.registerTask('lint-js', 'Lint all js files with jshint and jscs', ['jshint', 'jscs']);
grunt.registerTask('lint-css', 'Lint all css files', ['dist-css', 'csslint:dist']);
grunt.registerTask('qunit-all', 'Run qunit tests', ['qunit:main', 'qunit-timezone']);
grunt.registerTask('test', 'Lint files and run unit tests', ['lint-js', /*'lint-css',*/ 'qunit-all']);

// Version numbering task.
// grunt bump-version --newver=X.Y.Z
grunt.registerTask('bump-version', 'string-replace');

// Docs task.
grunt.registerTask('screenshots', 'Rebuilds automated docs screenshots', function(){
    var phantomjs = require('phantomjs-prebuilt').path;

    grunt.file.recurse('docs/_static/screenshots/', function(abspath){
        grunt.file.delete(abspath);
    });

    grunt.file.recurse('docs/_screenshots/', function(abspath, root, subdir, filename){
        if (!/.html$/.test(filename))
            return;
        subdir = subdir || '';

        var outdir = 'docs/_static/screenshots/' + subdir,
            outfile = outdir + filename.replace(/.html$/, '.png');

        if (!grunt.file.exists(outdir))
            grunt.file.mkdir(outdir);

        // NOTE: For 'zh-TW' and 'ja' locales install adobe-source-han-sans-jp-fonts (Arch Linux)
        grunt.util.spawn({
            cmd: phantomjs,
            args: ['docs/_screenshots/script/screenshot.js', abspath, outfile]
        });
    });
});

grunt.registerTask('qunit-timezone', 'Run timezone tests', function(){
    process.env.TZ = 'Europe/Moscow';
    grunt.task.run('qunit:timezone');
});

};