Path        = require "path"
Del         = require "del"
Norma       = require "normajs"
$           = require("gulp-load-plugins")({
  config: Path.join __dirname, "package.json"
})
$.include   = require "./lib/include"


module.exports = (config, name) ->

  # CONFIG ----------------------------------------------------------------
  name or= "javascript"

  src = Path.normalize(config.tasks[name].src)
  dest = Path.normalize(config.tasks[name].dest)


  # FLAGS -----------------------------------------------------------------

  isProduction = Norma.production or Norma.prod or config.tasks[name].minify or false


  # JAVASCRIPT-CLEAN ------------------------------------------------------

  Norma.task "#{name}-clean", (cb) ->

    cleanTargets = [
      dest
      '!./node_modules/'
    ]

    if config.tasks[name].ignore
      cleanTargets = cleanTargets.concat config.tasks[name].ignore

    # Remove export folder and files
    Del cleanTargets, cb(null)




  # JAVASCRIPT-HINT -------------------------------------------------------

  Norma.task "#{name}-hint",  (cb) ->

    Norma.src([
      src + ".coffee"
      ])
      .pipe $.newer("#{dest}.js")
      .pipe $.plumber()
      .pipe $.coffeelint()
      .pipe $.coffeelint.reporter()
      .on("error", $.util.log)

    cb null




  # JAVASCRIPT-COMPILE ---------------------------------------------------

  Norma.task "#{name}-compile", (cb) ->

    # Proccess Scripts
    Norma.src([
        src + ".{js,coffee}"
      ])
      .pipe $.newer("#{dest}.js")
      .pipe $.plumber()
      .pipe $.include()
      .pipe( $.tap( (file, t) ->

        if Path.extname(file.path) is ".coffee"

          return t.through $.coffee, [{bare: true}]

      ))
      # .pipe(
      #   $.if(isProduction, $.replace(/(\/\/)?(console\.)?log\((.*?)\);?/g, ""))
      # )
      .pipe $.if(isProduction, $.uglify(), $.beautify())
      .pipe Norma.dest(dest)
      .on("error", $.util.log)
      .on("close", ->
        cb null
      )

    # cb null




  # JAVASCRIPT ----------------------------------------------------------

  Norma.task "#{name}", (cb) ->

    Norma.execute "#{name}-hint", "#{name}-compile", ->

      Norma.emit "message", "#{name}: ✔ All done!"

      cb null





  Norma.tasks["#{name}"].ext = [".js", ".coffee"]

  module.exports.tasks = Norma.tasks
