var every = require('lodash/collection/every');
var fs = require('fs');
const sass = require('node-sass');

module.exports = function (grunt) {
  var lessDir = 'www/less';
  var lessVendorDir = lessDir + '/lib';
  var sassDir = 'www/scss';
//   var sassVendorDir = sassDir + '/mixins';
  var cssDir = 'www/css';
  var jsDir = 'www/js';

  var cssFiles = [
    'search',
    'search-google',
  ];

  var jsFiles = [
    jsDir + '/search.js',
  ];

  //TODO Update or remove for 5.0?
  var wdnMixinLibBaseUrl = 'https://raw.githubusercontent.com/unl/wdntemplates/4.1/wdn/templates_4.1/less/_mixins/';
  var wdnMixins = [
    'breakpoints.less',
    'colors.less',
    'fonts.less',
  ];
  var allMixinsExist = every(wdnMixins, function(value) {
    return fs.existsSync(lessVendorDir + '/' + value);
  });

// TODO: Import DCF and UNLedu 5.0 mixins and variables
//   var dcfMixinLibBaseUrl = 'https://raw.githubusercontent.com/d-c-n/dcf/master/assets/dist/scss/mixins/';
//   var dcfMixins = [
//     '_mixins.backgrounds.scss',
//     '_mixins.margins.scss',
//     '_mixins.padding.scss',
//     '_mixins.typography.scss'
//   ];
//   var allMixinsExist = every(dcfMixins, function(value) {
//     return fs.existsSync(sassVendorDir + '/' + value);
//   });

  var lessFiles = {};
  cssFiles.forEach(function(file) {
    lessFiles[cssDir + '/' + file + '.css'] = lessDir + '/' + file + '.less';
  });

  var sassFiles = {};
  cssFiles.forEach(function(file) {
    sassFiles[cssDir + '/' + file + '-5.0.css'] = sassDir + '/' + file + '.scss';
  });

  var builtJsFiles = {};
  builtJsFiles[jsDir + '/search.min.js'] = jsFiles;

  var autoprefixPlugin = new (require('less-plugin-autoprefix'))({browsers: ["last 2 versions"]});
  var cleanCssPlugin = new (require('less-plugin-clean-css'))();

  // load all grunt tasks matching the ['grunt-*', '@*/grunt-*'] patterns
  require('load-grunt-tasks')(grunt);

  grunt.initConfig({

    'curl-dir': {
      'less-libs': {
        src: wdnMixins.map(function(file) {
          return wdnMixinLibBaseUrl + file;
        }),
        dest: lessVendorDir
      }
//       'dcf-mixins': {
//         src: dcfMixins.map(function(file) {
//           return dcfMixinLibBaseUrl + file;
//         }),
//         dest: sassVendorDir
//       }
      // TODO: add UNLedu 5.0 mixins
    },

    less: {
      all: {
        files: lessFiles,
        options: {
          paths: [lessDir],
          plugins: [
            autoprefixPlugin,
            cleanCssPlugin
          ]
        }
      }
    },

    sass: {
			all: {
				files: sassFiles,
				options: {
          implementation: sass,
					sourceMap: true
// 					includePaths: [
// 						__dirname+'/node_modules/modularscale-sass/stylesheets'
// 					]
				}
			},
    },

		postcss: {
			options: {
				processors: [
					require('autoprefixer'),
					require('cssnano')() // TODO: advanced config of cssnano
				],
				map: true
			},
			dist: {
				src: cssDir + '/*.css'
			}
		},

    uglify: {
      options: {
        sourceMap: true
      },
      all: {
        files: builtJsFiles
      }
    },

    requirejs: {
      all: {
        options: {
          appDir: 'www/js/embed-src/',
          baseUrl: './',
          dir: 'www/js/embed/',
          optimize: 'uglify2',
          logLevel: 2,
          preserveLicenseComments: false,
          generateSourceMaps: true,
          paths: {
            'requireLib': 'require'
          },
          map: {
            "*": {
              css: 'require-css/css'
            }
          },
          modules: [
            {
              name: 'all',
              create: true,
              include: ['requireLib', 'require-css/css', 'ga', 'main'],
              exclude: ['require-css/normalize']
            }
          ]
        }
      }
    },

    clean: {
      lessCss: Object.keys(lessFiles).concat(lessVendorDir),
//       css: Object.keys(sassFiles).concat(sassVendorDir),
      sassCss: Object.keys(sassFiles),
      js: Object.keys(builtJsFiles).concat(jsDir + '/**/*.map')
    },

    watch: {
      less: {
        files: lessDir + '/**/*.less',
        tasks: ['less']
      },
      sass: {
        files: sassDir + '/**/*.scss',
        tasks: ['sass', 'postcss']
      }
    }

  });

  // establish grunt default
  var defaultTasks = ['less', 'sass', 'postcss', 'uglify', 'requirejs'];
  var localTasks = defaultTasks.slice();
  if (!allMixinsExist) {
    defaultTasks.unshift('curl-dir');
  }
  grunt.registerTask('default', defaultTasks);
  grunt.registerTask('all-local', localTasks);

  // legacy targets from Makefile
  grunt.registerTask('all', ['default']);
  grunt.registerTask('js', ['uglify']);
};