# OBSAH SOUBORU:
# - retezce do legendy
# - funkce pro tvorbu legendy

import settings

# legenda je resena tak, ze v prubehu prevodu si do settings ulozim to, co zarucene bude ve vystupu, jako prosty bool.
# podle techto boolu a zvoleneho nastaveni legendy se do vystupu prida latex komentar ktery obsahuje syntaxi
# anebo popis daneho prikazu. tyto komentare jsou zde sepsany v dict, aby k nim slo pristupovat individialne.

# v pripade ze je zapnuty i popis pouzitych zkratek v syntaxi nebo mozne hodnoty techto parametru, tak je taky do
# vystupu zakomponuju. ty budou vzdy zvlast, jelikoz se u nekterych parametru opakuji a zase nechci delat vystup z 80 %
# tvoreny latex komentarema.

# syntaxe
syntaxes = {'hlines':  r'hlines = {indexy_sloupců}{typ_okraje, barva, tloušťka}',
            'vlines':  r'hlines = {indexy_sloupců}{typ_okraje, barva, tloušťka}',
            'hline':   r'hline{pořadí} = {indexy_sloupců}{typ_okraje, barva, tloušťka}',
            'vline':   r'vline{pořadí} = {indexy_řádků}{typ_okraje, barva, tloušťka}',
            'rows':    r'rows = {halign, valign, výška, barva_pozadí, barva_textu, '
                       r'font=\font_cmds, cmd={\latex_cmd}}',
            'columns': r'columns = {halign, valign, výška, barva_pozadí, barva_textu, '
                       r'font=\font_cmds, cmd={\latex_cmd}}',
            'row':     r'row{pořadí} = {halign, valign, šířka, barva_pozadí, barva_textu, '
                       r'font=\font_cmds, cmd={\latex_cmd}}',
            'column':  r'column{pořadí} = {halign, valign, šířka, barva_pozadí, barva_textu, '
                       r'font=\font_cmds, cmd={\latex_cmd}}',
            'colspec': r'colspec = {typ_sloupce{šířka}}',
            'rowspec': r'rowspec = {typ_řádku{výška}}',
            'cell':    r'cell{řádek}{sloupec} = {r=počet_sloupců, c=počet_řádků} {halign, valign, barva_pozadí, '
                       r'barva_textu, font=\font_cmds, cmd={\latex_cmd}}}',
            'setcell': r'\SetCell[r=počet_sloupců, c=počet_řádků]{halign, valign, barva_pozadí, barva_textu, '
                       r'font=\font_cmds, cmd={\latex_cmd}}} TEXT__BUŇKY'}
# slovni popis
descriptions = {'hlines':  [' = Nastaví zadané horizontální okraje u všech řádků.',
                            '   Tyto okraje budou pouze ve sloupcích dle parametru \'indexy_sloupců\'.'],
                'vlines':  [' = Nastaví zadané svislé okraje u všech sloupců.',
                            '   Tyto okraje budou pouze v řádcích dle parametru \'indexy_řádků\'.'],
                'hline':   [' = Vytvoří horizontální okraj.',
                            '   Tento okraj bude pouze v sloupcích dle parametru \'indexy_sloupců\'.'],
                'vline':   [' = Vytvoří svislý okraj.',
                            '   Tento okraj bude pouze v řádcích dle parametru \'indexy_řádků\'.'],
                'rows':    [' = Nastaví zadaný formát u všech řádků'],
                'columns': [' = Nastaví zadaný formát u všech sloupců'],
                'row':     [' = Nastaví zadaný formát konkrétního řádku.'],
                'column':  [' = Nastaví zadaný formát konkrétního sloupce.'],
                'colspec': [' = Řídí šířku a horinzontální zarovnání textu všech sloupců.'],
                'rowspec': [' = Řídí výšku a vertikální zarovnání textu všech řádků.'],
                'cell':    [' = Nastaví formát konkrétní buňky. \n\t\t%    Parametry počet_řádků a počet_sloupců jsou '
                            'pro sloučené buňky, celou svorku lze vynechat.'],
                'setcell': [' = Nastaví formát konkrétní buňky. Píše se do těla tabulky! \n\t\t%    Parametry '
                            'počet_řádků a počet_sloupců jsou pro sloučené buňky, celou svorku lze vynechat.']}

# seznam zkratek
abbrs = {'halign': 'horizontální zarovnání',
         'valign': 'vertkální zarovnání',
         r'font_cmds': 'formát textu celé buňky (tučnž, kurzíva)',
         r'latex_cmd': 'LaTeX příkaz, do jehož argumentu se pošle text buňky' }

# mozne hodnoty
possible_vals = {'halign': ['r ... vpravo,   l ... vlevo,   c ... na střed,   j ... do bloku'],
                 'valign': ['h ... nahoru,   f ... dolů,   m ... na střed'],
                 'barvy': ['gray,   red,   brown,   yellow,   olive,   green,   teal,   cyan,',
                           'azure,   blue,   violet,   magenta ,  purple,   black,   white'],
                 'rozměry': ['{15.0pt},  {1.2cm},  {2em} ... '],
                 r'font_cmds': [r'\itshape,   \bfseries,   příkazy pro velikost textu (\Large apod.)'],
                 r'latex_cmd': ['jakýkoli platný LaTeX příkaz s jedním paramaterem, příkazy nelze zanořovat.'],
                 'typ_sloupce': ['X[halign] ... sloupec s relativní šířkou, text zarovnán dle \'halign\',',
                                 'l ... text zarovnán vlevo,   r ... text zarovnán vpravo,',
                                 'c ... text zarovnán na střed,   m ... text zarovnán vertikálně na střed,',
                                 'h ... text zarovnán nahoru,   f ... text zarovnán dolů'],
                 'typ_okraje': ['solid ... plný,   dotted ... tečkovaný,   dashed ... čárkovaný']}

# uplne sem nepatri, ale co uz.
# vychozi retezec uvnitr vlastni hlavicky, krasny ze?
custom_head_intro: str = 'Zde můžete svému výstupu ručně vytvořit formát.\n' \
                   'Tento formát se automaticky vloží do hlavičky \nvýstupu a ukládá se do profilu nastavení. ' \
                   '\n\nNemusíte tak pokaždé formátovat vstupní soubor, \nnebo si tu hlavičku někde dohledávat ' \
                   've svém \ndokumentu.\n\nTato hlavička se nijak nekontroluje, dbejte tedy\nna správnou syntaxi. ' \
                   'Mějte na paměti, že hlavičky\nvygenerované tímto programem jsou zpravidla\nplatné jen pro ' \
                   'tu danou tabulku a budou u nich \nnutné ruční úpravy. ' \
                   '\n\nVše o tom, co zde lze psát, jde dohledat v \ndokumentaci tabularray. ' \
                   'V sekci Nápověda je \nnachystaný krátký Cheat sheet pro rychlou \nreferenci. ' \
                   '\n\nNový řádek vložíte přes CTRL+ENTER.\n\nPříklad správného vstupu:\n' \
                   'columns = {r, 2cm},\nrow{1} = {c, font=\\bfseries},\nhline{2} = {0.7pt},\nhline{1} = ' \
                   '{1.2pt},\nvline{1} = {1.2pt},\nhline{Y} = {0.7pt},\nhline{Z} = {1.2pt},\nvline{Z} = {1.2pt},\n' \
                   '\n\nPozn: Indexy Z, Y, X odkazují na indexy směrem\nod konce. Indexem Z se myslí poslední index,\n'\
                         'Y předposlední a X třetí od konce. V ostatních\npřípadech musíte použít přímo číslo řadku.' \
                   '\n\nPozn: Na poslední řádek tohoto formátu vždy \nradějí dejte čárku. Obzvlášť pokud ' \
                         'plánujete \npoužívat sloučené buňky.'


def make_abbrs():
    """Funkce tvori 'zkratky parametru' legendy"""
    abbr_str = f'{settings.TABS}% Zkratky parametrů v syntaxi: \n'

    if settings.legend._row or settings.legend._rows or settings.legend._column or settings.legend._columns \
            or settings.legend._cell or settings.legend._setcell:
        for key in ['font_cmds', 'halign', 'latex_cmd', 'valign']:
            abbr_str += f'{settings.TABS}%\t{key} ... {abbrs[key]}\n'

    return abbr_str


def make_params():
    """Funkce tvori 'mozne hodnoty parametru' legendy"""
    param_str = f'{settings.TABS}% Možné hodnoty parametrů: \n'
    a = settings.legend

    if settings.legend._row or settings.legend._rows or settings.legend._column or settings.legend._columns \
            or settings.legend._cell or settings.legend._setcell:
        for key in ['barvy', 'font_cmds', 'halign', 'latex_cmd', 'valign']:
            param_str += make_vals_str(key)

        if not settings.legend._cell and not settings.legend._setcell:
            param_str += make_vals_str('rozměry')

    if settings.legend._hline or settings.legend._hlines or settings.legend._vline or settings.legend._vlines:
        param_str += make_vals_str('typ_okraje')

    if settings.legend._colspec:
        param_str += make_vals_str('typ_sloupce')

        if not(settings.legend._row or settings.legend._rows or settings.legend._column or settings.legend._columns
                or settings.legend._cell or settings.legend._setcell):
            param_str += make_vals_str('halign')

    return param_str


def make_expl_str(key: str, with_syntax: bool = True):
    """Funkce tvori 'slovni popis' legendy. """
    expl_str = ''

    # uz mam syntax a nepotrebuju nazev prvku
    if with_syntax:
        for k in descriptions[key]:
            expl_str += f'{settings.TABS}% {k}\n'

    # tvorim ho bez syntaxe a potrebuju pridat i nazev toho k cemu se popis vaze
    else:
        expl_str += f'{settings.TABS}% {key}{descriptions[key][0]}\n'

        for k in descriptions[key][1:]:
            expl_str += f'{settings.TABS}% {" "*len(key)}{k}\n'

    return expl_str


def make_vals_str(key: str):
    """Pomocna funkce pro tvorbu moznych hodnot parametru legendy. Kazdy prvek z possible_vals[key] vytiskne na
    novy radek s tim ze prida jeho nazev, 2 tabulatory a %
    Parameters:
        key (str): nazev prvku legendy"""

    vals_str = f'{settings.TABS}% - {key}: \n'
    for k in possible_vals[key]:
        vals_str += f'{settings.TABS}%\t{k}\n'

    if vals_str != f'{key}: \n':
        return vals_str

    return ''


def make_legend_entry(key: str):
    """Funkce tvori vysledny prvek legendy slozenim syntaxe a slovniho popisu"""
    ret_str = ''

    if settings.legend.syntax:
        ret_str += f'{settings.TABS}% {syntaxes[key]} \n'

    if settings.legend.expl:
        ret_str += make_expl_str(key, settings.legend.syntax)

    return ret_str
