/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

'use strict';

module.exports = function (grunt) {

  // Project configuration.
  grunt.config.init({
    buildEnv: grunt.option('buildEnv') || 'prod',
    buildNumber: grunt.option('buildNumber') || '0',
    pkg: grunt.file.readJSON('package.json'),
    config: grunt.file.readJSON('grunt.json'),
    bump: {
      options: {
        files: '<%= config.bump.options.files %>',
        commit: true,
        commitFiles: '<%= config.bump.options.commitFiles %>',
        commitMessage: 'Release v%VERSION%',
        createTag: false,
        tagName: 'v%VERSION%',
        tagMessage: 'Version %VERSION%',
        push: false
      }
    },
    changelog: {
      options: {
        dest: 'CHANGELOG.md',
        prepend: true
      }
    },
    clean: {
      build: ['dist/', 'tmp/'],
      tmp: ['tmp/']
    },
    concat: {
      app: {
        src: [
          'tmp/js/templates.js',
          'app/js/**/*.js'
        ],
        dest: 'tmp/js/scripts.js'
      },
      components: '<%= config.concat.components %>',
      css: '<%= config.concat.css %>'
    },
    copy: {
      tmp: {
        files: [
          {
            expand: true,
            cwd: 'app/',
            src: ['**'],
            dest: 'tmp/'
          }
        ]
      },
      build: {
        files: [
          {
            expand: true,
            cwd: 'tmp/',
            src: ['index.html', 'js/scripts.min.js', 'image/**', 'css/styles.min.css', 'routes.json'],
            dest: 'dist/',
            rename: function (desc, src) {
              return desc + src.replace('min.', 'min.<%= buildNumber %>.')
            }
          },
          {
            expand: true,
            cwd: 'tmp/',
            src: ['htaccess.dist'],
            dest: 'dist/',
            rename: function (dest, src) {
              console.log(src);
              if (src == 'htaccess.dist') {
                return dest + '.htaccess';
              }
            }
          },
          {
            expand: true,
            cwd: 'app/components/font-awesome/',
            src: ['fonts/*'],
            dest: 'dist/'
          },
          {
            expand: true,
            cwd: 'app/components/bootstrap/dist/',
            src: ['fonts/*'],
            dest: 'dist/'
          },
          {
            expand: true,
            cwd: 'app',
            src: ['fonts/*'],
            dest: 'dist/'
          },
          {
            expand: true,
            cwd: 'app/components/ace/',
            src: ['fonts/*'],
            dest: 'dist/'
          },
          {
            expand: true,
            cwd: 'app/components/angular-tree-control/images/',
            src: ['*'],
            dest: 'dist/images'
          },
          {
            expand: true,
            cwd: 'app/components/chosen/',
            src: ['*.png'],
            dest: 'dist/css'
          },
          {
            expand: true,
            cwd: 'app/components/angular-ui-grid/',
            src: ['ui-grid.eot', 'ui-grid.svg', 'ui-grid.ttf', 'ui-grid.woff'],
            dest: 'dist/css'
          },
          {
            expand: true,
            cwd: 'app/components/ace-builds/',
            src: ['src-min-noconflict/worker-json.js'],
            flatten: true,
            dest: 'dist/'
          }
        ]
      }
    },
    html2js: {
      partials: {
        src: ['app/partials/**/*.html'],
        dest: 'tmp/js/templates.js',
        module: 'templates',
        options: {
          base: 'app/'
        }
      }
    },
    htmlrefs: {
      dist: {
        src: 'tmp/index.html',
        dest: 'tmp/'
      },
      options: {
        buildNumber: '<%= buildNumber %>'
      }
    },
    jshint: {
      files: ['app/js/**/*.js', '!app/components/**'],
      options: {
        jshintrc: '.jshintrc'
      }
    },
    less: {
      prod: {
        options: {
          compress: true,
          yuicompress: true
        },
        files: {
          'tmp/css/styles.css': 'tmp/less/build.less'
        }
      }
    },
    lesslint: {
      src: ['app/less/**.less']
    },
    manifest: {
      build: {
        options: {
          basePath: 'dist/',
          timestamp: true
        },
        src: ['**/**.**'],
        dest: 'dist/manifest.appcache'
      }
    },
    'regex-replace': {
      strict: {
        src: ['tmp/js/scripts.js'],
        actions: [
          {
            name: 'use strict',
            search: '\\\'use strict\\\';',
            replace: '',
            flags: 'gmi'
          }
        ]
      },
      manifest: {
        src: ['tmp/index.html'],
        actions: [
          {
            name: 'manifest',
            search: '<html>',
            replace: '<html manifest="manifest.appcache">'
          }
        ]
      },
      templates: {
        src: ['tmp/js/scripts.js'],
        actions: [
          {
            name: 'templates',
            search: /kylin\', \[/,
            replace: 'kylin\', [\'templates\',',
            flags: 'gmi'
          }
        ]
      }
    },
    uglify: {
      app: {
        options: {
          mangle: false
        },
        files: {
          'tmp/js/scripts.js': 'tmp/js/scripts.js'
        }
      }
    },
    karma: {
      unit: {
        configFile: 'karma.unit.conf.js'
      },
      e2e: {
        configFile: 'karma.e2e.conf.js'
      }
    }
  });

  // Additional task plugins
  grunt.loadNpmTasks('grunt-contrib');
  grunt.loadNpmTasks('grunt-conventional-changelog');
  grunt.loadNpmTasks('grunt-bump');
  grunt.loadNpmTasks('grunt-html2js');
  grunt.loadNpmTasks('grunt-htmlrefs');
  grunt.loadNpmTasks('grunt-lesslint');
  grunt.loadNpmTasks('grunt-manifest');
  grunt.loadNpmTasks('grunt-regex-replace');
  grunt.loadNpmTasks('grunt-karma');

  grunt.registerTask('test', ['jshint', 'lesslint']);

  grunt.registerTask('prod', [
//    'test',
    'clean:build',
    'copy:tmp',
    'html2js',
    'concat:app',
    'regex-replace:strict',
    'regex-replace:templates',
    'uglify',
    'regex-replace:manifest',
    'concat:components',
    'less',
    'concat:css',
    'htmlrefs',
    'copy:build',
    'clean:tmp',
    'manifest',
    'changelog'
  ]);

  grunt.registerTask('dev', [
//    'test',
    'clean:build',
    'copy:tmp',
    'html2js',
    'concat:app',
    'regex-replace:strict',
    'regex-replace:templates',
//        'uglify',
    'regex-replace:manifest',
    'concat:components',
    'less',
    'concat:css',
    'htmlrefs',
    'copy:build',
    'clean:tmp',
    'manifest',
    'changelog'
  ]);
};
