class SnakeAndLadderService:
    def __init__(self, boardSize):
        self.board = Board(boardSize)
        self.noOfPlayers = 0
        self.players = []

    def setPlayers(self, players):
        self.noOfPlayers = len(players)
        playerPieces = {}
        for player in players:
            self.players.append(player)
            playerPieces[player.getId()] = 0

        self.board.setPlayerPieces(playerPieces)

    def setSnakes(self, snakes):
        self.board.setSnakes(snakes)

    def setLadders(self, ladders):
        self.board.setLadders(ladders)

    def rollDice(self):
        return DiceService.roll(self)

    def isGameCompleted(self):
        currentPLayersSize = len(self.players)
        return currentPLayersSize < self.noOfPlayers

    def checkThroughSnakesAndLadders(self, newPosition):
        previousPosition = None

        while (previousPosition != newPosition):
            previousPosition = newPosition

            for snake in self.board.getSnakes():
                if snake.getStart() == newPosition:
                    newPosition = snake.getEnd()

            for ladder in self.board.getLadders():
                if ladder.getStart() == newPosition:
                    newPosition = ladder.getEnd()

        return newPosition

    def movePlayer(self, player, positions):
        oldPosition = self.board.getPlayerPieces()[player.getId()]
        newPosition = oldPosition + positions

        boardSize = self.board.getBoardSize()

        if newPosition > boardSize:
            newPosition = oldPosition
        else:
            newPosition = self.checkThroughSnakesAndLadders(newPosition)

        self.board.getPlayerPieces()[player.getId()] = newPosition

    def hasPlayerWon(self, player):
        playerPosition = self.board.getPlayerPieces()[player.getId()]
        print(playerPosition)
        return playerPosition == self.board.getBoardSize()

    def startGame(self):
        summ = {}
        while not (self.isGameCompleted()):
            currentPlayer = self.players.pop(0)
            print(currentPlayer.getName() + " chance")
            if currentPlayer.getName() not in summ:
                summ[currentPlayer.getName()] = 0
            diceValue = self.rollDice()
            summ[currentPlayer.getName()] += diceValue
            print(diceValue)
            print(summ)
            self.movePlayer(currentPlayer, diceValue)
            if self.hasPlayerWon(currentPlayer):
                print(currentPlayer.getName() + " wins the game")
                del self.board.getPlayerPieces()[currentPlayer.getId()]
                break
            else:
                self.players.append(currentPlayer)