#!/usr/bin/env python

"""Modul pro praci s referencnimi tabulkami."""

import pickle
from ocesavac import ocesat
import codecs
from koincidence import index_koincidence2
from spolecne import ABECEDA, MABECEDA

def nova_tabulka(tabulka, abc=MABECEDA):
    """Z tabulky cetnosti vyskytu udela tabulku percentualni cetnosti."""
    celkem = sum(sum(tab2.values()) for tab2 in tabulka.values())
    if celkem != 0:
        for i in abc:
            for j in abc:
                tabulka[i][j] /= float(celkem)
    return tabulka

def poradi_dle_frekvence(freq):
    return sorted(freq.keys(), key=freq.get, reverse=True)

class reference:
    def __init__(self, tref, komentar=''):
        self.abeceda = tref.abeceda
        self.poradi = poradi_dle_frekvence(tref.frekvence)
        self.tabulka = nova_tabulka(tref.tabulka, tref.abeceda)
        self.komentar = komentar

class treference:
    def __init__(self, mezery=True):
        if mezery:
            self.abeceda = MABECEDA
        else:
            self.abeceda = ABECEDA
        self.mezery = mezery
        self.frekvence = dict()
        for c in self.abeceda:
            self.frekvence[c] = 0
        self.tabulka = dict()
        for i in self.abeceda:
            self.tabulka[i] = dict()
            for j in self.abeceda:
                self.tabulka[i][j] = 0
        self.soubory = []
        
    def pridej(self, soubor):
        f = codecs.open(soubor, encoding='UTF-8')
        text = ocesat(f.read(), self.mezery)
        f.close()
        for i in range(len(text) - 1):
            self.tabulka[text[i]][text[i+1]] += 1
            self.frekvence[text[i]] += 1
        else:
            self.frekvence[text[i+1]] += 1
        self.soubory.append(soubor)

def uloz(co, kam):
    soubor = open(kam, 'w')
    pickle.dump(co, soubor)
    soubor.close()

def nacti(odkud):
    return pickle.load(open(odkud))

def tiskni(sref):
    r = nacti(sref)
    slovnik = dict(zip(r.abeceda, r.frekvence))
    for i in range(len(r.abeceda)):
        print "{0} {1:>6.2%}   {2} {3:>6.2%}".format(
            r.abeceda[i],
            r.frekvence[i],
            r.poradi[i],
            slovnik[r.poradi[i]] )
    print " "
    print "Index koincidence: {0:>5.2%}".format(r.index_koinc)
    print " "
    for char in r.abeceda:
        print char + " " + " ".join(
            ["{:0>5.2f}".format(r.tabulka[char][ch2] * 1000)
                for ch2 in r.abeceda])

def prumerny_index(tref):
    suma = 0
    for soubor in tref.soubory:
        f = codecs.open(soubor, encoding='UTF-8')
        text = ocesat(f.read(), tref.mezery)
        f.close()
        suma += index_koincidence2(text[:len(text)/2], text[len(text)/2:])
    return float(suma)/len(tref.soubory)
