#!/usr/bin/env python

"""CL rozhrani pro sadu kryptoanalytickych nastroju."""

import sys
import pickle
import argparse

from ocesavac import ocesat
import jakobsen
from jakobsen import reference
import koincidence
import posuny
from spolecne import ABECEDA
import vigenere

def analyza(zprava, opsny):
    analyza = []

    # Prepinani spacemodu
    mod_m = False
    mod_x = False
    if 'X' in opsny:
        mod_x = True
    if 'M' in opsny:
        mod_m = True
    if 'A' in opsny:
        mod_x = True
        mod_m = True
    if not mod_m and not mod_x:
        if ' ' in ocesat(zprava, True)[1:-1]:
            mod_m = True
            analyza.append("Automaticky zvolena analyza s mezerami.")
        else:
            mod_x = True
            analyza.append("Automaticky zvolena analyza bez mezer.")
        
    # Zakladni udaje
    analyza.append("\nZakladni udaje:")
    if mod_m:
        analyza.append("Delka zpravy (vcetne mezer a zvlastnich znaku: " +
            str(len(zprava)))
    analyza.append("Delka zpravy (bez mezer a zvlastnich znaku): " +
        str(len(ocesat(zprava, False))))

    # Prumerna delka slova
    if mod_m:
        analyza.append("\nPrumerna delka slova:")
        slova = ocesat(zprava, True).split()
        analyza.append('{0:.3}'.format(float(sum([len(word) for word in slova]))/len(slova)))

    # Frekvence znaku 
    analyza.append("\nFrekvencni analyza:")
    freq = dict()
    for char in ABECEDA:
        freq[char] = 0
    for char in zprava:
        if char in freq:
            freq[char] += 1
    celkem = sum(freq.values())
    for char in sorted(freq, key=freq.get, reverse=True):
        analyza.append('{0} {1:>3} {2:>6.2%}'.format(char, freq[char],
                       float(freq[char])/celkem))

    # Index koincidence
    if mod_m:
        analyza.append("\nIndex koincidence (s mezerami):")
        analyza.append('{0:.2%}'.format(
                       koincidence.index_koincidence(zprava, True)))
    if mod_x and len(zprava) >= 30:
        #TODO tady by se spravne mela porovnavat delka ocesane zpravy
        analyza.append("\nIndexy koincidence (bez mezer):")
        analyza.append(koincidence.tabulka_indexu(zprava))

    # Vigenere
    if 'V' in opsny:
        analyza.append("\nHeslo k Vigenerovi (" + opsny[-1] + "):")
        vig_heslo, vig_text = vigenere.vsechno(zprava, int(opsny[-1]))
        analyza.append(vig_heslo)
        analyza.append(vig_text)

    # Jakobsen
    if mod_m:
        analyza.append("\nJakobsen (s mezerami):")
        analyza.append(jakobsen.desifruj(zprava))
    if mod_x:
        analyza.append("\nJakobsen (bez mezer):")
        analyza.append(jakobsen.desifruj(zprava, False))

    # Posuny v abecede
    (posun, posunuty_text) = posuny.nejlepsi(zprava)
    if 'P' in opsny or 'A' in opsny:
        analyza.append("\nPosuny v abecede (nejlepsi posun {0}):".format(posun))
        analyza.append("\n".join("{0:>2} {1}".format(
                       i + 1, posuny.vsechny(zprava)[i]) for i in range(26)))
    else:
        analyza.append("\nNejlepsi posun ({0}):".format(posun))
        analyza.append(posunuty_text)

    # Bigramy
    if 'B' in opsny or 'A' in opsny:
        analyza.append("\nBigramy podle cetnosti:")
        bigramy = dict()
        for i in ABECEDA:
            for j in ABECEDA:
                bigramy[i+j] = 0
        for i in range(0, len(zprava)-1):
            if zprava[i:i+2] in bigramy:
                bigramy[zprava[i:i+2]] += 1
        celkem = sum(bigramy.values())
        for char in sorted(bigramy, key=bigramy.get, reverse=True):
            if bigramy[char] == 0:
                break
            analyza.append('{0} {1:>3} {2:>6.2%}'.format(char, bigramy[char],
                           float(bigramy[char])/celkem))
    return '\n'.join(analyza)

if __name__ == '__main__':
    if len(sys.argv) > 1:
        opsny = sys.argv[1]
    else:
        opsny = ''

    telo = sys.stdin.read()
    zprava = telo.strip().upper()
    print(analyza(zprava, opsny))

