#!/usr/bin/env python3
""" Module proposant la classe Compteur """
from typing import TypeVar

T = TypeVar('T')

class Compteur:
    """ Compteur permet d'avoir des statistiques (nombre d'occurences) sur
des éléments hashables

    arguments:
    val_init -- dictionnaire(element, nb_occurences) qui permet d'initialiser
le compteur à sa création
    """
    def __init__(self, val_init: dict[T, int] = None):
        pass

    def incrementer(self, element: T) -> None:
        pass

    def fixer(self, element: T, nb_occurences: int) -> None:
        pass

    def nb_occurrences(self, element: T) -> int:
        return -1

    def elements(self) -> set[T]:
        return set()

    def elements_moins_frequents(self) -> set[T]:
        """retourne tous les elements les moins frequents

        resultat: un ensemble contenant les éléments les moins fréquents
        """
        return set()

    def elements_plus_frequents(self) -> set[T]:
        """retourne tous les elements les plus frequents

        resultat: un ensemble contenant les éléments les plus fréquents
        """
        return set()

    def elements_par_nb_occurrences(self) -> dict[int, set[T]]:
        """retourne pour chaque nombre d'occurences présents dans compteur
les éléments qui ont ces nombres d'occurences

        resultat: un dictionnaire dont les clés sont les nombres d'occurences
et les valeurs des ensembles d'éléments qui ont ce nombre d'occurences"""
        return {}

def main():
    """Tests unitaires du module"""
    def ok_ko_en_str(booleen):
        return "OK" if booleen else "KO"

    def ok_ko(fct, resultat_attendu, *param):
        """mini fonction de TU"""
        res = fct.__name__ + ' : '
        res = res + ok_ko_en_str(fct(*param) == resultat_attendu)
        print(res)

    cpt1 = Compteur()
    cpt1.incrementer('a')
    cpt1.incrementer('a')
    cpt1.incrementer('b')
    cpt1.incrementer('c')
    cpt1.incrementer('c')
    cpt1.incrementer('c')
    cpt1.incrementer('d')

    ok_ko(Compteur.nb_occurrences, 2, cpt1, 'a')
    ok_ko(Compteur.elements, {'a', 'b', 'c', 'd'}, cpt1)
    ok_ko(Compteur.elements_moins_frequents, {'b', 'd'}, cpt1)
    ok_ko(Compteur.elements_plus_frequents, {'c'}, cpt1)
    ok_ko(Compteur.elements_par_nb_occurrences, {1: {'b', 'd'}, 2: {'a'}, 3: {'c'}}, cpt1)

if __name__ == "__main__":
    main()
