import secrets
import string
from pathlib import Path

from eff_words import get_word_list

LETTRES = string.ascii_letters
CHIFFRES = string.digits
SPECIAL = string.punctuation

ALPHABET = LETTRES + CHIFFRES + SPECIAL

DICE_NB = 5

def get_words_from_file():
    file_path = Path("bonus_wordlist_en.txt")
    with file_path.open('r') as file:
        words = {}
        for line in file:
            words[line.split(" ")[0].strip()] = line.split(" ")[1].strip()
    return words

def generer_mdp(password_length = 14):
    password = ""
    for i in range(password_length):
        password += secrets.choice(ALPHABET)
    return password

def generer_mdp_with_constraints(password_length = 14, special = 1, digits = 1):
    password = ""
    contrainte_special_respectee = False
    contrainte_digits_respectee = False
    while not (contrainte_special_respectee and contrainte_digits_respectee):
        password = generer_mdp(password_length=password_length)
        contrainte_special_respectee = sum(char in SPECIAL for char in password) >= special
        contrainte_digits_respectee = sum(char in CHIFFRES for char in password) >= digits
    return password

def generer_mdp_personnalise():
    password_length = int(input("Longueur du mot de passe: "))
    return generer_mdp(password_length=password_length)

def generer_passphrase_v1(nb_words = 6):
    words = get_word_list()

    chosen_words = []
    for _ in range(nb_words):
        next_word = secrets.choice(words)
        chosen_words.append(next_word)

    return '-'.join(chosen_words)

def generer_passphrase_v2(nb_words = 6, add_digit=False, capitalize=True, sep='-'):
    words = get_words_from_file()

    chosen_words = []
    for _ in range(nb_words):
        dice = "".join(str(secrets.randbelow(6) + 1) for _ in range(DICE_NB))
        next_word = words[dice]
        if capitalize:
            next_word = next_word.capitalize()
        if add_digit:
            next_word+=secrets.choice(CHIFFRES+SPECIAL)
        chosen_words.append(next_word)

    return sep.join(chosen_words)

def generer_passphrase_personnalise():
    nb_words = int(input("Nombre de mots : "))
    add_digit = input("Ajouter des chiffres ou caractères spéciaux ? (y/n) : ") in ["y","Y"]
    capitalize = input("Ajouter une majuscule au début des mots ? (y/n) : ") in ["y","Y"]
    sep = input("Séparateur de mots : ")
    return generer_passphrase_v2(
        nb_words=nb_words,
        add_digit=add_digit,
        capitalize=capitalize,
        sep=sep
    )