from threading import Lock
import time

class Recull:
    """
    Diccionari de troballes. 

    >>> r = Recull()
    >>> r.compta(2, 'pardal', 100)
    >>> r[('pardal', 100)]
    2
    >>> print(r, end='')
    (pardal,100): 2
    """
    def __init__(self):
        """Inicialitza la classe amb el diccionari buit,
        """
        self.pany = Lock()
        self.d = {}

    def compta(self, n_nius, ocell, zona):
        """:param int n_nius: nombre de nius trobats.
           :param str ocell: tipus d'ocell
           :param str zona: zona on s'ha trobat.
            Actualiza diccionari de nombre de nius per ocell i zona.
        """
        with self.pany:
            clau = (ocell, zona)
            if clau in self.d:
                ant =  self.d[clau]
                time.sleep(0.000001)
                self.d[clau] = ant + n_nius
            else:
                self.d[clau] = n_nius

    def __getitem__(self, ocellzona):
        """:param tuple(str, str) ocellzona: tipus d'ocell, zona on s'ha trobat


           :returns int: nombre de nius per ocell i zona.
        """
        with self.pany:
            r = self.d[ocellzona]
        return r
    
    def __str__(self):
        """:returns str: string de claus i valors de totos les entrades del
        diccionari d

        """
        with self.pany:
            s = ''
            for clau in sorted(self.d):
                s += '({},{}): {}\n'.format(clau[0], clau[1], self.d[clau])
        return s

    def guarda(self, nomf):
        """
        :param str nomf: nom del fitxer

        Guarda en un fitxer de text els valors de l'objecte Recull.
        """
        with open(nomf, 'w') as f:
            f.write(str(self))

