(function(){
    'use strict';
    var gulp = require('gulp'),
        connect = require('gulp-connect'),
        open = require('gulp-open'),
        less = require('gulp-less'),
        rename = require('gulp-rename'),
        header = require('gulp-header'),
        path = require('path'),
        uglify = require('gulp-uglify'),
        sourcemaps = require('gulp-sourcemaps'),
        minifyCSS = require('gulp-minify-css'),
        tap = require('gulp-tap'),
        concat = require('gulp-concat'),
        jshint = require('gulp-jshint'),
        stylish = require('jshint-stylish'),
        fs = require('fs'),
        paths = {
            root: './',
            build: {
                root: 'build/',
                styles: 'build/css/',
                scripts: 'build/js/'
            },
            dist: {
                root: 'dist/',
                styles: 'dist/css/',
                scripts: 'dist/js/'
            },
            playground: {
                root: 'playground/'
            },
            source: {
                root: 'src/',
                styles: 'src/less/',
                scripts: 'src/js/*.js'
            },
        },
        swiper = {
            filename: 'swiper',
            jsFiles: [
                'src/js/wrap-start.js',
                'src/js/swiper-intro.js',
                'src/js/core.js',
                'src/js/effects.js',
                'src/js/lazy-load.js',
                'src/js/scrollbar.js',
                'src/js/controller.js',
                'src/js/hashnav.js',
                'src/js/keyboard.js',
                'src/js/mousewheel.js',
                'src/js/parallax.js',
                'src/js/plugins.js',
                'src/js/emitter.js',
                'src/js/a11y.js',
                'src/js/init.js',
                'src/js/swiper-outro.js',
                'src/js/swiper-proto.js',
                'src/js/dom.js',
                'src/js/get-dom-lib.js',
                'src/js/dom-plugins.js',
                'src/js/wrap-end.js',
                'src/js/amd.js'
            ],
            jQueryFiles : [
                'src/js/wrap-start.js',
                'src/js/swiper-intro.js',
                'src/js/core.js',
                'src/js/effects.js',
                'src/js/lazy-load.js',
                'src/js/scrollbar.js',
                'src/js/controller.js',
                'src/js/hashnav.js',
                'src/js/keyboard.js',
                'src/js/mousewheel.js',
                'src/js/parallax.js',
                'src/js/plugins.js',
                'src/js/emitter.js',
                'src/js/a11y.js',
                'src/js/init.js',
                'src/js/swiper-outro.js',
                'src/js/swiper-proto.js',
                'src/js/get-dom-lib.js',
                'src/js/dom-plugins.js',
                'src/js/wrap-end.js',
                'src/js/amd.js'
            ],
            jQueryUMDFiles : [
                'src/js/wrap-start-umd.js',
                'src/js/swiper-intro.js',
                'src/js/core.js',
                'src/js/effects.js',
                'src/js/lazy-load.js',
                'src/js/scrollbar.js',
                'src/js/controller.js',
                'src/js/hashnav.js',
                'src/js/keyboard.js',
                'src/js/mousewheel.js',
                'src/js/parallax.js',
                'src/js/plugins.js',
                'src/js/emitter.js',
                'src/js/a11y.js',
                'src/js/init.js',
                'src/js/swiper-outro.js',
                'src/js/swiper-proto.js',
                'src/js/get-jquery.js',
                'src/js/dom-plugins.js',
                'src/js/wrap-end-umd.js',
            ],
            Framework7Files : [
                'src/js/swiper-intro-f7.js',
                'src/js/core.js',
                'src/js/effects.js',
                'src/js/lazy-load.js',
                'src/js/scrollbar.js',
                'src/js/controller.js',
                'src/js/parallax.js',
                'src/js/plugins.js',
                'src/js/emitter.js',
                'src/js/a11y.js',
                'src/js/init.js',
                'src/js/swiper-outro.js',
                'src/js/swiper-proto.js',
            ],
            pkg: require('./bower.json'),
            banner: [
                '/**',
                ' * Swiper <%= pkg.version %>',
                ' * <%= pkg.description %>',
                ' * ',
                ' * <%= pkg.homepage %>',
                ' * ',
                ' * Copyright <%= date.year %>, <%= pkg.author %>',
                ' * The iDangero.us',
                ' * http://www.idangero.us/',
                ' * ',
                ' * Licensed under <%= pkg.license.join(" & ") %>',
                ' * ',
                ' * Released on: <%= date.month %> <%= date.day %>, <%= date.year %>',
                ' */',
                ''].join('\n'),
            date: {
                year: new Date().getFullYear(),
                month: ('January February March April May June July August September October November December').split(' ')[new Date().getMonth()],
                day: new Date().getDate()
            }
        };

    function addJSIndent (file, t, minusIndent) {
        var addIndent = '        ';
        var filename = file.path.split('src/js/')[1];
        if (['wrap-start.js', 'wrap-start-umd.js', 'wrap-end.js', 'wrap-end-umd.js', 'amd.js'].indexOf(filename) !== -1) {
            addIndent = '';
        }
        if (filename === 'swiper-intro.js' || filename === 'swiper-intro-f7.js' || filename === 'swiper-outro.js' || filename === 'dom.js' || filename === 'get-dom-lib.js' || filename === 'get-jquery.js' || filename === 'dom-plugins.js' || filename === 'swiper-proto.js') addIndent = '    ';
        if (minusIndent) {
            addIndent = addIndent.substring(4);
        }
        if (addIndent !== '') {
            var fileLines = fs.readFileSync(file.path).toString().split('\n');
            var newFileContents = '';
            for (var i = 0; i < fileLines.length; i++) {
                newFileContents += addIndent + fileLines[i] + (i === fileLines.length ? '' : '\n');
            }
            file.contents = new Buffer(newFileContents);
        }
    }
    gulp.task('scripts', function (cb) {
        gulp.src(swiper.jsFiles)
            .pipe(tap(function (file, t){
                addJSIndent (file, t);
            }))
            .pipe(sourcemaps.init())
            .pipe(concat(swiper.filename + '.js'))
            .pipe(header(swiper.banner, { pkg : swiper.pkg, date: swiper.date } ))
            .pipe(jshint())
            .pipe(jshint.reporter(stylish))
            .pipe(sourcemaps.write('./maps/'))
            .pipe(gulp.dest(paths.build.scripts));

            
        gulp.src(swiper.jQueryFiles)
            .pipe(tap(function (file, t){
                addJSIndent (file, t);
            }))
            .pipe(sourcemaps.init())
            .pipe(concat(swiper.filename + '.jquery.js'))
            .pipe(header(swiper.banner, { pkg : swiper.pkg, date: swiper.date } ))
            .pipe(sourcemaps.write('./maps/'))
            .pipe(gulp.dest(paths.build.scripts));
        gulp.src(swiper.jQueryUMDFiles)
            .pipe(tap(function (file, t){
                addJSIndent (file, t);
            }))
            .pipe(sourcemaps.init())
            .pipe(concat(swiper.filename + '.jquery.umd.js'))
            .pipe(header(swiper.banner, { pkg : swiper.pkg, date: swiper.date } ))
            .pipe(sourcemaps.write('./maps/'))
            .pipe(gulp.dest(paths.build.scripts));
        gulp.src(swiper.Framework7Files)
            .pipe(tap(function (file, t){
                addJSIndent (file, t, true);
            }))
            .pipe(sourcemaps.init())
            .pipe(concat(swiper.filename + '.framework7.js'))
            .pipe(header(swiper.banner, { pkg : swiper.pkg, date: swiper.date } ))
            .pipe(sourcemaps.write('./maps/'))
            .pipe(gulp.dest(paths.build.scripts))
            .pipe(connect.reload());
        cb();
    });
    gulp.task('styles', function (cb) {

        gulp.src(paths.source.styles + 'swiper.less')
            .pipe(less({
                paths: [ path.join(__dirname, 'less', 'includes') ]
            }))
            .pipe(header(swiper.banner, { pkg : swiper.pkg, date: swiper.date }))
            .pipe(rename(function(path) {
                path.basename = swiper.filename;
            }))
            .pipe(gulp.dest(paths.build.styles))
            .pipe(connect.reload());

        gulp.src([
                paths.source.styles + 'core.less',
                paths.source.styles + 'navigation-f7.less',
                paths.source.styles + 'effects.less',
                paths.source.styles + 'scrollbar.less',
                paths.source.styles + 'preloader-f7.less',
            ])
            .pipe(concat(swiper.filename + '.framework7.less'))
            .pipe(header('/* === Swiper === */\n'))
            .pipe(gulp.dest(paths.build.styles));
        cb();
    });
    gulp.task('build', ['scripts', 'styles'], function (cb) {
        cb();
    });

    gulp.task('dist', function () {
        gulp.src([paths.build.scripts + swiper.filename + '.js'])
            .pipe(gulp.dest(paths.dist.scripts))
            .pipe(sourcemaps.init())
            .pipe(uglify())
            .pipe(header(swiper.banner, { pkg : swiper.pkg, date: swiper.date }))
            .pipe(rename(function(path) {
                path.basename = swiper.filename + '.min';
            }))
            .pipe(sourcemaps.write('./maps'))
            .pipe(gulp.dest(paths.dist.scripts));

        gulp.src([paths.build.scripts + swiper.filename + '.jquery.js'])
            .pipe(gulp.dest(paths.dist.scripts))
            .pipe(sourcemaps.init())
            .pipe(uglify())
            .pipe(header(swiper.banner, { pkg : swiper.pkg, date: swiper.date } ))
            .pipe(rename(function(path) {
                path.basename = swiper.filename + '.jquery.min';
            }))
            .pipe(sourcemaps.write('./maps'))
            .pipe(gulp.dest(paths.dist.scripts));

        gulp.src([paths.build.scripts + swiper.filename + '.jquery.umd.js'])
            .pipe(gulp.dest(paths.dist.scripts))
            .pipe(sourcemaps.init())
            .pipe(uglify())
            .pipe(header(swiper.banner, { pkg : swiper.pkg, date: swiper.date } ))
            .pipe(rename(function(path) {
                path.basename = swiper.filename + '.jquery.umd.min';
            }))
            .pipe(sourcemaps.write('./maps'))
            .pipe(gulp.dest(paths.dist.scripts));

        gulp.src(paths.build.styles + '*.css')
            .pipe(gulp.dest(paths.dist.styles))
            .pipe(minifyCSS({
                advanced: false,
                aggressiveMerging: false,
            }))
            .pipe(header(swiper.banner, { pkg : swiper.pkg, date: swiper.date }))
            .pipe(rename(function(path) {
                path.basename = swiper.filename + '.min';
            }))
            .pipe(gulp.dest(paths.dist.styles));
    });

    gulp.task('watch', function () {
        gulp.watch(paths.source.scripts, [ 'scripts' ]);
        gulp.watch(paths.source.styles + '*.less', [ 'styles' ]);
    });

    gulp.task('connect', function () {
        return connect.server({
            root: [ paths.root ],
            livereload: true,
            port:'3000'
        });
    });

    gulp.task('open', function () {
        return gulp.src(paths.playground.root + 'index.html').pipe(open({ uri: 'http://localhost:3000/' + paths.playground.root + 'index.html'}));
    });

    gulp.task('server', [ 'watch', 'connect', 'open' ]);

    gulp.task('default', [ 'server' ]);
})();
