def __init__(self, *args, **kwargs):
     self.id = 0
     Server.__init__(self, *args, **kwargs)
     self.players = WeakKeyDictionary()
     self.service = BusinessService()
     print 'Server launched'
class LunarLanderServer(Server):
    channelClass = TCPConnector
    ActivePlayers = 0

    def __init__(self, *args, **kwargs):
        self.id = 0
        Server.__init__(self, *args, **kwargs)
        self.players = WeakKeyDictionary()
        self.service = BusinessService()
        print 'Server launched'
    
    def NextId(self):
        self.id += 1
        return self.id
    
    def Connected(self, channel, addr):
        self.CheckGameStart(channel)
    
    def CheckGameStart(self, player):
        print "New Player" + str(player.addr)
        self.players[player] = True
        # TODO: PLayer creation and data transmission
        players = self.GetPLayers()
        print "Current players:", players
        print "ActivePlayers:" , self.ActivePlayers
        print "Sending acknowledge to the new player"
        player.Send({"action": "acknowledge", "players": players}) #acknowledges to the player it is connected to the server successfully
        if self.ActivePlayers == 2: 
            print "Sending Game Start for all player"
            self.SendStartGame()
            self.SendLeaderBoard()
        elif self.ActivePlayers > 2:
            self.SendLeaderBoard()
        else:
            print "Waiting for more than one player to start."

    def GetPLayers(self):
        players = []
        for p in self.players:
            playerObj = {"id" :p.id,
                        "spaceship": p.spaceship.getSelfStateObj()
                        } 
            players.append(playerObj)
        return players
    
    def DelPlayer(self, player):
        print "Deleting Player" + str(player.addr)
        del self.players[player]
        #self.SendPlayers()
    
    def SendLeaderBoard(self):
        print "Sending leaderboard to all"
        new_data = {"action":"response"}
        new_data.update({PRINT_LEADERBOARD: self.getLeaderboard()})
        new_data.update({"response_action":PRINT_LEADERBOARD})
        #send this new information to all clients, they will just print this on their screens
        self.SendToAll(new_data)

    def SendStartGame(self):
        # TODO: Transmit data to players/clients
        players = self.GetPLayers()
        self.SendToAll({"action": "StartGame", "players": players})
    
    def SendToAll(self, data):
        [p.Send(data) for p in self.players]
    
    def Launch(self):
        while True:
            self.Pump()
            sleep(0.0001)
    def getLeaderboard(self):
        leaderboard = Leaderboard()
        #PlayerInfo = namedtuple('PlayerInfo', 'name score')
        for p in self.players:
            row = LeaderboardEntry(p.id, p.spaceship.score)
            leaderboard.addEntry(row)
        leaderboard.entries.sort(key=self.getPlayerScore, reverse=True)
        #print (self.leaderboardToString(leaderboard))
        data = leaderboard.getSelfStateObj()
        print "data is ", jsonpickle.encode(leaderboard)
        return jsonpickle.encode(leaderboard)
    
    def canBuyFuel(self):
        return self.service.canBuyFuel()
    
    def buyFuel(self):
        return self.service.buyFuel()
    
    def getGameScore(self):
        return self.service.getGameScore()
    
    def getGridStatus(self):
        return self.service.getGridStatus()
    
    def canAssignPlot(self, data, spaceship):
        return self.service.canAssignPlot(data[PLOT_TYPE_STRING], spaceship)
    
    def getPlot(self, data):
        self.service.assignPlot(data[PLOT_TYPE_STRING])
        return self.getGridStatus()
    
    def freePlot(self,type):
        self.service.freePlot(type)
        return self.getGridStatus()
    
    def conquerPlot(self, data):
        return self.service.conquerPlot(data)
    
    def loadMineral(self, data, spaceship):
        return self.service.loadMineral(data, spaceship)
    
    def subtractPlayer(self):
        self.ActivePlayers = self.ActivePlayers - 1

    def addPlayer(self):
        print "adding player"
        self.ActivePlayers = self.ActivePlayers + 1

    def updateGameScore(self,spaceship):
        return self.service.updateGameScore(spaceship)

    def checkGoalAccomplished(self):
        return self.service.checkGoalAccomplished()
    
    def canRefuelSpaceship(self, data):
        if self.service.getBaseStationFuelLevel()>0:
            return True
        else:
            return False
    def getPlayerScore(self, pInfo):
        return pInfo.score
    
    def playerInfoToString(self,pInfo):
        return pInfo.name + "  :  " + str(pInfo.score)
    
    def leaderboardToString(self, leaderboard):
        returnString = "player  :   score \n"
        returnString += "*"*10
        for pInfo in leaderboard:
            returnString += "\n" + self.playerInfoToString(pInfo)
        returnString += "\n" + "*"*10
        return returnString

    def withdrawFuel(self,data):
        spaceshipFuelLevel = 0#data.get(SPACESHIP_FUEL_KEY,0) # default is 0
        print "inside withdrawfuel, current spaceship fuel level ", spaceshipFuelLevel
        return self.service.withdrawFuel(SPACESHIP_FUEL_CAPACITY-spaceshipFuelLevel)
        
    def getBaseStationFuelLevel(self):
        return self.service.getBaseStationFuelLevel()