<?php

/**

 * Oslovení zákazníka v 5. pádě, v přátelské podobě.

 *

 * Tabulka vznikla ze slovníku hypokoristik (Honzo, Pepo, Zuzko…) doplněného

 * o gramatické tvary pro jména, která se objevila v databázi zákazníků.

 * Klíč je bez diakritiky a malými písmeny — "Lukas", "LUKÁŠ" i "lukáš"

 * trefí stejný záznam.

 *

 * Když jméno v tabulce není, vrací se prázdný řetězec a e-mail začne

 * jenom „Ahoj," — špatně skloněné jméno vypadá hůř než žádné.

 *

 * @package ElementSell

 */



if ( ! defined( 'ABSPATH' ) ) {

    exit;

}



/**

 * Hodnoty, které nejsou křestní jméno (příjmení v poli jména, titul, nesmysl).

 *

 * @return array<int, string>

 */

function elementsell_osloveni_junk() {

    return [ 'b', 'm', 'mudr', 'mgr', 'ing', 'mama', 'proc', 'test', 'admin' ];

}



/**

 * Klíč pro vyhledávání: bez diakritiky, malými písmeny.

 *

 * @param string $text

 * @return string

 */

function elementsell_osloveni_klic( $text ) {

    $text = trim( (string) $text );



    if ( $text === '' ) {

        return '';

    }



    if ( function_exists( 'transliterator_transliterate' ) ) {

        $prevedene = transliterator_transliterate( 'Any-Latin; Latin-ASCII; Lower()', $text );



        if ( is_string( $prevedene ) && $prevedene !== '' ) {

            $text = $prevedene;

        }

    } else {

        $text = strtr(

            $text,

            [

                'á'=>'a','č'=>'c','ď'=>'d','é'=>'e','ě'=>'e','í'=>'i','ň'=>'n','ó'=>'o',

                'ř'=>'r','š'=>'s','ť'=>'t','ú'=>'u','ů'=>'u','ý'=>'y','ž'=>'z',

                'Á'=>'a','Č'=>'c','Ď'=>'d','É'=>'e','Ě'=>'e','Í'=>'i','Ň'=>'n','Ó'=>'o',

                'Ř'=>'r','Š'=>'s','Ť'=>'t','Ú'=>'u','Ů'=>'u','Ý'=>'y','Ž'=>'z',

                'ä'=>'a','ö'=>'o','ü'=>'u','ô'=>'o','ĺ'=>'l','ľ'=>'l','ŕ'=>'r','ą'=>'a',

            ]

        );

        $text = function_exists( 'mb_strtolower' ) ? mb_strtolower( $text, 'UTF-8' ) : strtolower( $text );

    }



    return trim( preg_replace( '/[^a-z]/', '', $text ) );

}



/**

 * Tabulka tvarů. Klíč bez diakritiky, hodnota už s diakritikou a v 5. pádě.

 *

 * @return array<string, string>

 */

function elementsell_osloveni_tabulka() {

    static $tabulka = null;



    if ( $tabulka !== null ) {

        return $tabulka;

    }



    $tabulka = [

    'adam' => 'Ádo',

    'adela' => 'Adél',

    'adem' => 'Adame',

    'adrian' => 'Adriáne',

    'adriana' => 'Adrianko',

    'aja' => 'Ájo',

    'alena' => 'Alenko',

    'alenka' => 'Alenko',

    'ales' => 'Aleši',

    'alexandr' => 'Alexandře',

    'alexandra' => 'Sašo',

    'alice' => 'Alinko',

    'alzbeta' => 'Bětko',

    'andrea' => 'Andy',

    'andrej' => 'Andreji',

    'andul' => 'Aničko',

    'aneta' => 'Anet',

    'anezka' => 'Anežko',

    'anita' => 'Anitko',

    'anna' => 'Aničko',

    'antonie' => 'Antonie',

    'antonin' => 'Tondo',

    'bara' => 'Baru',

    'barbara' => 'Baru',

    'barbora' => 'Baru',

    'bela' => 'Bělo',

    'benet' => 'Benete',

    'berenika' => 'Berčo',

    'bibiana' => 'Bibiano',

    'blanka' => 'Blanko',

    'bohdan' => 'Bohdane',

    'bohumil' => 'Bohuši',

    'bohumila' => 'Bohunko',

    'bohuslav' => 'Bohuši',

    'boris' => 'Borisi',

    'bozena' => 'Boženko',

    'brano' => 'Brano',

    'bronislav' => 'Bronislave',

    'cestmir' => 'Čestmíre',

    'dagmar' => 'Dášo',

    'dalibor' => 'Dalibore',

    'dan' => 'Dane',

    'dana' => 'Dančo',

    'daniel' => 'Dane',

    'daniela' => 'Dančo',

    'danuse' => 'Dančo',

    'darina' => 'Darinko',

    'darja' => 'Darjo',

    'david' => 'Davide',

    'denisa' => 'Denčo',

    'dennis' => 'Dennisi',

    'diana' => 'Dájo',

    'dita' => 'Ditko',

    'dominik' => 'Dominiku',

    'dominika' => 'Domi',

    'dorota' => 'Dorotko',

    'drahomira' => 'Drahuš',

    'drahoslav' => 'Drahoslave',

    'dusan' => 'Dušane',

    'edita' => 'Edito',

    'eduard' => 'Eduarde',

    'elias' => 'Eliasi',

    'eliska' => 'Eliško',

    'ella' => 'Ello',

    'emilia' => 'Emilko',

    'emilie' => 'Emilko',

    'emma' => 'Emmo',

    'erik' => 'Eriku',

    'erika' => 'Eriko',

    'erim' => 'Erime',

    'eva' => 'Evi',

    'evi' => 'Evi',

    'ewa' => 'Evi',

    'filip' => 'Fílo',

    'franta' => 'Fando',

    'frantisek' => 'Fando',

    'gabriela' => 'Gabčo',

    'hana' => 'Hani',

    'hanka' => 'Hani',

    'heda' => 'Hedo',

    'hedvika' => 'Hedy',

    'helena' => 'Helenko',

    'honza' => 'Honzo',

    'hubert' => 'Huberte',

    'igor' => 'Igore',

    'inge' => 'Inge',

    'irena' => 'Irčo',

    'iva' => 'Ivuško',

    'ivan' => 'Ivane',

    'ivana' => 'Ivi',

    'iveta' => 'Ivet',

    'ivo' => 'Ivo',

    'ivona' => 'Ivonko',

    'jachym' => 'Jáchyme',

    'jakub' => 'Kubo',

    'jan' => 'Honzo',

    'jana' => 'Jani',

    'jarda' => 'Jardo',

    'jarmila' => 'Jarmilko',

    'jaromir' => 'Jardo',

    'jaroslav' => 'Jardo',

    'jaroslava' => 'Jaruško',

    'jenifer' => 'Jenifer',

    'jindra' => 'Jindro',

    'jindrich' => 'Jindro',

    'jiri' => 'Jirko',

    'jirina' => 'Jiřinko',

    'jirka' => 'Jirko',

    'jita' => 'Jíťo',

    'jitka' => 'Jituš',

    'johanka' => 'Johanko',

    'jonas' => 'Jonáši',

    'josef' => 'Pepo',

    'jozef' => 'Jozefe',

    'juliana' => 'Juliánko',

    'juraj' => 'Juraji',

    'kaca' => 'Kačko',

    'kaci' => 'Kačko',

    'kacka' => 'Kačko',

    'kamil' => 'Kamile',

    'kamila' => 'Kamčo',

    'karel' => 'Karle',

    'karla' => 'Karličko',

    'karolina' => 'Kájo',

    'katalin' => 'Kataline',

    'katarina' => 'Kačko',

    'katerina' => 'Kačko',

    'katrin' => 'Káťo',

    'katu' => 'Katu',

    'kiki' => 'Kiki',

    'klara' => 'Klárko',

    'kristyna' => 'Kristý',

    'krystof' => 'Kryštofe',

    'kuba' => 'Kubo',

    'kubby' => 'Kubi',

    'kvetoslav' => 'Slávku',

    'kvetoslava' => 'Květuško',

    'lada' => 'Lado',

    'ladik' => 'Láďo',

    'ladislav' => 'Láďo',

    'ladka' => 'Laďko',

    'lenka' => 'Leni',

    'leona' => 'Leo',

    'leos' => 'Leoši',

    'leszek' => 'Leszku',

    'libor' => 'Libore',

    'libuse' => 'Libuško',

    'linda' => 'Lindo',

    'long' => 'Longu',

    'lubo' => 'Ľubo',

    'lubos' => 'Luboši',

    'luca' => 'Luco',

    'lucia' => 'Lucko',

    'lucie' => 'Lucko',

    'ludek' => 'Luďku',

    'ludmila' => 'Lidunko',

    'ludovit' => 'Ľudovíte',

    'ludvik' => 'Ludvíku',

    'luisa' => 'Luiso',

    'lukas' => 'Lukáši',

    'luky' => 'Luky',

    'lydie' => 'Lydie',

    'magda' => 'Magdo',

    'magdalena' => 'Magdo',

    'marcel' => 'Marcele',

    'marcela' => 'Marcelko',

    'marek' => 'Marku',

    'maria' => 'Maruško',

    'marian' => 'Máro',

    'mariana' => 'Marianko',

    'marie' => 'Maruško',

    'marika' => 'Mariko',

    'mario' => 'Mario',

    'market' => 'Markete',

    'marketa' => 'Markét',

    'marta' => 'Martičko',

    'martin' => 'Martine',

    'martina' => 'Marti',

    'matej' => 'Mateji',

    'matey' => 'Matey',

    'matus' => 'Matúši',

    'matyas' => 'Maty',

    'maxmilian' => 'Maxmiliáne',

    'michael' => 'Michaeli',

    'michaela' => 'Míšo',

    'michal' => 'Michale',

    'michala' => 'Michalo',

    'mike' => 'Mike',

    'mikolas' => 'Mikoláši',

    'mila' => 'Milko',

    'milada' => 'Miluško',

    'milan' => 'Mílo',

    'milena' => 'Milenko',

    'milos' => 'Mílo',

    'miloslav' => 'Miloslave',

    'miloslava' => 'Miluško',

    'miluse' => 'Miluško',

    'mirek' => 'Mirku',

    'mirka' => 'Mirko',

    'miroslav' => 'Mirku',

    'miroslava' => 'Mirko',

    'monika' => 'Moni',

    'nada' => 'Naďo',

    'natalie' => 'Natálko',

    'nathalie' => 'Natálko',

    'nela' => 'Neli',

    'nicolas' => 'Nicolasi',

    'niki' => 'Niki',

    'nikol' => 'Niki',

    'nikola' => 'Niki',

    'norbert' => 'Norberte',

    'oldrich' => 'Oldo',

    'olga' => 'Olinko',

    'ondra' => 'Ondro',

    'ondrej' => 'Ondro',

    'oto' => 'Oto',

    'paja' => 'Pájo',

    'patricia' => 'Páťo',

    'patricie' => 'Páťo',

    'patrik' => 'Patriku',

    'pavel' => 'Pavle',

    'pavla' => 'Pájo',

    'pavlina' => 'Pájo',

    'pavlos' => 'Pavlosi',

    'pavol' => 'Pavole',

    'pepa' => 'Pepo',

    'pepik' => 'Pepo',

    'peter' => 'Peťo',

    'petr' => 'Peťo',

    'petra' => 'Péťo',

    'petro' => 'Péťo',

    'premysl' => 'Přemysle',

    'radek' => 'Radku',

    'radim' => 'Radime',

    'radka' => 'Radko',

    'radomil' => 'Radomile',

    'radomir' => 'Radku',

    'radoslav' => 'Radoslave',

    'radovan' => 'Rado',

    'rastislav' => 'Rastislave',

    'regina' => 'Regino',

    'renata' => 'Renčo',

    'rene' => 'Rene',

    'richard' => 'Ríšo',

    'robert' => 'Robe',

    'robin' => 'Robine',

    'roman' => 'Romane',

    'romana' => 'Romčo',

    'rozalie' => 'Rozálko',

    'rudolf' => 'Rudo',

    'sabina' => 'Sabčo',

    'salih' => 'Salihu',

    'samuel' => 'Same',

    'sara' => 'Sárko',

    'sarka' => 'Šárko',

    'sigi' => 'Sigi',

    'silvie' => 'Silvi',

    'simom' => 'Simone',

    'simon' => 'Šimone',

    'simona' => 'Simčo',

    'sisa' => 'Siso',

    'slavka' => 'Slávko',

    'sofie' => 'Sofi',

    'sona' => 'Soňko',

    'standa' => 'Stando',

    'stanislav' => 'Stando',

    'stefan' => 'Štefane',

    'stepan' => 'Štěpo',

    'susanne' => 'Zuzko',

    'svatomir' => 'Svatomíre',

    'svatopluk' => 'Sváťo',

    'svetlana' => 'Světlo',

    'sylvie' => 'Silvi',

    'szefan' => 'Stefane',

    'tadeas' => 'Tadeáši',

    'tamara' => 'Tamarko',

    'tatana' => 'Táňo',

    'terez' => 'Terezi',

    'tereza' => 'Terko',

    'terezie' => 'Terko',

    'tom' => 'Tome',

    'tomas' => 'Tome',

    'tonda' => 'Tondo',

    'trade' => 'Trade',

    'vaclav' => 'Vašku',

    'valerie' => 'Valerko',

    'vanda' => 'Vando',

    'vanesa' => 'Vanesko',

    'vasek' => 'Vašku',

    'vasil' => 'Vasile',

    'venceslava' => 'Slávko',

    'venda' => 'Vendo',

    'vendelin' => 'Vendo',

    'vendula' => 'Vendy',

    'venka' => 'Věrko',

    'vera' => 'Věrko',

    'veronika' => 'Verčo',

    'viktor' => 'Viktore',

    'viola' => 'Violo',

    'vit' => 'Vítku',

    'vitezslav' => 'Víťo',

    'vitezslava' => 'Slávko',

    'vladimir' => 'Vláďo',

    'vladimira' => 'Vlaďko',

    'vladislav' => 'Vladislave',

    'vladka' => 'Vlaďko',

    'vlado' => 'Vlado',

    'vlasta' => 'Vlasti',

    'vlastimil' => 'Vlasto',

    'vlastislav' => 'Vlastislave',

    'vojta' => 'Vojto',

    'vojtech' => 'Vojto',

    'vratislav' => 'Vratislave',

    'zaneta' => 'Žanetko',

    'zbynek' => 'Zbyňku',

    'zdena' => 'Zdeňko',

    'zdenek' => 'Zdendo',

    'zdenka' => 'Zdeňko',

    'zdenko' => 'Zdendo',

    'zdeno' => 'Zdeno',

    'zikmund' => 'Zikmunde',

    'zuzana' => 'Zuzko',

    'zuzka' => 'Zuzko',

    ];



    /**

     * Doplnění nebo přepsání tvarů bez zásahu do pluginu.

     *

     * @param array<string, string> $tabulka

     */

    return (array) apply_filters( 'elementsell_osloveni_tabulka', $tabulka );

}



/**

 * Vrátí oslovení v 5. pádě, nebo prázdný řetězec.

 *

 * @param string $jmeno Křestní jméno, případně celé jméno.

 * @return string

 */

function elementsell_osloveni( $jmeno ) {

    $jmeno = trim( (string) $jmeno );



    if ( $jmeno === '' ) {

        return '';

    }



    $casti = preg_split( '/\s+/', $jmeno );

    $klic  = elementsell_osloveni_klic( $casti[0] );



    if ( $klic === '' || strlen( $klic ) < 2 ) {

        return '';

    }



    if ( in_array( $klic, elementsell_osloveni_junk(), true ) ) {

        return '';

    }



    // "Nováková" v poli jména — to není křestní jméno.

    if ( substr( $klic, -3 ) === 'ova' ) {

        return '';

    }



    $tabulka = elementsell_osloveni_tabulka();



    if ( isset( $tabulka[ $klic ] ) ) {

        return $tabulka[ $klic ];

    }



    // Tabulka jméno nezná — zkusíme obecné skloňování.

    $zalozni = elementsell_osloveni_zalozni_tvar( $casti[0] );



    /**

     * Poslední záchrana pro jména, která tabulka nezná.

     *

     * @param string $tvar  Prázdný řetězec = oslovení se nepoužije.

     * @param string $jmeno Původní zapsané jméno.

     */

    return (string) apply_filters( 'elementsell_osloveni_zaloha', $zalozni, $casti[0] );

}



/**

 * Obecné skloňování do 5. pádu pro jména, která nejsou v tabulce.

 *

 * Záměrně opatrné: řeší jen koncovky, u kterých je tvar jednoznačný.

 * Když si není jisté, vrátí prázdný řetězec a e-mail začne jen „Ahoj,".

 *

 * @param string $jmeno

 * @return string

 */

function elementsell_osloveni_zalozni_tvar( $jmeno ) {

    $jmeno = trim( (string) $jmeno );



    if ( $jmeno === '' || ! function_exists( 'mb_substr' ) ) {

        return '';

    }



    // Sjednotit velikost písmen: "PAVEL" i "pavel" -> "Pavel".

    if ( $jmeno === mb_strtoupper( $jmeno, 'UTF-8' ) || $jmeno === mb_strtolower( $jmeno, 'UTF-8' ) ) {

        $jmeno = mb_convert_case( $jmeno, MB_CASE_TITLE, 'UTF-8' );

    }



    $delka    = mb_strlen( $jmeno, 'UTF-8' );

    $posledni = mb_strtolower( mb_substr( $jmeno, -1, 1, 'UTF-8' ), 'UTF-8' );

    $konec2   = mb_strtolower( mb_substr( $jmeno, -2, 2, 'UTF-8' ), 'UTF-8' );

    $bez1     = mb_substr( $jmeno, 0, $delka - 1, 'UTF-8' );

    $bez2     = mb_substr( $jmeno, 0, $delka - 2, 'UTF-8' );



    if ( $delka < 3 ) {

        return '';

    }



    // Ženská jména na -a: Jitka -> Jitko, Renata -> Renato

    if ( $posledni === 'a' ) {

        return $bez1 . 'o';

    }



    // Končí samohláskou (Marie, Ivo, Toni, Sofie) — necháváme beze změny.

    if ( in_array( $posledni, [ 'e', 'ě', 'i', 'í', 'o', 'u', 'ů', 'y', 'ý' ], true ) ) {

        return $jmeno;

    }



    // -ek / -ěk: Marek -> Marku, Radek -> Radku

    if ( in_array( $konec2, [ 'ek', 'ěk' ], true ) ) {

        return $bez2 . 'ku';

    }



    // Měkké souhlásky: Tomáš -> Tomáši, Ondřej -> Ondřeji, Luboš -> Luboši

    if ( in_array( $posledni, [ 'š', 'č', 'ž', 'ř', 'j', 'ň', 'ť', 'ď', 'c' ], true ) ) {

        return $jmeno . 'i';

    }



    // Zadní souhlásky: Patrik -> Patriku, Vojtěch -> Vojtěchu, Oleg -> Olegu

    if ( in_array( $posledni, [ 'k', 'g', 'h' ], true ) || $konec2 === 'ch' ) {

        return $jmeno . 'u';

    }



    // Ostatní souhlásky: Martin -> Martine, Bohdan -> Bohdane

    if ( preg_match( '/^[a-zá-žA-ZÁ-Ž]$/u', $posledni ) ) {

        return $jmeno . 'e';

    }



    return '';

}



/**

 * „Ahoj Honzo," / „Ahoj," když jméno neznáme.

 *

 * @param string $jmeno

 * @return string

 */

function elementsell_pozdrav( $jmeno ) {

    $tvar = elementsell_osloveni( $jmeno );



    return $tvar === '' ? 'Ahoj,' : 'Ahoj ' . $tvar . ',';

}

