module.exports = function (grunt) {
  require('load-grunt-tasks')(grunt);
  require('./tasks/examples')(grunt);
  grunt.loadNpmTasks('typedoc');
  grunt.loadNpmTasks('dts-generator');
  grunt.initConfig({
      pkg: grunt.file.readJSON('package.json'),
      copy: {
          // d3: {
          //     src: 'node_modules/d3/d3.min.js',
          //     dest: 'WebCola/extern/d3.min.js'
          // },
          qunit: {
              src: 'node_modules/qunitjs/qunit/*',
              dest: 'WebCola/test/'
          },
      },
    watch: {
      typescript: {
        files: ["<%= typescript.base.src %>","<%= typescript.examples.src %>"],
        tasks: ["typescript"]
      },
      test: {
        files: ["WebCola/test/*.js"],
        tasks: ["qunit"]
      }
    },
    browserify: {
      dist: {
        options: {
          browserifyOptions: {
            // plugin: [
            //   [
            //     'tsify', { target: 'es6' },
            //   ]
            // ],
            standalone: 'cola',
            // debug: true
          },
          // transform: [["babelify", { "presets": ["es2015"] }]]
        },
        files: {
          'WebCola/cola.js': ['WebCola/index.js']
        }
      },
      examples: {
        options: {
          browserifyOptions: {
            plugin: [
              [
                'tsify', { 
                  target: 'es6',
                  allowJs: true 
                },
              ]
            ],
            debug: true
          },
          transform: [["babelify", { "presets": ["es2015"] }]]
        },
        files: {
          'WebCola/examples/3dlayout.js': ['WebCola/examples/3dlayout.ts'],
          'WebCola/examples/3dtree.js': ['WebCola/examples/3dtree.ts'],
          'WebCola/examples/dotpowergraph.js': ['WebCola/examples/dotpowergraph.ts'],
          'WebCola/examples/powergraphexample.js': ['WebCola/examples/powergraphexample.ts'],
          'WebCola/examples/pretrip.js': ['WebCola/examples/pretrip.ts'],
          'WebCola/examples/statemachinepowergraph.js': ['WebCola/examples/statemachinepowergraph.ts'],
          'WebCola/examples/tetrisbug.js': ['WebCola/examples/tetrisbug.ts'],
          'WebCola/examples/vhybridize.js': ['WebCola/examples/vhybridize.ts']
        }
      },
      test: {
        files: {
          'WebCola/test/bundle.js': ['WebCola/test/vpsctests.js', 'WebCola/test/apitests.js', 'WebCola/test/tests.js', '!WebCola/test/bundle.js']
        },
        options: {
          //browserifyOptions: { debug: true },
          transform: [["babelify", { "presets": ["es2015"] }]]
        }
      }
    },
    ts: {
      commonjs: {
        src: 'WebCola/index.ts',
        options: {
          failOnTypeErrors: false,
          sourceMap: true,
          target: 'es5'
        }
      },
      test: {
        src: ['WebCola/test/*.ts', '!WebCola/index.ts', '!WebCola/src/batch.ts'],
        options: {
          failOnTypeErrors: false,
          target: 'es5',
          sourceMap: true
        }
      },
      examples: {
        src: 'WebCola/examples/tmdbgraph.ts'
      }
    },
    dtsGenerator: {
        options: {
            name: 'cola',
            baseDir: 'WebCola/src',
            out: 'WebCola/cola.d.ts',
            excludes: ['extern/d3v3.d.ts']
        },
        default: {
          src: ['WebCola/src/*.ts', '!WebCola/src/batch.ts', '!WebCola/src/cola.ts'],
        }
    },
    umd: {
      all: {
        src: '<%= dist.dest %>',
        template: 'templates/umd.hbs',
        objectToExport: 'cola',
        deps: {
          'default': ['d3']
        }
      }
    },
    uglify: {
      options: {
        sourceMap: true
      },
      dist: {
        files: {
          'WebCola/cola.min.js': [
            'WebCola/cola.js'
          ]
        }
      }
    },
    qunit: {
      all: ['WebCola/test/*.html'],
      options: {
        force: true
      }
    },
    examples: {
      all: ["WebCola/examples/*.html"]
    },
    typedoc: {
        build: {
          options: {
              module: 'amd',
              target: 'es5',
              out: 'doc/',
              name: 'WebCoLa AKA cola.js',
              theme: 'minimal'
          },
          src: ["<%= ts.base.src %>"]
        }
    },
    connect: {
      server: {
        options: {
          port: 8080,
          base: './WebCola',
          keepalive: true
        }
      }
    }
  });

  grunt.registerTask('default', ['copy', 'ts', 'browserify', 'uglify', 'qunit']);
  grunt.registerTask('nougly', ['ts', 'browserify', 'qunit']);
  grunt.registerTask('nougly-notest', ['ts']);
  grunt.registerTask('docs', ['typedoc', 'browserify:examples']);
  grunt.registerTask('examples', ['browserify:examples']);
  grunt.registerTask('full', ['default', 'browserify:examples', 'examples']);
};
