require '../global'
fs = require 'fs'
np = require 'path'
util = require './utility'
watcher = require './watcher'
browserBuild = require 'browser-build'

check = (config) ->
    throw new Error "config.coffee.input is required" unless config.coffee.input?
    throw new Error "config.coffee.output is required" unless config.coffee.output?
    if config.browser?
        config.browser.input ?= {}
        config.browser.input[config.coffee.output] ?= config.name
        config.browser.output ?= "browser"
    return

build = (config, callback) ->
    util.spawn "coffee.cmd -c -m -o #{config.coffee.output} #{config.coffee.input}", callback

runTest = (config, callback) ->
    list = util.list config.coffee.output, {include:".js"}
    util.spawn "mocha.cmd --harmony -R spec #{list.join ' '}", callback
    # util.spawn "mocha.cmd --recursive -R spec -g unitTest* -u exports #{config.coffee.output}", callback
watchCompile = (config) ->
    util.spawn "coffee.cmd -w -m -c -o #{config.coffee.output} #{config.coffee.input}"
    if config.browser?
        browserBuild.watch config.browser
watchTest = (config) ->
    # use a directory watcher to invoke nodeunit tests
    debouncedRunTest = (->
        runTest config
    ).debounce(500)
    options =
        filter: ".js"
        initial: false
    watcher.watchDirectory config.coffee.output, options, debouncedRunTest
getPackageJson = (config) ->
    path = np.join(config.coffee.output, 'package.json')
    JSON.parse fs.readFileSync(path, 'utf8')
module.exports = exports =
    # builds this project
    build: (config, callback) ->
        check config
        build config, ->
            if config.browser?
                browserBuild.build config.browser
            runTest config, callback

    # watches input and incrementally builds output
    watch: (config) ->
        check config
        watchCompile config
        watchTest config
        # maybe start a web server
        if config.browser?.port?
            util.startWebServer
                root: config.browser.output.directory
                port: config.browser.port
    # runs our unit tests
    test: (config, callback) ->
        check config
        runTest config, callback
    # runs npm publish on the output library
    publish: (config) ->
        util.spawn "npm.cmd publish #{config.coffee.output}"
    # bumps the package.json build version number
    bump: (config) ->
        pj = getPackageJson config
        version = pj.version.split '.'
        # bump the build version
        version[2] = parseInt(version[2]) + 1
        version = version.join '.'
        util.spawn "npm.cmd version #{version}", {cwd:config.coffee.output}, ->
            # now publish it
            exports.publish config
