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

    // Load grunt tasks automatically
    require('load-grunt-tasks')(grunt);

    // MODULES

    grunt.config('clean', {
        basic: [
            'assets/**/*.css', 'assets/**/*.css.map', '!assets/core/css/custom.css', '!assets/core/css/custom-pdf.css', // CSS
            'assets/core/js/*.js', '!assets/core/js/scripts.js', '!assets/core/js/jquery-ui.js', // JS
            'assets/core/fonts/*', '!assets/core/fonts/.gitignore' // Fonts
        ],
        build: ['assets/default/js/dependencies.js', 'assets/default/js/legacy.js']
    });

    grunt.config('sass', {
        dev: {
            options: {
                outputStyle: 'extended',
                sourceMap: true
            },
            files: grunt.file.expandMapping(['assets/**/sass/*.scss'], 'css', {
                rename: function (dest, matched) {
                    return matched.replace(/\/sass\//, '/' + dest + '/').replace(/\.scss$/, '.css');
                }
            })
        },
        build: {
            options: {
                outputStyle: 'compressed'
            },
            files: grunt.file.expandMapping(['assets/**/sass/*.scss'], 'css', {
                rename: function (dest, matched) {
                    return matched.replace(/\/sass\//, '/' + dest + '/').replace(/\.scss$/, '.css');
                }
            })
        }
    });

    grunt.config('postcss', {
        dev: {
            options: {
                map: true,
                processors: [
                    require('autoprefixer')({
                        browsers: 'last 3 version'
                    })
                ]
            },
            src: [
                'assets/**/css/*.css',
                '!assets/core/css/custom.css',
                '!assets/core/css/custom-pdf.css'
            ]
        },
        build: {
            options: {
                map: false,
                processors: [
                    require('autoprefixer')({
                        browsers: 'last 3 version'
                    })
                ]
            },
            src: [
                'assets/**/css/*.css',
                '!assets/core/css/custom.css',
                '!assets/core/css/custom-pdf.css'
            ]
        }
    });

    grunt.config('concat', {
        legacy: {
            src: [
                'node_modules/html5shiv/dist/html5shiv.js'
            ],
            dest: 'assets/core/js/legacy.js'
        },
        dependencies: {
            src: [
                'node_modules/jquery/dist/jquery.js',
                'node_modules/js-cookie/src/js.cookie.js',
                'assets/core/js/jquery-ui.js',
                'node_modules/bootstrap-sass/assets/javascripts/bootstrap.js',
                'node_modules/bootstrap-datepicker/js/bootstrap-datepicker.js',
                'node_modules/select2/dist/js/select2.full.js',
                'node_modules/dropzone/dist/dropzone.js',
                'node_modules/clipboard/dist/clipboard.js'
            ],
            dest: 'assets/core/js/dependencies.js'
        },
        zxcvbn: {
            src: [
                'node_modules/zxcvbn/dist/zxcvbn.js'
            ],
            dest: 'assets/core/js/zxcvbn.js'
        }
    });

    grunt.config('uglify', {
        build: {
            files: {
                'assets/core/js/legacy.min.js': ['assets/core/js/legacy.js'],
                'assets/core/js/dependencies.min.js': ['assets/core/js/dependencies.js'],
                'assets/core/js/scripts.min.js': ['assets/core/js/scripts.js']
            }
        }
    });

    grunt.config('copy', {
        datepickerlocale: {
            expand: true,
            flatten: true,
            src: ['node_modules/bootstrap-datepicker/js/locales/**'],
            dest: 'assets/core/js/locales/',
            filter: 'isFile'
        },
        select2locale: {
            expand: true,
            flatten: true,
            src: ['node_modules/select2/dist/js/i18n/**'],
            dest: 'assets/core/js/locales/select2/',
            filter: 'isFile'
        },
        fontawesome: {
            expand: true,
            flatten: true,
            src: ['node_modules/font-awesome/fonts/*'],
            dest: 'assets/core/fonts'
        },
        devjs: {
            files: [{
                cwd: 'assets/core/js/',
                src: [
                    '*.js', '!jquery-ui.js'
                ],
                dest: 'assets/core/js/',
                expand: true,
                rename: function(dest, src) {
                    return (dest + src).replace('.js', '.min.js');
                }
            }]
        }
    });

    grunt.config('watch', {
        sass: {
            files: "assets/**/*.scss",
            tasks: ['sass:dev', 'postcss:dev']
        },
        js: {
            files: "assets/core/js/scripts.js",
            tasks: ['uglify']
        }
    });

    // TASKS

    grunt.registerTask('default', 'build');

    grunt.registerTask('dev-build', [
        'clean:basic',
        'sass:dev',
        'postcss:dev',
        'concat:legacy',
        'concat:dependencies',
        'concat:zxcvbn',
        'copy:datepickerlocale',
        'copy:select2locale',
        'copy:fontawesome',
        'copy:devjs'
    ]);

    grunt.registerTask('dev', [
        'clean:basic',
        'sass:dev',
        'postcss:dev',
        'concat:legacy',
        'concat:dependencies',
        'concat:zxcvbn',
        'copy:datepickerlocale',
        'copy:select2locale',
        'copy:fontawesome',
        'copy:devjs',
        'watch'
    ]);

    grunt.registerTask('build', [
        'clean:basic',
        'sass:build',
        'postcss:build',
        'concat:legacy',
        'concat:dependencies',
        'concat:zxcvbn',
        'uglify:build',
        'clean:build',
        'copy:datepickerlocale',
        'copy:select2locale',
        'copy:fontawesome'
    ]);
};
