<?php namespace Webien\SearchAddon;

use Webien\Setup\General;

class OptionPage
{
    public static function register()
    {
        self::init_options_page();
        // If clear cache form is posted..
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {

            if (isset($_POST["webien_clear_cache"]) && $_POST["webien_clear_cache"] === "1") {
                \Webien\SearchAddon\Cache::remove_all_entries();
            }
        }
        self::search_options();


    }

    static function search_options()
    {
        $acf = new \StoutLogic\AcfBuilder\FieldsBuilder(
            'search_options', ['title' => __('Sökalternativ', 'webien')]
        );

        // Only add template selection for elementor sites..
        if (did_action('elementor/loaded')) {
            $acf
                ->addTab(__('Mallar', 'webien'));

            $acf
                ->addMessage('mall_info', 'INFO', [
                    'label' => __('', 'webien'),
                    'message' => __('Dessa mallar används i resultatlistningen på söksidan.', 'webien'),
                    'new_lines' => 'wpautop',
                    'esc_html' => 0,
                ]);

            // Get post types selected for searching and add them here
            $relevanssi_post_types = get_option('relevanssi_index_post_types');

            // If for example relevanssi is not activated, exit early
            if (!$relevanssi_post_types) {
                return;
            }

            // Remove the bogus post_type
            if (($key = array_search('bogus', $relevanssi_post_types)) !== false) {
                unset($relevanssi_post_types[$key]);
            }

            foreach ($relevanssi_post_types as $post_type) {

                $acf
                    ->addPostObject('webien_search_template_' . $post_type, [
                        'label' => 'Mall: ' . ucfirst($post_type),
                        'instructions' => 'Elementor mall at visa ut sökresultat för posttypen: ' . ucfirst($post_type),
                        'required' => 0,
                        'conditional_logic' => [],
                        'wrapper' => [
                            'width' => '50',
                            'class' => '',
                            'id' => '',
                        ],
                        'post_type' => ['elementor_library'],
                        'taxonomy' => [],
                        'allow_null' => 1,
                        'multiple' => 0,
                        'return_format' => 'id',
                        'ui' => 1,
                    ])
                    ->addTrueFalse('webien_search_template_leave_link_' . $post_type, [
                        'label' => __('Hantera länkning från mallen', 'webien'),
                        'instructions' => __('Omsluter inte resultatet med en länk till singelposten. Länkningen hanteras istället i mallen.', 'webien'),
                        'required' => 0,
                        'conditional_logic' => [],
                        'wrapper' => [
                            'width' => '50',
                            'class' => '',
                            'id' => '',
                        ],
                        'message' => __('Aktivera', 'webien'),
                        'default_value' => 0,
                        'ui' => 0,
                        'ui_on_text' => '',
                        'ui_off_text' => '',
                    ]);
            }


            $acf
                ->addTab(__('Mallar (F&ouml;rslag)', 'webien'));

            $acf
                ->addMessage('mall_info_suggestion', 'INFO', [
                    'label' => __('', 'webien'),
                    'message' => __('Dessa mallar används när förslag visas under sökrutan.', 'webien'),
                    'new_lines' => 'wpautop',
                    'esc_html' => 0,
                ]);

            foreach ($relevanssi_post_types as $post_type) {
                $acf
                    ->addPostObject('webien_search_template_suggestion_' . $post_type, [
                        'label' => 'Mall: ' . ucfirst($post_type),
                        'instructions' => 'Elementor mall at visa ut sökresultat för posttypen: ' . ucfirst($post_type),
                        'required' => 0,
                        'conditional_logic' => [],
                        'wrapper' => [
                            'width' => '50',
                            'class' => '',
                            'id' => '',
                        ],
                        'post_type' => ['elementor_library'],
                        'taxonomy' => [],
                        'allow_null' => 1,
                        'multiple' => 0,
                        'return_format' => 'id',
                        'ui' => 1,
                    ])
                    ->addTrueFalse('webien_search_template_suggestion_leave_link_' . $post_type, [
                        'label' => __('Hantera länkning från mallen', 'webien'),
                        'instructions' => __('Omsluter inte resultatet med en länk till singelposten. Länkningen hanteras istället i mallen.', 'webien'),
                        'required' => 0,
                        'conditional_logic' => [],
                        'wrapper' => [
                            'width' => '50',
                            'class' => '',
                            'id' => '',
                        ],
                        'message' => __('Aktivera', 'webien'),
                        'default_value' => 0,
                        'ui' => 0,
                        'ui_on_text' => '',
                        'ui_off_text' => '',
                    ]);
            }
        }


        $acf
            ->addTab(__('Cache', 'webien'))
            ->addTrueFalse('webien_search_activate', [
                'label' => __('Aktivera cache för sökförslag', 'webien'),
                'instructions' => __('Sparar resultat av sökförslag', 'webien'),
                'required' => 0,
                'conditional_logic' => [],
                'wrapper' => [
                    'width' => '50',
                    'class' => '',
                    'id' => '',
                ],
                'message' => __('Aktivera', 'webien'),
                'default_value' => 0,
                'ui' => 0,
                'ui_on_text' => '',
                'ui_off_text' => '',
            ])
            ->addMessage('webien_search_info', 'INFO', [
                'label' => __('', 'webien'),
                'message' => __('Förslagen vid sökningar kan sparas så att de kan hämtas snabbare vid nästa sökning.<br>Sparade förslag rensas automatiskt om man sparar en post som innehåller ordet.<br>Kom ihåg att <a href="/wp-admin/options-general.php?page=relevanssi-premium%2Frelevanssi.php&tab=indexing">indexera via Relevanssi</a> om det inte är gjort sedan tidigare.', 'webien') . PHP_EOL . self::get_db_status(),
                'new_lines' => 'wpautop',
                'esc_html' => 0,
            ])
            ->conditional('webien_search_activate', '==', '1')
            ->addMessage('webien_search_index', 'INFO', [
                'label' => __('', 'webien'),
                'message' => __('Kontakta admin om du vill generera cache', 'webien'),
                /*
                'message' => __('Du kan generera cache för alla sökord som ligger i index. Detta gör att sökförslag kommer att ges mycket snabbt för alla sökningar.<br>Denna process kommer att ta en lång stund beroende på hur många ord du har indexerat.<br>Cachen kommer forstätta att byggas på från aktuell status, så om du vill generera om allt behöver du rensa all cache först.<br><br>För att underlätta detta jobb hanteras ord som förekommer <b>' . get_field('webien_search_cache_threshold', 'option'). '</b> gånger eller mer i index (läs vanligare ord), det går att ändra värdet i fältet nedan.<br>' . self::get_db_num_status() . '<br><br><b>Observera</b> att cache som byggs upp här endast avser sökningar där alla tillgängliga posttyper är aktiverade.', 'webien') . '
                            <div id="webien-search-build-cache">
                                <button
                                    id="build-cache-btn"
                                    type="submit"
                                    class="button-secondary">' .
                    __('Generera cache för alla sökord', 'webien') .
                    '</button>

                                <div class="progress">
                                    <span class="status">Status..</span>
                                    <div class="bkg">
                                        <div class="bar"></div>
                                    </div>
                                    <textarea readonly rows="5"></textarea>
                                </div>
                            </div>

                            ',*/
                'new_lines' => 'wpautop',
                'esc_html' => 0,
            ])
            ->conditional('webien_search_activate', '==', '1')
            /*
            // Disable until stable
            ->addNumber('webien_search_cache_threshold', [
                'label' => __('Tröskelvärde', 'webien'),
                'instructions' => __('Antal gånger ett ord behöver finnas för att det ska komma med i generering av cache ovan (Standard 5). Lägre värden ger mer cache men tar längre tid att generera.', 'webien'),
                'required' => 0,
                'conditional_logic' => [],
                'wrapper' => [
                    'width' => '50',
                ],
                'default_value' => 5,
                'min' => 1,
                'max' => 50,
                'step' => 1,
            ])
            ->conditional('webien_search_activate', '==', '1')

            ->addNumber('webien_search_cache_result_count', [
                'label' => __('Antal resultat', 'webien'),
                'instructions' => __('Antal träffar som ska cachas (Standard 10).<br>Vid scroll laddas fler.', 'webien'),
                'required' => 0,
                'conditional_logic' => [],
                'wrapper' => [
                    'width' => '50',
                ],
                'default_value' => 10,
                'min' => 0,
                'max' => 50,
                'step' => 5,
            ])
            ->conditional('webien_search_activate', '==', '1')
            */
            ->addMessage('webien_search_clear', 'INFO', [
                'label' => __('', 'webien'),
                'message' => __('Du kan rensa all sparad data här.<br>Tänk på att det kan ta lång tid att bygga upp allt igen.', 'webien') . '
                            <div>
                            <div class="clear-all-cache-loader">
                                <span class="dashicons dashicons-update"></span>
                                <span class="dashicons dashicons-saved"></span>
                            </div>
                                <button
                                    id="clear-cache-btn"
                                    type="submit"
                                    class="button-secondary">' .
                    __('Rensa all sök cache', 'webien') .
                    '</button>
                            </div>',
                'new_lines' => 'wpautop',
                'wrapper' => [
                    'width' => '',
                    'class' => '',
                    'id' => '',
                ],
                'esc_html' => 0,
            ])
            ->conditional('webien_search_activate', '==', '1');


        $acf
            ->addTab(__('Diverse', 'webien'))
            ->addNumber('webien_search_custom_field_boost', [
                'label' => __('Vikt för anpassade fält', 'webien'),
                'instructions' => __('Motsvarande för anpassade fält som görs <a href="/wp-admin/options-general.php?page=relevanssi-premium%2Frelevanssi.php&tab=searching">för innehåll</a>. (Standard 5)', 'webien'),
                'required' => 0,
                'conditional_logic' => [],
                'wrapper' => [
                    'width' => '',
                ],
                'default_value' => 5,
                'min' => 0,
                'max' => 50,
                'step' => 0.25,
            ])
            ->addTrueFalse('webien_search_index_filenames', [
                'label' => __('Aktivera indexering av filnamn', 'webien'),
                'instructions' => __('Ger sökresultat på filnamn i posttypen attachments', 'webien'),
                'required' => 0,
                'conditional_logic' => [],
                'wrapper' => [
                    'width' => '',
                    'class' => '',
                    'id' => '',
                ],
                'message' => __('Aktivera', 'webien'),
                'default_value' => 0,
                'ui' => 0,
                'ui_on_text' => '',
                'ui_off_text' => '',
            ])
            ->setLocation('options_page', '==', 'acf-options-webien');

        acf_add_local_field_group($acf->build());
    }

    private static function get_db_num_status()
    {
        global $wpdb;
        $table_relevanssi = $wpdb->prefix . 'relevanssi';

        $num = get_field('webien_search_cache_threshold', 'option') ?: 5;

        $sql = "SELECT COUNT(term) FROM
            (
                SELECT term, COUNT(term) count
                  FROM $table_relevanssi
                 GROUP BY term
                HAVING COUNT(term) >=$num
            ) d1";

        $total_words_num = $wpdb->get_var($sql);

        $total_words = $wpdb->get_var("SELECT COUNT(DISTINCT(term)) FROM $table_relevanssi");

        $percent = 0;
        if (floatval($total_words_num) > 0 && floatval($total_words) > 0) {
            $percent = round((floatval($total_words_num) / floatval($total_words)) * 100, 1);
        }

        $html = __('Ord som förekommer <b>%d</b> gånger eller mer motsvarar <b>%d</b>&percnt; av totala index.', 'webien');

        return sprintf($html, (int)$num, $percent);

    }


    private static function get_db_status()
    {
        global $wpdb;
        $table_name = $wpdb->prefix . 'webien_search_cache';
        $table_relevanssi = $wpdb->prefix . 'relevanssi';

        // If no ENV is used, return
        if (!isset($_ENV['DB_NAME'])) {
            return '<br><b style="color:orangered;">' . __('ENV fil kunde inte hittas, status på cache kan ej ges.') . '</b>';
        }

        $db_name = $_ENV['DB_NAME'];
        // check if table exist

        $table_exist = $wpdb->query("SELECT * FROM information_schema.tables WHERE table_schema = '$db_name' AND table_name = '$table_name' LIMIT 1");

        $html = '<fieldset style="background:#f1f1f1;padding: 15px;display:inline-block;">';

        if (!$table_exist) {
            $html .= '<b style="color:orangered;">' . __('Databastabellen kunde inte hittas, prova att inaktivera och aktivera "Webien Search" plugin..', 'webien') . '</b>';
        } else {
            // Get count
            $total_words = $wpdb->get_var("SELECT COUNT(DISTINCT(term)) FROM $table_relevanssi");
            $total_cached = $wpdb->get_var("SELECT COUNT(*) FROM $table_name");

            $html .= __('Antal unika ord i Relevanssi index', 'webien') . ': ' . number_format($total_words, 0, ',', ' ');
            $html .= '<br>' . __('Antal cachade förslag', 'webien') . ': ' . number_format($total_cached, 0, ',', ' ');

            if (!defined('S3_UPLOADS_BUCKET')) {
                // Get size of cache folder if it's on the same server
                $upload_dir = wp_upload_dir();
                $active_folder = get_option('webien_search_cache_active_folder');
                $active_folder = $active_folder ? '/' . $active_folder . '/' : '/';
                $dir = $upload_dir['basedir'] . '/webien/webien-search-cache' . $active_folder;

                $size = 0;

                if(function_exists('folderSize') && function_exists('filesize')){
                    foreach (glob(rtrim($dir, '/') . '/*', GLOB_NOSORT) as $each) {
                        $size += is_file($each) ? filesize($each) : folderSize($each);
                    }
                }

                $size = number_format($size / 1048576, 1) . ' MB';

                $html .= '<br>' . __('Storlek på cachefolder', 'webien') . ': <b>' . $size . '</b>';

                if (!$size) {
                    $html .= '<br><br><b style="color:orangered;">' . __('Cachemappen kunde inte hittas, prova att inaktivera och aktivera "Webien Search" plugin..', 'webien') . '</b>';
                }
            }
        }

        $html .= '</fieldset>';
        return $html;

    }


    static function init_options_page()
    {
        if (function_exists('acf_add_options_page')) {
            $parent = acf_add_options_page([
                'page_title' => 'Webien',
                'menu_title' => 'Webien',
                'capability' => 'manage_options',
                'icon_url' => 'dashicons-admin-settings',
                'redirect' => false
            ]);
            if ($parent) {
                acf_add_options_sub_page(
                    [
                        'page_title' => 'Inställningar',
                        'menu_title' => 'Inställningar',
                        'parent_slug' => $parent['menu_slug']
                    ]
                );
            }
        }
    }


}