<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
 * Holds the PhpMyAdmin\UserPreferencesHeader class
 *
 * @package PhpMyAdmin
 */
declare(strict_types=1);

namespace PhpMyAdmin;

use PhpMyAdmin\Config\Forms\User\UserFormList;
use Throwable;

/**
 * Functions for displaying user preferences header
 *
 * @package PhpMyAdmin
 */
class UserPreferencesHeader
{
    /**
     * Get HTML content
     *
     * @param Template $template Template object used to render data
     * @param Relation $relation Relation object
     *
     * @return string
     * @throws Throwable
     * @throws \Twig\Error\LoaderError
     * @throws \Twig\Error\RuntimeError
     * @throws \Twig\Error\SyntaxError
     */
    public static function getContent(Template $template, Relation $relation): string
    {
        return self::displayTabs($template)
            . self::displayConfigurationSavedMessage()
            . self::sessionStorageWarning($relation);
    }

    /**
     * @param Template $template Template object used to render data
     *
     * @return string
     * @throws Throwable
     * @throws \Twig\Error\LoaderError
     * @throws \Twig\Error\RuntimeError
     * @throws \Twig\Error\SyntaxError
     */
    protected static function displayTabs(Template $template): string
    {
        // build user preferences menu
        $content = Util::getHtmlTab(
            [
                'link' => 'prefs_manage.php',
                'text' => __('Manage your settings'),
            ]
        ) . "\n";
        /* Second authentication factor */
        $content .= Util::getHtmlTab(
            [
                'link' => 'prefs_twofactor.php',
                'text' => __('Two-factor authentication'),
            ]
        ) . "\n";

        $content .= self::displayTabsWithIcon();

        return $template->render(
            'list/unordered',
            [
                'id' => 'topmenu2',
                'class' => 'user_prefs_tabs',
                'content' => $content,
            ]
        ) . '<div class="clearfloat"></div>';
    }

    /**
     * @return string
     */
    protected static function displayTabsWithIcon(): string
    {
        $form_param = $_GET['form'] ?? null;
        $tabs_icons = [
            'Features' => 'b_tblops',
            'Sql' => 'b_sql',
            'Navi' => 'b_select',
            'Main' => 'b_props',
            'Import' => 'b_import',
            'Export' => 'b_export',
        ];
        $script_name = basename($GLOBALS['PMA_PHP_SELF']);
        $content = null;
        foreach (UserFormList::getAll() as $formset) {
            $formset_class = UserFormList::get($formset);
            $tab = [
                'link' => 'prefs_forms.php',
                'text' => $formset_class::getName(),
                'icon' => $tabs_icons[$formset],
                'active' => 'prefs_forms.php' === $script_name && $formset === $form_param,
            ];
            $content .= Util::getHtmlTab($tab, ['form' => $formset]) . "\n";
        }
        return $content;
    }

    /**
     * @return string|null
     */
    protected static function displayConfigurationSavedMessage(): ?string
    {
        // show "configuration saved" message and reload navigation panel if needed
        if (! empty($_GET['saved'])) {
            return Message::rawSuccess(__('Configuration has been saved.'))
                ->getDisplay();
        }

        return null;
    }

    /**
     * @param Relation $relation Relation instance
     *
     * @return string|null
     */
    protected static function sessionStorageWarning(Relation $relation): ?string
    {
        // warn about using session storage for settings
        $cfgRelation = $relation->getRelationsParam();
        if (! $cfgRelation['userconfigwork']) {
            $msg = __(
                'Your preferences will be saved for current session only. Storing them '
                . 'permanently requires %sphpMyAdmin configuration storage%s.'
            );
            $msg = Sanitize::sanitizeMessage(
                sprintf($msg, '[doc@linked-tables]', '[/doc]')
            );
            return Message::notice($msg)
                ->getDisplay();
        }

        return null;
    }
}
