var simplePersist = require('./data/simple-persist');

module.exports = function(grunt) {

  'use strict';

  var renkan_src = [
      'dist/js/templates.js',
      'js/main.js',
      'js/router.js',
      'js/dataloader.js',
      'js/models.js',
      'js/defaults.js',
      'js/i18n.js',
      'js/full-json.js',
      'js/save-once.js',
      'js/ldtjson-bin.js',
      'js/list-bin.js',
      'js/wikipedia-bin.js',
      'dist/js/paper-renderer.js',
  ];

  var renkan_banner = grunt.file.read('js/header.js').toString() +
      '\n/*! <%= pkg.name %> - v<%= pkg.version %> - Copyright © IRI ' +
      '<%= grunt.template.today("yyyy") %> */\n\n';

  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    requirejs: {
      renderer: {
        options: {
          baseUrl: "js/",
          name: "main-renderer",
          out: "dist/js/paper-renderer.js",
          optimize: "none",
          beautify: true,
          paths: {
            requtils: "require-utils",
            jquery: "empty:",
            underscore: "empty:",
            filesaver: "empty:",
            'ckeditor-core': "empty:",
            'ckeditor-jquery': "empty:"
          }
        }
      }
    },
    jst: {
        compile: {
            options: {
                namespace: 'renkanJST',
                //amd: true
            },
            files: {
                "dist/js/templates.js": ["templates/**/*.html"]
            }
        }
    },
    uglify: {
      options: {
        banner: renkan_banner,
        sourceMap: true,
        sourceMapIncludeSources: true
      },
      renkan: {
        files : {
          'dist/js/renkan.min.js' : renkan_src
        }
      }
    },
    concat: {
      options: {
        banner: renkan_banner
      },
      renkan: {
        files : {
          'dist/js/renkan.js' : renkan_src
        }
      }
    },
    clean: {
      options: {
        force: true
      },
      renderer: ["dist/js/paper-renderer.js"],
      jst:["dist/js/templates.js"],
      renkan: ["dist/"],
      lib: ["lib/"],
      bower: ["bower_components/"]
    },
    cssmin: {
      options: {
        banner: renkan_banner
      },
      renkan: {
        expand: true,
        cwd: 'css/',
        src: ['*.css'],
        dest: 'dist/css',
        ext: '.min.css'
      }
    },
    copy: {
      vendors: {
          files: [{expand: true, cwd: 'vendors/', src: ['**'], dest: 'lib/'}],
      },
      renkan: {
        files: [
          {expand: true, cwd: '', src: ['img/*'], dest: 'dist/', filter: 'isFile'},
          {expand: true, cwd: '', src: ['data/properties.json'], dest: 'dist/', filter: 'isFile'},
          {expand: true, cwd: '', src: ['lib/**'], dest: 'dist/'}
         ]
       },
       renkan_css: {
         options: {
           process: function (content, srcpath) {
             return grunt.template.process(renkan_banner) + content;
           }
         },
         files: [{expand: true, cwd: '', src: ['css/*'], dest: 'dist/', filter: 'isFile'}]
       },
       renkan_server: {
         files: [
           {expand: true, cwd: 'dist', src: ['**', '!data/*', '!lib/**'], dest: '../server/python/django/renkanmanager/static/renkanmanager/lib/renkan/', filter: 'isFile'},
           {expand: true, cwd: 'dist/lib', src: ['**'], dest: '../server/python/django/renkanmanager/static/renkanmanager/lib/', filter: 'isFile'},
           {expand: true, cwd: 'dist', src: ['**', '!data/*', '!lib/**'], dest: '../server/php/basic/public_html/static/lib/renkan/', filter: 'isFile'},
           {expand: true, cwd: 'dist/lib', src: ['**'], dest: '../server/php/basic/public_html/static/lib/', filter: 'isFile'}
         ]
       }
    },
    jshint: {
      options: {
        curly: true,
        eqeqeq: true,
        eqnull: true,
        browser: true,
        globals: {
          jQuery: true
        },
      },
      all: ['Gruntfile.js', 'js/**/*.js', 'data/simple-persist.js']
    },
    bower: {
        install: {
            options: {
                targetDir: './lib',
                layout: 'byComponent',
                install: true,
                verbose: false,
                cleanTargetDir: true,
                cleanBowerDir: false,
                bowerOptions: {}
            }
        }
    },
    watch: {
        css:{
            files: ['css/**/*.css'],
            tasks: ['cssmin', 'copy:renkan_css'],
        },
        js:{
            files: ['js/**/*.js', 'templates/**/*.html'],
            tasks: ['jshint', 'requirejs', 'jst', 'concat', 'uglify', 'copy:renkan', 'clean:renderer'],
        },
        lib:{
            files: ['bower.json'],
            tasks: ['bower:install', 'copy:vendors', 'copy:renkan'],
        },
        vendors: {
            files: ['vendors/**'],
            tasks: ['copy:vendors', 'copy:renkan'],
        },
        options: {
            interrupt: true,
        },
    },
    connect: {
        server: {
          options: {
            port: 9001,
            base: '.',
            useAvailablePort: true,
            debug: true,
            middleware: function(connect, options, middlewares) {
              middlewares.push(simplePersist.middleware);
              return middlewares;
            }
          },
        }
    }
  });

  // Load the plugin that provides the "uglify" task.
  grunt.loadNpmTasks('grunt-contrib-requirejs');
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-contrib-cssmin');
  grunt.loadNpmTasks('grunt-contrib-copy');
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-contrib-connect');
  grunt.loadNpmTasks('grunt-bower-task');
  grunt.loadNpmTasks('grunt-contrib-jst');
  grunt.loadNpmTasks('grunt-contrib-watch');

  // Default task(s).
  grunt.registerTask('base', ['jshint', 'bower:install', 'copy:vendors', 'clean:renkan', 'requirejs', 'jst', 'concat', 'uglify', 'cssmin', 'copy:renkan', 'copy:renkan_css', 'clean:renderer']);
  grunt.registerTask('default', ['base', 'clean:jst']);
  grunt.registerTask('copy-server', 'copy files to server part', function(){
      grunt.task.run(['copy:renkan_server']);
  });
  grunt.registerTask('dev', [ 'base', 'connect:server', 'watch']);


};
