"""Funcions que creen, consulten i modifiquen una baralla de cartes,
completa o no.

Cada carta és un tuple (número, pal), on el número va de l'1 al 12 i
el pal és oros, copes, espases o bastos.

"""

import random

NUM_NOM = {
    1: 'as',
    10: 'sota',
    11: 'cavall',
    12: 'rei',
}

def nova_baralla():
    """
    Retorna una baralla amb les 48 cartes ordenades:
    [ (1, 'oros'), (2, 'oros'), ... (12, 'bastos')]

    >>> b = nova_baralla()
    >>> len(b)
    48
    >>> print(b[0])
    (1, 'oros')
    >>> print(b[47])
    (12, 'bastos')
    """
    cartes = []
    for pal in 'oros', 'copes', 'espases', 'bastos':
        for num in range(1,13):
            cartes.append((num,pal))
    return cartes

def nom_carta(c):
    """
    >>> nom_carta( (1, 'copes') )
    'as de copes'
    >>> nom_carta( (5, 'espases') )
    "5 d'espases"
    >>> nom_carta( (10, 'oros') )
    "sota d'oros"
    >>> nom_carta( (12, 'bastos') )
    'rei de bastos'
    """
    num, pal = c
    nom = NUM_NOM.get(num, num)
    if pal[0] in 'aeiou':
        sep = " d'"
    else:
        sep = " de "
    s = '{}{}{}'.format(nom, sep, pal)
    return s

def escriu(b):
    """
    >>> b = [
    ... (3, 'bastos'),
    ... (12, 'oros'),
    ... (1, 'copes'),
    ... ]
    >>> escriu(b)
    3 de bastos
    rei d'oros
    as de copes

    """
    for carta in b:
        nom = nom_carta(carta)
        print(nom)

def treu_carta(b):
    """
    Retorna la primera carta de la baralla b
    i elimina la carta de la baralla

    >>> x = nova_baralla()
    >>> y = x[:]
    >>> c = treu_carta(x)
    >>> print(c)
    (1, 'oros')
    >>> x == y[1:]
    True
    """
    return b.pop(0)

def barreja(cartes):
    """
    Desordena de forma aleatòria les cartes de la baralla.

    >>> b = nova_baralla()
    >>> c = b[:]
    >>> barreja(b)
    >>> c == b
    False
    >>> sorted(c) == sorted(b)
    True

    """
    random.shuffle(cartes)
        
def quatre_bastos_seguits(b):
    """
    Retorna True si i només si a la baralla b
    hi ha quatre cartes de bastos juntes.

    >>> b = nova_baralla()
    >>> quatre_bastos_seguits(b)
    True
    >>> quatre_bastos_seguits(b[:39])
    False
    """
    bastos4 = ('bastos',)*4
    trobat = False
    for i in range(len(b)-4):
        trobat = bastos4 == (b[i][1], b[i+1][1], b[i+2][1], b[i+3][1])
        if trobat:
            break
    return trobat

def talla(b, lloc):
    """
    Talla en dues piles una baralla de cartes i les empila en l'ordre contrari
    
    >>> b = [
    ... (3, 'bastos'),
    ... (12, 'oros'),
    ... (1, 'copes'),
    ... ]
    >>> b1 = talla(b, 1)
    >>> b1
    [(12, 'oros'), (1, 'copes'), (3, 'bastos')]
    >>> b2 = talla(b, 2)
    >>> b2
    [(1, 'copes'), (3, 'bastos'), (12, 'oros')]
    >>> b3 = talla(b, 0)
    >>> b3 == b
    True
    
    """
    b1 = b[:lloc]
    b2 = b[lloc:]
    return b2+b1
