"""Modul pro praci s indexy koincidence"""

from ocesavac import ocesat
from collections import deque

def index_koincidence(text, mezery=False):
    """Vrati prumerny index koincidence textu."""
    text = ocesat(text, mezery)
    if mezery:
        text = text[1:-1]
    deq = deque(text)
    shod = 0
    for _ in range(1, len(text)):
        deq.rotate(1)
        shod += sum (x == y for x, y in zip(deq, text))
    return float(shod)/(len(text)*(len(text) - 1))

def index_koincidence2(text1, text2):
    """Pro dva texty vraci index koincidence. Texty nijak neupravuje,
    ocekava ze se skladaji pouze ze znaku pracovni abecedy."""
    shod = sum (x == y for x, y in zip(text1, text2))
    return float(shod)/min(len(text1), len(text2))
    
def index_rozkladu(text, deleni):
    """Vrati prumerny index koincidence pro text rozdeleny na vice casti
    (ve stylu 123123123... pro deleni=3). Slouzi napriklad k odhadu
    delky periodickeho hesla u polyalfabetickych sifer.""" 
    if (deleni == 1):
        return index_koincidence(text)
    texty = rozklad(ocesat(text, False), deleni)
    return sum([index_koincidence(text) for text in texty])/len(texty)

def tabulka_indexu(text):
    """Vypise tabulku prumernych indexu pro ruzna deleni textu."""
    return '\n'.join(['{1:>2} {0:.3%}'.format(
        index_rozkladu(text, d), d) for d in range(1, 11)])

def rozklad(text, deleni):
    """Vrati pole retezcu, v kazdem jsou znaky z puvodniho textu jejichz pozice
    ma stejny zbytek po deleni cislem 'deleni'."""
    return [text[i::deleni] for i in range(deleni)]
