<?php
/**
 * Holds the PhpMyAdmin\UserPreferencesHeader class
 *
 * @package PhpMyAdmin
 */
declare(strict_types=1);

namespace PhpMyAdmin;

use PhpMyAdmin\Config\Forms\User\UserFormList;
use Throwable;
use Twig_Error_Loader;
use Twig_Error_Runtime;
use Twig_Error_Syntax;

/**
 * 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_Loader
     * @throws Twig_Error_Runtime
     * @throws Twig_Error_Syntax
     */
    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_Loader
     * @throws Twig_Error_Runtime
     * @throws Twig_Error_Syntax
     */
    protected static function displayTabs(Template $template): string
    {
        global $route;

        // build user preferences menu
        $content = Util::getHtmlTab(
            [
                'link' => 'index.php?route=/preferences/manage',
                'text' => __('Manage your settings'),
                'active' => $route === '/preferences/manage',
            ]
        ) . "\n";
        /* Second authentication factor */
        $content .= Util::getHtmlTab(
            [
                'link' => 'index.php?route=/preferences/twofactor',
                'text' => __('Two-factor authentication'),
                'active' => $route === '/preferences/twofactor',
            ]
        ) . "\n";

        $content .= self::displayTabsWithIcon();

        return '<div class=container-fluid><div class=row>' .
        $template->render(
            'list/unordered',
            [
                'id' => 'topmenu2',
                'class' => 'user_prefs_tabs',
                'content' => $content,
            ]
        ) . '<div class="clearfloat"></div></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',
        ];
        $route = $_GET['route'] ?? $_POST['route'] ?? '';
        $content = null;
        foreach (UserFormList::getAll() as $formset) {
            $formset_class = UserFormList::get($formset);
            $tab = [
                'link' => 'index.php?route=/preferences/forms',
                'text' => $formset_class::getName(),
                'icon' => $tabs_icons[$formset],
                'active' => $route === '/preferences/forms' && $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;
    }
}
