#!/usr/bin/env python
# Server for the Chinese Chess game
# Copyright (C) 2004 Josef Spillner <josef@ggzgamingzone.org>
# Published under GNU GPL conditions

from Numeric import *
import sys
import time
import random
import os, pwd
import re

import ggzdmod

try:
	import ggzsettings
	DATAPATH = ggzsettings.DATAPATH + "/xadrez-chines/"
	sys.path = [ggzsettings.MODULEPATH + "/xadrez-chines/"] + sys.path
	sys.path = [ggzsettings.MODULEPATH + "/common/"] + sys.path
except:
	DATAPATH = "./"
	sys.path = ["../lib/"] + sys.path

from xadrezlib import *

def hook_state (state):
	print "* state:", str(state)

def hook_join (num, type, name, fd):
	print "* join:", num, type, name, fd
	#print "(Name: " + ggzdmod.getPlayerName(seat) + ")"
	print "fd =", fd
	net.init(fd)
	net.sendstring("your turn")

def hook_leave (num, type, name, fd):
	print "* leave:", num, type, name, fd
	#print "(Name: " + ggzdmod.getPlayerName(seat) + ")"

def hook_data (num, type, name, fd):
	print "* data:", num, type, name, fd
	#print "(Name: " + ggzdmod.getPlayerName(seat) + ")"
	print "fd =", fd
	net.init(fd)

	line = net.getstring()

	move = re.compile("move from (\d+),(\d+) to (\d+),(\d+)")
	m = move.match(line)
	if m:
		x1 = int(m.group(1))
		y1 = int(m.group(2))
		x2 = int(m.group(3))
		y2 = int(m.group(4))

		print "DEBUG", "move", x1, y1, x2, y2

		ret = xadrez.proto.move_invalid
		if x1 >= 0 and x1 < 9 and y1 >= 0 and y1 < 11:
			if x2 >= 0 and x2 < 9 and y2 >= 0 and y2 < 11:
				(figure, color, options) = xadrez.components(xadrez.field[x1][y1])
				print "DEBUG", "color", color, xadrez.aicolor()
				if color != xadrez.aicolor():
					ret = xadrez.validate(x1, y1, x2, y2)
		if ret == xadrez.proto.move_ok:
			net.sendstring("move was ok")
			frompos = str(x1) + "," + str(y1)
			topos = str(x2) + "," + str(y2)
			net.sendstring("you moved from " + frompos + " to " + topos)
			ret = xadrez.ai() # XXX server-side ai error?
			(x1, y1, x2, y2) = xadrez.aimove()
			frompos = str(x1) + "," + str(y1)
			topos = str(x2) + "," + str(y2)
			net.sendstring("opponent moved from " + frompos + " to " + topos)
			if xadrez.winner() != "":
				if xadrez.winner() == xadrez.aicolor():
					winner = "you"
				else:
					winner = "opponent"
				net.sendstring(winner + " won")
			else:
				net.sendstring("your turn")
		else:
			net.sendstring("move was invalid")

def hook_error (arg):
	print "* error:", arg
	sys.exit(-1)

def initggz():
	ggzdmod.setHandler(ggzdmod.EVENT_STATE, hook_state)
	ggzdmod.setHandler(ggzdmod.EVENT_JOIN, hook_join)
	ggzdmod.setHandler(ggzdmod.EVENT_LEAVE, hook_leave)
	ggzdmod.setHandler(ggzdmod.EVENT_DATA, hook_data)
	ggzdmod.setHandler(ggzdmod.EVENT_ERROR, hook_error)

def main():
	global net
	global xadrez
#	global madeturn
#	global surface
#	global winner

	print "### launched"

	""" Setup """

	xadrez = Xadrez()

	print "### go init ggz"

	initggz()
	net = Network()

	print "### now go loop"

	ggzdmod.connect()
	ggzdmod.mainLoop()

	""" Main loop """

#	madeturn = 0
#	againturn = 0
#	aierror = 0
#	humanerror = 0
#	gameover = 0
#	winner = 0
#	message = ""
#
#	lastpos = (-1, -1)

	while 1:
		pass

if __name__ == "__main__":
	main()

