#!/usr/bin/env coffee

# requires
exec = require('child_process').exec
print = require('sys').print
spawn = require('child_process').spawn
stat = require('fs').stat

# globals
coffeeProcess = null
mainFile = if process.argv[2]? then process.argv[2] else 'main.coffee'
restartedServer = false
watchedFiles = {}

# functions
poller = () ->
	restartedServer = false
	exec "find . -name '*.coffee' -print", (error, stdout, stderr) ->
		fileList = stdout.split('\n')
		for file in fileList
			restartIfNeeded file if file != '' && !restartedServer

restartIfNeeded = (file) ->
	stat file, (err, stats) ->
		oldModifiedTime = watchedFiles[file]
		newModifiedTime = new Date(stats.mtime)
		watchedFiles[file] = newModifiedTime
		if newModifiedTime > oldModifiedTime && !restartedServer
			restartedServer = true
			coffeeProcess.kill()
			startCoffee(mainFile)

startCoffee = () ->
	console.log 'Starting CoffeeScript...'
	coffeeProcess = spawn 'coffee', [mainFile]
	coffeeProcess.stdout.on 'data', (data) ->
		print data
	coffeeProcess.stderr.on 'data', (data) ->
		print data
	coffeeProcess.on 'exit', (code) ->
		console.log 'Process exited with code ' + code

# main
require('path').exists mainFile, (exists) ->
	if exists
		startCoffee()
		setInterval poller, 1000
	else
		console.log """
			The file #{mainFile} does not exist.
			
			Please specify a main coffee file to use as the script's starting point, otherwise it will default to main.coffee.
			
			Usage: revup main.coffee
			"""