# OBSAH SOUBORU:
# - funkce pro 'velikost pisma v pt -> velikost pisma v latex'

from openpyxl.cell import Cell

import settings
from enums import EFontSize


def get_cur_memoir(base: float, sizes: list, names: list):
    memoir_classes = [9, 11, 12, 14, 17, 20, 25, 30, 36, 48, 60]
    start = memoir_classes.index(base)
    sizes_trim = sizes[start:start + 12]
    return dict(zip(sizes_trim, names))


def get_closest_font_size(sz: float, sizes: dict):
    size_diffs = []
    for s in sizes:
        size_diffs.append((abs(sz - s), s))

    closest = min(size_diffs)[1]
    return sizes[closest]


def get_font_size(cell: Cell, base_size: float = 12.0, document_class: str = 'article'):
    """Funkce z vysky pisma v excelu vytvori latex prikaz na zmenu velikosti pisma v bunce (\\large, \\footnotesize,
    apod). Je mozne mit v cele bunce pouze 1 velikost pisma (v openpyxl se neda vycist formatovani casti textu v
    bunkach). Pozn: teoreticky lze mit jakoukoli velikost pisma, \\fontsize{69pt}{4.2}\\selectfont neni zrovna
    pekny zapis.'.

    Parameters:
        cell: bunka v sesitu kterou zkoumam
        base_size (float): zakladni velikost pisma v latex dokumentu (tu uzivatel musi nastavit)
        document_class (str): typ dokumentu v latexu (zadano uzivatelem)

    Returns:
        string s latex prikazem na velikost pisma """

    if not cell.font:
        return EFontSize.NORMAL

    if not cell.font.sz:
        return EFontSize.NORMAL

    if cell.font.sz == base_size:
        return EFontSize.NORMAL

    article10 = {5.0: EFontSize.tiny, 7.0: EFontSize.scriptsize, 8.0: EFontSize.footnotesize,
                 9.0: EFontSize.small, 10.0: '', 12.0: EFontSize.large,
                 14.4: EFontSize.Large, 17.28: EFontSize.LARGE, 20.74: EFontSize.huge,
                 24.88: EFontSize.Huge}
    article11 = {
        6.0: EFontSize.tiny, 8.0: EFontSize.scriptsize,
        9.0: EFontSize.footnotesize, 10.0: EFontSize.small,
        10.95: '', 12.0: EFontSize.large, 14.4: EFontSize.Large,
        17.28: EFontSize.LARGE, 20.74: EFontSize.huge,
        24.88: EFontSize.Huge
    }

    article12 = {6.0: EFontSize.tiny, 8.0: EFontSize.scriptsize, 10.0: EFontSize.footnotesize,
                 10.95: EFontSize.small, 12: '', 14.4: EFontSize.large,
                 17.28: EFontSize.Large, 20.74: EFontSize.LARGE, 24.88: EFontSize.huge}

    # vsechny velikosti ve tride memoir obsahuji stejne hodnoty, ale pod jinym jmenem. jsou jakoby jen posunute
    # dopredu. takze staci zjistit, jaka je zakladni velikost (9-60pt), podle ni vhodne uriznout list vsech velikosti
    # a pak tento oriznuty spojit do dict s memoir_size_names. presne to dela fce get_cur_memoir.
    memoir_sizes = [4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 10.95, 12.0, 14.4, 17.28, 20.74, 24.88, 30.0, 36.0, 48.0,
                    60.0, 72.0, 84.0, 96.0, 108.0, 120.0, 132.0]
    memoir_size_names = [EFontSize.miniscule, EFontSize.tiny, EFontSize.scriptsize, EFontSize.footnotesize,
                         EFontSize.small, '', EFontSize.large, EFontSize.Large,
                         EFontSize.LARGE, EFontSize.huge, EFontSize.Huge, EFontSize.HUGE]

    if document_class in ['article', 'report', 'book', 'letter', 'beamer']:
        if base_size == 10.0:
            return get_closest_font_size(cell.font.sz, article10)
        elif base_size == 11.0:
            return get_closest_font_size(cell.font.sz, article11)
        elif base_size == 12.0:
            return get_closest_font_size(cell.font.sz, article12)
        else:
            raise RuntimeError('Zvolená třída dokumentu nepodporuje zvolenou základní velikost písma.')
    elif document_class == 'memoir':
        if base_size in [9.0, 10.0, 11.0, 12.0, 14.0, 17.0, 20.0, 25.0, 30.0, 36.0, 48.0, 60.0]:
            return get_closest_font_size(cell.font.sz, get_cur_memoir(base_size, memoir_sizes, memoir_size_names))
