# coding: utf-8

from collections import Counter 
from argparse import ArgumentParser
import matplotlib.pyplot as plt
import re


def checkArguments():
    args = ArgumentParser(description='Cryptanalyst')
    args.add_argument('-f', '--filename', help='Text to analyze')
    args.add_argument('-b', '--bigram', help='Get bigram', action="store_true")
    args.add_argument('-t', '--trigram', help='Get trigram', action="store_true")
    return args.parse_args()

def readFile(filename):
    """
        This read the file passed in argument and return the data of it
    """
    text = str()
    with open(filename, 'r') as f:
        data = f.readlines()

        for entry in data:
            text += entry

    return text

def getLetters(text, pos):
    return Counter([text[idx: idx + pos] for idx in range(len(text) - 1)])

if __name__ == "__main__":
    args = checkArguments()
    text = readFile(args.filename)

    if args.bigram:
        data = getLetters(text, 2) 
    if args.trigram:
        data = getLetters(text, 3) 

    dataSorted = {k: v for k, v in sorted(data.items(), key=lambda item: item[1])}
    dataSorted = list(dataSorted.items())
    newDataSorted = []

    if args.bigram:
        reg = "[A-Za-z]{2}"
    if args.trigram:
        reg = "[A-Za-z]{3}"

    for entry in dataSorted:
        if re.match(reg, entry[0]):
            newDataSorted.append((
                entry[0], entry[1]
            ))

    lenDataSorted = len(newDataSorted)

    x = []
    y = []
    for entry in newDataSorted[lenDataSorted - 10:]:
        x.append(entry[0])
        y.append(entry[1])
    
    largeur = 0.5
    plt.bar(x, y, largeur)
    plt.show()