from toontown.coghq import LaserGameBase
from direct.distributed import ClockDelta
from direct.task import Task
import random

class LaserGameDrag(LaserGameBase.LaserGameBase):

    def __init__(self, funcSuccess, funcFail, funcSendGrid, funcSetGrid):
        LaserGameBase.LaserGameBase.__init__(self, funcSuccess, funcFail, funcSendGrid, funcSetGrid)
        self.setGridSize(6, 6)
        self.blankGrid()
        self.symbolList = [
            16,
            13,
            17]

    def win(self):
        if not self.finshed:
            self.blankGrid()
            self.funcSendGrid()

        LaserGameBase.LaserGameBase.win(self)

    def lose(self):
        self.blankGrid()
        self.funcSendGrid()
        LaserGameBase.LaserGameBase.lose(self)

    def startGrid(self):
        LaserGameBase.LaserGameBase.startGrid(self)
        for column in range(0, self.gridNumX):
            for row in range(0, self.gridNumY):
                tile = 0
                self.gridData[column][row] = tile

        for column in range(0, self.gridNumX):
            self.gridData[column][self.gridNumY - 1] = 12

        for symbol in self.symbolList:
            finished = 0
            while finished == 0:
                numTris = 4
                tris = 0
                sanity = 1000
                if numTris >= 1:
                    while tris < numTris and sanity:
                        sanity -= 1
                        column = random.randint(0, self.gridNumX - 1)
                        row = random.randint(1, self.gridNumY - 1)
                        if self.gridData[column][row] == 0:
                            self.gridData[column][row] = symbol
                            tris += 1

                if self.checkFor3(symbol):
                    self.clearIndex(symbol)
                    finished = 0
                else:
                    finished = 1

    def hit(self, hitX, hitY, oldx = -1, oldy = -1):
        if self.finshed:
            return

        if oldx >= 0 and oldy >= 0:
            if self.gridData[hitX][hitY] == 0:
                if self.gridData[oldx][oldy] in self.symbolList:
                    self.gridData[hitX][hitY] = self.gridData[oldx][oldy]
                    self.gridData[oldx][oldy] = 0

        for index in self.symbolList:
            if self.checkFor3(index):
                self.clearIndex(index)

        if self.checkForWin():
            self.win()
        else:
            self.funcSendGrid()

    def checkFor3(self, index):
        numInARow = 0
        for posX in range(0, self.gridNumX):
            for posY in range(0, self.gridNumY):
                if self.gridData[posX][posY] == index:
                    numInARow += 1
                    if numInARow >= 3:
                        return 1
                else:
                    numInARow = 0

            numInARow = 0

        numInARow = 0
        for posY in range(0, self.gridNumY):
            for posX in range(0, self.gridNumX):
                if self.gridData[posX][posY] == index:
                    numInARow += 1
                    if numInARow >= 3:
                        return 1
                else:
                    numInARow = 0

            numInARow = 0

        return 0

    def clearIndex(self, index):
        for posX in range(0, self.gridNumX):
            for posY in range(0, self.gridNumY):
                if self.gridData[posX][posY] == index:
                    self.gridData[posX][posY] = 0

    def checkForClear(self, index):
        for posX in range(0, self.gridNumX):
            for posY in range(0, self.gridNumY):
                if self.gridData[posX][posY] == index:
                    return 0

        return 1

    def checkForWin(self):
        for symbol in self.symbolList:
            if not self.checkForClear(symbol):
                return 0

        return 1