import os
from zxcvbn import zxcvbn
from zxcvbn.matching import add_frequency_lists


def tr(text):
    # TODO translation
    return text


def add_dictionnaries():
    dicts = {}
    directory = os.path.dirname(os.path.realpath(__file__))+'/../data'
    for fn in os.listdir(directory):
        fn = directory+"/"+fn
        if os.path.isfile(fn):
            print(fn)
            name = os.path.basename(os.path.splitext(fn)[0])
            print(name)
            with open(fn) as f:
                dicts[name] = f.read().splitlines()
    add_frequency_lists(dicts)


def test_pass(password, inputs):

    # Read input
    add_dictionnaries()
    results = zxcvbn(password, inputs)
    lines = []

    lines.append("Résultats du test:\n")
    lines.append("Nombre de tentatives : {}".format(results["guesses"]))

    times = results["crack_times_display"]
    lines.append("Temps requis pour craquer votre mot de passe")
    lines.append("\t Dump bases de donnée mal protégée : \t**{}**".format(
        tr(times["offline_fast_hashing_1e10_per_second"])))
    lines.append("\t Dump bases de donnée, bien protégée : \t**{}**".format(
        tr(times["offline_slow_hashing_1e4_per_second"])))
    lines.append("\t En ligne, sans protection anti bruteforce : \t**{}**".format(
        tr(times["online_no_throttling_10_per_second"])))
    lines.append("\t En ligne, avec protection anti bruteforce : \t**{}**".format(
        tr(times["online_throttling_100_per_hour"])))

    lines.append("\n")
    lines.append("Methode de hack utilisées")
    if results["sequence"] == []:
        lines.append("\tVotre mot de passe n'a été trouvé dans aucun dictionnaire")
    else:
        for seq in results["sequence"]:
            if seq["pattern"] == "bruteforce":
                lines.append("\tMot de passe trouvé par force brute")
            elif seq["pattern"] == "repeat":
                for match in seq["base_matches"]:
                    print("\tMot de passe trouvé par repetition depuis le dictionnaire {}".
                          format(tr(match["dictionary_name"])))
            elif seq["pattern"] == "date":
                lines.append("\tMot de passe trouvé par dates")
            elif seq["pattern"] == "sequence":
                lines.append("\tMot proche trouvé dans la séquence : '{}'".format(tr(seq["sequence_name"])))
            else:
                lines.append("\tMot proche trouvé dans le dictionnaire : '{}'".format(tr(seq["dictionary_name"])))

    lines.append("\n")

    valeur = ["Tres faible", "Faible", "Acceptable", "Correct", "Bon"]
    lines.append("Score Global {}/4 : {}".format(results["score"], valeur[results["score"]]))

    for key, values in results["feedback"].items():
        lines.append("{} :".format(tr(key)))
        if not isinstance(values, list):
            values = [values]
        for val in values:
            lines.append("\t{}".format(tr(val)))
        return lines