def fac(n):
    """Returns the faculty of n

    fac(n)
    n: A positive integer
    """
    if n==0 or n==1:
        return 1
    if n<0:
        print "Error: Can only take faculty of positive integers!"
        return -1
    f=fac(n-1)
    if f<=0:
        return -1
    else:
        return n*f
    

def printSelectedGames():
    """Prints the selected games

    printSelectedGames()
    """
    from de.tum.in.fipm.base.util import Settings

    fipm=Settings.getStd().get("main_desktop")
    games=fipm.getSelectedGames()
    for game in games:
        print game.toString()

def printQueries():
    """Prints the names of the Queries in the database

    printQueries()
    """
    from de.tum.in.fipm.base.data.query import QueryFactory

    queryNames=QueryFactory.getAllQueryNames()
    for query in queryNames:
        print query

def getDirections(t, game):
	"""Get the direction for a given time in a game
	
	getDirection(t, game)
	t	: the time to examine
	game	: the game
	
	Returns a QueryResult with Situation and Direction
	"""
	from de.tum.in.fipm.base.data import Signature
	from fipm.data.queryfeatures import SimpleIOFeature
	from fipm.data.queryfeatures.situation import Situation, Direction
	from utils import createQueryResult,dic2hashmap
	from jarray import array
	
	input=createQueryResult(["TIS_time"], ["INT"], [[t]], game)
	sit=Situation()
	sit.setData(dic2hashmap({"Time": array([0,0],"i")}), [[-1,0]], [input])
	sit.calculate()
	sitData=sit.getData()
	
	dir=Direction()
	dir.setData(dic2hashmap({"Player": array([0,1],"i")}), [[-1,0]], [sitData])
	dir.calculate()
	dirData=dir.getData()
	
	sig=sit.getOutputSemantics()
	sig.add(Signature("Direction",1,"NUM","owl:Thing",["STA"]))
	siof=SimpleIOFeature(sig)
	siof.setData(dic2hashmap({"Time": array([0,0],"i"), \
		"PlayerAtBall": array([0,1],"i"), "Player": array([0,2],"i"), \
		"X": array([0,3],"i"), "Y": array([0,4],"i"), \
		"Groups": array([0,5],"i"), "Direction": array([1,0],"i")}),\
		[[-1,0],[1]],[sitData,dirData])
	siof.calculate()
	result=siof.getData()
	
	return result