gulp = require('gulp')
coffee = require('gulp-coffee')
concat = require('gulp-concat')
uglify = require 'gulp-uglify'
sourcemaps = require('gulp-sourcemaps')
browserify = require('gulp-browserify')
rename = require 'gulp-rename'
rimraf = require 'gulp-rimraf'
gulpif = require 'gulp-if'
ignore = require 'gulp-ignore'
git = require 'gulp-git'
debug = require 'gulp-debug'
coffeelint = require 'gulp-coffeelint'
mocha = require 'gulp-mocha'
run = require 'gulp-run'
ljs = require 'gulp-ljs'
plumber = require 'gulp-plumber'
cache = require 'gulp-cached'
coffeeify = require 'gulp-coffeeify'
exit = require 'gulp-exit'

gulp.task 'default', ['build_browser']

files =
  lib : ['./lib/**/*.coffee']
  browser : ['./lib/y.coffee','./lib/y-object.coffee']
  test : ['./test/**/*test.coffee', '../y-*/test/*test.coffee']
  #test : ['./test/Json_test.coffee', './test/Text_test.coffee']
  gulp : ['./gulpfile.coffee']
  examples : ['./examples/**/*.js']
  other: ['./lib/**/*', './test/*']

files.all = []
for name,file_list of files
  if name isnt 'build'
    files.all = files.all.concat file_list

gulp.task 'deploy_nodejs', ->
  gulp.src files.lib
    .pipe sourcemaps.init()
    .pipe coffee()
    .pipe sourcemaps.write './'
    .pipe gulp.dest 'build/node/'
    .pipe gulpif '!**/', git.add({args : "-A"})

gulp.task 'deploy', ['mocha', 'build_browser', 'deploy_nodejs', 'lint', 'codo']

gulp.task 'build_browser', ->
  gulp.src files.browser, { read: false }
    .pipe plumber()
    .pipe browserify
      transform: ['coffeeify']
      extensions: ['.coffee']
      debug : true
    .pipe rename
      extname: ".js"
    .pipe gulp.dest './build/browser/'
    .pipe uglify()
    .pipe gulp.dest '.'

  gulp.src files.test, {read: false}
    .pipe plumber()
    .pipe browserify
      transform: ['coffeeify']
      extensions: ['.coffee']
      debug: true
    .pipe rename
      extname: ".js"
      dirname: "./"
    .pipe gulp.dest './build/test/'

gulp.task 'build_node', ->
  gulp.src files.lib
    .pipe plumber()
    .pipe coffee({bare:true})
    .pipe gulp.dest './build/node'

gulp.task 'build', ['build_node', 'build_browser'], ->

gulp.task 'watch', ['build'], ->
  gulp.watch files.all, ['build']

gulp.task 'mocha', ->
  gulp.src files.test, { read: false }
    .pipe mocha {reporter : 'list'}
    .pipe exit()

gulp.task 'lint', ->
  gulp.src files.all
    .pipe ignore.include '**/*.coffee'
    .pipe coffeelint {
      "max_line_length":
        "level": "ignore"
      }
    .pipe coffeelint.reporter()

gulp.task 'literate', ->
  gulp.src files.examples
    .pipe ljs { code : true }
    .pipe rename
      basename : "README"
      extname : ".md"
    .pipe gulp.dest 'examples/'
    .pipe gulpif '!**/', git.add({args : "-A"})

gulp.task 'codo', [], ()->
  command = './node_modules/codo/bin/codo -o "./doc" --name "yjs" --readme "README.md" --undocumented false --private true --title "yjs API" ./lib - LICENSE.txt '
  run(command).exec()

gulp.task 'clean', ->
  gulp.src ['./build/{browser,test,node}/**/*.{js,map}','./doc/'], { read: false }
    .pipe rimraf()

gulp.task 'default', ['clean','build'], ->