#!/usr/bin/env python
# coding: utf
'''
Сервер крестиков-ноликов
'''
import asyncore
import socket
import xoproto
import xoai

class XOHandler(asyncore.dispatcher_with_send):
    def __init__(self, *args, **argn):
        self.proto = xoproto.Proto()
        self.solver = None
        asyncore.dispatcher_with_send.__init__(self, *args, **argn)

    def handle_read(self):
        data = self.recv(8192)
        if data:
            if data.upper().startswith("GEN"):
                ret = self.proto.command("INFO")
                if ret.startswith("GAME"):
                    s = ret.split()
                    self.solver = xoai.Solver(int(s[1]),int(s[2]))
                    self.solver.generate()
                    ret = "OK"
            elif data.upper().startswith("AI"):
                if self.solver:
                    board = self.proto.command("INFO").split()[4]
                    cmd = self.solver.next(board)
                    ret = self.proto.command(cmd)
                else:
                    ret = "ERROR NEEDGEN"
            else:
                ret = self.proto.command(data)
            self.send(ret+"\n")

class XOServer(asyncore.dispatcher):
    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(0)

    def handle_accept(self):
        pair = self.accept()
        if pair is None:
            pass
        else:
            sock, addr = pair
            print 'Incoming connection from %s' % repr(addr)
            handler = XOHandler(sock)

server = XOServer('',2014)
asyncore.loop()
