#!/usr/bin/python
import os
import sys
import time
import datetime
import ccdash

INTERVAL = 300
DELAY = 0
ONCE = False
SUFFIX = ""
FORCE = False

def run_scenarios(scenarios, group):
	# Run each scenario
	rc = 0
	for scenario in scenarios:
		argv = []
		argv.append("ccdash.py")
		argv.append("scenario")
		argv.append(scenario)
		argv.append("--group")
		argv.append(group)
		thisrc = ccdash.main(argv)
		if rc==0 and thisrc:
			rc = thisrc
	return rc


def usage():
	print """Periodically monitor working directory for Continuous and Nightly builds

Usage:
  run_continuous.py [options] scenario1.xml [scenario2.xml ...]

options:
  These are options which will be processed by run_continuous.py:

  --delay MIN   Delay both Continuous and Nightly builds by MIN minutes. 
  		This is useful to coordinate the build with other build 
		machines. By default, Continuous build will be done right
		after changes are detected, and Nightly build will be done
		at 00:00 GMT. MIN is a float number.

  --once        Just run one loop to see if anything needs to be done and
                if so just do it once. Quit after that.

  --suffix SFX  Set group suffix to SFX. For example, if SFX is "-2.x", then
                tests will be submitted to "Nightly-2.x", "Continuous-2.x",
		and "Experimental-2.x"

  --force	Force running the test even when nothing has changed.
"""
	sys.exit(1)

if __name__ == "__main__":
	if len(sys.argv)<=1 or sys.argv[1]=="-h" or sys.argv[1]=="--h" or sys.argv[1]=="--help" or sys.argv[1]=="/h":
		usage()

	# Splice list
	scenarios = []
	i = 1
	while i < len(sys.argv):
		if sys.argv[i]=="--delay":
			i = i + 1
			if i >= len(sys.argv):
				print "Error: missing argument"
				sys.exit(1)
			DELAY = float(sys.argv[i]) * 60
			print "Delay is set to %f minute(s)" % (DELAY / 60)
		elif sys.argv[i]=="--suffix":
			i = i + 1
			if i >= len(sys.argv):
				print "Error: missing argument"
				sys.exit(1)
			SUFFIX = sys.argv[i]
			print "Suffix is set to %s" % (SUFFIX)
		elif sys.argv[i]=="--once":
			ONCE = True
		elif sys.argv[i]=="--force":
			FORCE = True
		else:
			# Check if scenario exists
			scenario = sys.argv[i]
			if not os.path.exists(scenario):
				print "Error: file " + scenario + " does not exist"
				sys.exit(1)
			scenarios.append(scenario)
			print "Scenario %s added" % (scenario)
		i = i + 1

	if len(scenarios) < 1:
		print "Error: scenario is required"
		sys.exit(1)

	# Current date
	utc = time.gmtime(None)
	day = utc.tm_mday

	# Loop foreva
	while True:
		argv = []

		# Anything changed recently?
		argv.append("ccdash.py")
		argv.append("status")
		argv.append("-w")
		argv.append("../..")
		rc = ccdash.main(argv)

		utc = time.gmtime(None)

		if utc.tm_mday != day or rc != 0 or FORCE:
			group = ""
			if utc.tm_mday != day:
				day = utc.tm_mday
				group = "Nightly" + SUFFIX
			elif rc != 0:
				group = "Continuous" + SUFFIX
			else:
				group = "Experimental" + SUFFIX
			if DELAY > 0:
				print "Will run %s after %f s.." % (group, DELAY)
				time.sleep(DELAY)
			rc = run_scenarios(scenarios, group)
			msg = str(datetime.datetime.now()) + \
				  ": done running " + group + \
				  "tests, will check again in " + str(INTERVAL) + "s.."
			if ONCE:
				sys.exit(0)
		else:
			# Nothing changed
			msg = str(datetime.datetime.now()) + \
				  ": No update, will check again in " + str(INTERVAL) + "s.."
			if ONCE:
				sys.exit(1)

		print msg
		time.sleep(INTERVAL)