import random

class Tile (object):
    def __init__(self,left=0,right=0,name=''):
        self.left = left
        self.right = right
    def __str__(self):
        result = str(self.left)+str(self.right)
        return result
    def __repr__(self):
        return self.__str__()

class D6(object):
    def __init__(self):
        self.pack=[]
        for i in range(7):
            for j in range(i,7):
                self.pack.append(Tile(i,j))
    def __str__(self):      
         return ','.join([str(tile) for tile in self.pack])
    def __repr__(self):
        return self.__str__()
    def shuffle(self):
        random.shuffle(self.pack)
    def selectTile(self):
        # returns a list with the sample. Only one, take that one
        tile = random.sample(self.pack,1)[0]
        # without replacement
        self.pack.remove(tile)
        return tile

class LOPSequenceError(Exception):
    pass

class LOP(object):
    # use if you want to go 2D on the print of the LOP
    lengthLimit = 8
    def __init__(self):
        self.lop=[]
    def __str__(self):
        return 'LOP-> ' + ':'.join([str(t) for t in self.lop])
    def __repr__(self):
        self.__str__()
    def addTile(self,t):
        if not self.lop:
            self.lop.append(t)
        elif t.left == self.lop[0].left:
            t.left,t.right = t.right,t.left
            self.lop.insert(0,t)
        elif t.left == self.lop[-1].right:
            self.lop.append(t)
        elif t.right == self.lop[0].left:
            self.lop.insert(0,t)
        elif t.right == self.lop[-1].right:
            t.left,t.right = t.right,t.left
            self.lop.append(t)
        else:
            print 'Tile was',t
            raise LOPSequenceError
            
class Player(object):
    def __init__(self,deck):
        self.hand=[deck.selectTile() for i in range(3)]
    def __str__(self):
        return 'Hand-> ' + ':'.join([str(t) for t in self.hand])
    def play(self,indx):
        tile = self.hand[indx]
        self.hand.remove(tile)
        return tile
    def addTile(self,tile):
        self.hand.append(tile)
    def canPlay(self,indx):
        if 0 <= indx < len(self.hand):
            return True
        else:
            return False
    def isWinner(self):
        if len(self.hand) == 0:
            return True
        else:
            return False
    
def main ():
    deck = D6()
    lop = LOP()
    deck.shuffle()
    players=[Player(deck), Player(deck), Player(deck), Player(deck)]
    while True:
        played = False
        winner = -1
        for playerNum in range(4):
            p = players[playerNum]
            print 'Player',playerNum,':',str(p)
            print lop
            finished = False
            while not finished:
                indx = int(raw_input("Index of tile to play (0 is first, -1 for pass):"))
                if indx == -1:
                    finished = True
                    print "player passes"
                elif p.canPlay(indx):
                    try:
                        tile = p.play(indx)
                        lop.addTile(tile)
                        finished = True
                        played = True
                    except LOPSequenceError:
                        print "Can't play that tile, try again"
                        p.addTile(tile)
                else:
                    print 'Bad tile index, try again'
            if p.isWinner():
                winner = playerNum
                break
        if winner != -1:
            print 'Player',winner,': Winner, winner chicken dinner'
            break
        elif played == False:
            print 'Game is a draw'
            break

                        
            
    
