“use strict”;

var srcFiles = ‘app/*/.js’; var htmlFiles = ‘app/*/.html’; var cssFiles = ‘app/*/.scss’; var specFiles = ‘spec/*/.js’; var devServerPort = 8081; var reloadPort = 35279; var confPath = ‘app/static/configs’; var arethusaPackages = ‘bower_components/arethusa/dist/arethusa_packages.min.js’; var arethusaFiles = ‘bower_components/arethusa/dist/arethusa.min.js’; var specHelpers = ‘bower_components/arethusa/spec/helpers/*/’;

module.exports = function(grunt) {

require('load-grunt-tasks')(grunt);

function confFiles() {
  return grunt.file.expand(confPath + '/*.json');
}

function confMergeCommands() {
  var file, target, cmd, cmds = [];
  var files = confFiles();
  for (var i = files.length - 1; i >= 0; i--){
    file = files[i];
    target = file.replace(confPath, 'dist/configs');
    cmd = 'arethusa merge ' + file + ' -m > ' + target;
    cmds.push(cmd);
  }
  return cmds;
}

grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),
  jasmine: {
    src: srcFiles,
    options: {
      specs: specFiles
    }
  },
  karma: {
    spec: {
      autoWatch: false,
      singleRun: true,
      options: {
        files : [
          arethusaPackages,
          'bower_components/angular-mocks/angular-mocks.js',
          specHelpers,
          arethusaFiles,
          srcFiles,
          specFiles
        ],
        frameworks: ['jasmine'],
        browsers : ['PhantomJS'],
        plugins : [
          'karma-chrome-launcher',
          'karma-phantomjs-launcher',
          'karma-firefox-launcher',
          'karma-jasmine',
          'karma-coverage'
        ],
        reporters: ['progress', 'coverage'],
        preprocessors: {
          'app/**/*.js': ['coverage']
        },
        coverageReporter: {
          reporters: [
            {type: 'html', dir:'coverage/'},
            {type: 'lcov'},
          ]
        }
      }
    },
  },
  coveralls: {
    src: 'coverage/**/lcov.info'
  },
  uglify: {
    options: {
      sourceMap: true
    },
    '<%= namespaced_name %>' : {
      files: {
        'dist/<%= namespaced_name %>.min.js' : [
          'app/js/<%= namespaced_name %>.js',
          'app/js/<%= namespaced_name %>/**/*.js',
          'app/templates/<%= namespaced_name %>/compiled/<%= namespaced_name %>.templates.js'
        ]
      }
    }
  },
  sass: {
    dist: {
      options: {
        sourcemap: true
      },
      files: {
        'app/css/<%= namespaced_name %>.css': 'app/css/<%= namespaced_name %>.scss'
      }
    }
  },
  cssmin: {
    css: {
      src: 'app/css/**/*.css',
      dest: 'dist/<%= namespaced_name %>.min.css'
    }
  },
  ngtemplates : {
    '<%= namespaced_name %>' : {
      cwd: 'app',
      src: 'templates/**/*.html',
      dest: 'app/templates/<%= namespaced_name %>/compiled/<%= namespaced_name %>.templates.js'
    }
  },
  connect: {
    devServer: {
      options: {
        port: devServerPort,
        debug: true,
        keepalive: true,
        livereload: reloadPort,
        middleware: function(connect) {
          return [
            require('connect-livereload')(),
            connect.static(require('path').resolve('./'))
          ];
        }
      }
    },
  },
  watch: {
    spec: {
      files: [srcFiles, htmlFiles, specFiles],
      tasks: 'karma:spec'
    },
    server: {
      files: [srcFiles, htmlFiles, cssFiles],
      tasks: 'minify',
      options: {
        spawn: false,
        livereload: reloadPort
      }
    },
  },
  jshint: {
    options: {
      jshintrc: true,
    },
    all: ['*.js', srcFiles, specFiles]
  },
  shell: {
    minifyConfs: {
      command: confMergeCommands().join('&')
    }
  },
  concurrent: {
    minify: {
      tasks: [ 'minify:src', 'minify:css', 'minify:conf' ]
    },
    server: {
      tasks: ['watch:server', 'server'],
      options: {
        logConcurrentOutput: true
      }
    }
  }
});

grunt.registerTask('minify:src', ['ngtemplates', 'uglify']);
grunt.registerTask('minify:css', ['sass', 'cssmin']);
grunt.registerTask('minify:conf', 'shell:minifyConfs');
grunt.registerTask('minify', ['concurrent:minify']);

grunt.registerTask('spec', 'watch:spec');
grunt.registerTask('server', ['minify', 'connect:devServer']);
grunt.registerTask('reload-server', 'concurrent:server');
grunt.registerTask('default', ['karma:spec', 'jshint']);

};