var gulp = require('gulp');
var handlebars = require('gulp-handlebars');
var declare = require('gulp-declare');
var concat = require('gulp-concat');
var wrap = require("gulp-wrap");
var livereload = require('gulp-livereload');
var path = require('path');
var streamqueue = require('streamqueue');
var stripbom = require('gulp-stripbom');

var paths = require('./paths.js');

gulp.task('handlebars', function() {

    var coreStream = gulp.src([
        paths.src.templates,
        '!*/**/*Partial.*'
    ])
        .pipe(stripbom({ showLog : false }))
        .pipe(handlebars())
        .pipe(declare({
            namespace   : 'T',
            noRedeclare : true,
            processName : function(filePath) {

                filePath = path.relative(paths.src.root, filePath);

                return filePath.replace(/\\/g, '/')
                    .toLocaleLowerCase()
                    .replace('template', '')
                    .replace('.js', '');
            }
        }));

    var partialStream = gulp.src([paths.src.partials])
        .pipe(stripbom({ showLog : false }))
        .pipe(handlebars())
        .pipe(wrap('Handlebars.template(<%= contents %>)'))
        .pipe(wrap('Handlebars.registerPartial(<%= processPartialName(file.relative) %>, <%= contents %>)', {}, {
            imports : {
                processPartialName : function(fileName) {
                    return JSON.stringify(
                        path.basename(fileName, '.js')
                    );
                }
            }
        }));

    return streamqueue({ objectMode : true },
        partialStream,
        coreStream
    ).pipe(concat('templates.js'))
        .pipe(gulp.dest(paths.dest.root))
        .pipe(livereload());
});