"""Modul pro praci s posuny v abecede."""

import referencni
from referencni import reference
from ocesavac import ocesat
from spolecne import ABECEDA

def posun(char, pos=1):
    """Pokud dostane velke pismeno, vrati pismeno ktere je od nej vzdaleno
    'pos' mist v abecede. Jinak vrati puvodni pismeno."""
    if 65 <= ord(char) < 91 - pos:
        return chr(ord(char) + pos)
    if ord(char) < 91 and ord(char) >= 91 - pos:
        return chr(ord(char) + pos - 26)
    else:
        return char

def vsechny(zprava):
    """Pro danou zpravu (libovolny text vsetne zvlastnich znaku) vrati
    vsechny jeji posuny v abecede."""
    posunuty = zprava.upper()
    analyza = []
    for _ in range(26):
        posunuty = [posun(char) for char in  posunuty]
        analyza.append(''.join(posunuty))
    return analyza

def eu_vzdalenost(vec1, vec2):
    """Euklidovska vzdalenost dvou vektoru."""
    return sum([(x - y)**2 for (x, y) in zip(vec1, vec2)])

def nejlepsi(text):
    """Vrati text (neocesany) posunuty tak, aby mel frekvence znaku co
    nejblizsi cestine bez mezer."""
    posunuti = nej_posun(text)
    return (posunuti, ''.join([posun(char, posunuti) for char in text.upper()]))

def nej_posun(text):
    """Vrati pocet znaku v abecede, o ktere by se mel text posunout, aby mel
    frekvence znaku co nejblize cestine bez mezer."""
    ref = referencni.nacti('bref')
    freq = dict()
    for char in ocesat(text, False):
        freq[char] = freq.get(char, 0) + 1
    celkem = sum(freq.values())
    frekv = [float(freq.get(char, 0))/celkem for char in ABECEDA]
    vzdalenost = eu_vzdalenost(frekv, ref.frekvence)
    posunuti = 0
    for i in range(1, 26):
        frekv = [frekv[25]] + frekv[:-1]
        nova_vzdalenost = eu_vzdalenost(frekv, ref.frekvence)
        if nova_vzdalenost < vzdalenost:
            vzdalenost = nova_vzdalenost
            posunuti = i
    return posunuti
