class Server(object):
	"""Server object.
	"""
	
	def __init__(self):
		
		# Maak socket aan en luister.
		self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
		self.sock.setblocking(0)
		self.sock.bind((HOSTNAME, PORT))
		
		print "Server listening at '%s:%i'" % (HOSTNAME, PORT)
		
		# Game state.
		self.gameState = GameState()
		
		# Lijst met alle connections.
		self.connections = {}
		
	def handleRequest(self, data, address):
		"""Handel een request af.
		"""
		id = int(data.split(" ")[0])
		command = data.split(" ")[1]
		args = " ".join(data.split(" ")[2:])
		
		# Connecten.
		if command == "connect":
			
			# Informatie ophalen uit packet.
			name = args
			id = getNextId()

			# Check of de speler met die naam al bestaat.			
			if self.gameState.containsPlayerWithName(name) == False:
				# Hij bestaat nog niet - toevoegen.
				
				# Connectie opslaan.
				self.connections[id] = address
				print "Player connected: %s (ID:%i)" % (name, id)
	
				# Player toevoegen aan game.
				self.gameState.addPlayer(name)
				
				# Welcome command terugsturen naar client.
				welcomeString = "0 welcome %s %i" % (name, id)
				self.sock.sendto(welcomeString, address)
	
			else:
				# Hij bestaat al - niet toestaan.
				
				# Stuur denied command terug naar de client.
				print "Player denied: %s (name in use)" % name
				deniedString = "0 denied %s player name in use" % name
				self.sock.sendto(deniedString, address)

		# Disconnecten.
		elif command == "disconnect":
			name = args
			print "Player disconnected: %s (ID:%i)" % (name, id)
			self.gameState.removePlayer(name)
			del(self.connections[id])

		# Moven.
		elif command == "move":
			name = args.split(" ")[0]
			velX = int(args.split(" ")[1])
			velY = int(args.split(" ")[2])
			#print "Moving player %s to %i %i" % (name, velX, velY)
			self.gameState.movePlayer(name, velX, velY)

		# Onbekend request.
		else:
			print "Unknown network command: %s" % data
		
	def run(self):
		"""Run de main loop van de server.
		"""

		# Eeuwig blijven draaien.
		while True:

			# Lees de socket uit tot er niks meer beschikbaar is deze tick.
			empty = False
			while not empty:
				
				# Haal gegevens op.
				try:
					data, address = self.sock.recvfrom( 1024 )
					
				# Except voor als er niks meer is.
				except socket.error:
					empty = True
				
				# Else voor als er wel wat is.
				else:
					#print "Received message:", data
					self.handleRequest(data, address)
			
			# Verstuur naar iedereen de nieuwe posities.
			for id, connection in self.connections.items():
				positionString = "%i %s" % (id, self.gameState.toString())
				self.sock.sendto(positionString, connection)
			
			# Wachten.
			pygame.time.wait(50)