<?php
/**
 * Admin: terms, privacy policy, and mandatory acceptance.
 *
 * @package Maca_Menu_List_Pro
 */

if (!defined('ABSPATH')) {
    exit;
}

class Maca_MenuList_Pro_Admin_Legal {

    /**
     * Constructor.
     */
    public function __construct() {
        add_action('admin_menu', array($this, 'register_menu'), 12);
        add_action('admin_init', array($this, 'handle_activation_redirect'), 1);
        add_action('admin_init', array($this, 'handle_acceptance'), 5);
        add_action('admin_init', array($this, 'maybe_redirect_to_legal'), 6);
        add_action('admin_notices', array($this, 'admin_notices'));
    }

    /**
     * Register legal submenu.
     */
    public function register_menu() {
        add_submenu_page(
            'maca-restu',
            __('Villkor och integritet', 'maca-restu-pro'),
            __('Villkor och integritet', 'maca-restu-pro'),
            maca_menulist_admin_required_cap(),
            'maca-restu-legal',
            array($this, 'render_page')
        );
    }

    /**
     * Redirect to legal page right after activation.
     */
    public function handle_activation_redirect() {
        if (!maca_menulist_user_can_manage_secrets() || maca_menulist_legal_is_accepted()) {
            return;
        }

        if (!get_transient(MACA_MENULIST_LEGAL_REDIRECT_TRANSIENT)) {
            return;
        }

        delete_transient(MACA_MENULIST_LEGAL_REDIRECT_TRANSIENT);

        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Redirect flag only.
        if (isset($_GET['page']) && sanitize_key(wp_unslash($_GET['page'])) === 'maca-restu-legal') {
            return;
        }

        wp_safe_redirect(maca_menulist_legal_get_admin_url());
        exit;
    }

    /**
     * Block other maca Restu admin screens until acceptance.
     */
    public function maybe_redirect_to_legal() {
        if (!maca_menulist_user_can_manage_secrets() || maca_menulist_legal_is_accepted()) {
            return;
        }

        if (!$this->is_maca_menulist_admin_request()) {
            return;
        }

        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only screen detection.
        $page = isset($_GET['page']) ? sanitize_key(wp_unslash($_GET['page'])) : '';
        if ($page === 'maca-restu-legal' || $page === 'maca-restu-support') {
            return;
        }

        wp_safe_redirect(
            add_query_arg('maca_legal_required', '1', maca_menulist_legal_get_admin_url())
        );
        exit;
    }

    /**
     * Handle acceptance form.
     */
    public function handle_acceptance() {
        if (!isset($_POST['maca_legal_action'])) {
            return;
        }

        if (!isset($_POST['maca_legal_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['maca_legal_nonce'])), 'maca_legal_accept')) {
            return;
        }

        if (!maca_menulist_user_can_manage_secrets()) {
            return;
        }

        if (sanitize_text_field(wp_unslash($_POST['maca_legal_action'])) !== 'accept') {
            return;
        }

        $accept_terms = !empty($_POST['maca_legal_accept_terms']);
        $accept_privacy = !empty($_POST['maca_legal_accept_privacy']);

        if (!$accept_terms || !$accept_privacy) {
            add_settings_error(
                'maca_legal',
                'maca_legal_missing',
                __('Du måste godkänna både användarvillkoren och integritetspolicyn för att fortsätta.', 'maca-restu-pro'),
                'error'
            );
            return;
        }

        if (!maca_menulist_legal_save_acceptance(get_current_user_id())) {
            add_settings_error(
                'maca_legal',
                'maca_legal_save_failed',
                __('Kunde inte spara ditt godkännande. Försök igen.', 'maca-restu-pro'),
                'error'
            );
            return;
        }

        if (
            function_exists('maca_menulist_onboarding_is_enabled')
            && maca_menulist_onboarding_is_enabled()
            && function_exists('maca_menulist_onboarding_is_fresh_install')
            && function_exists('maca_menulist_onboarding_start')
            && maca_menulist_onboarding_is_fresh_install()
        ) {
            maca_menulist_onboarding_start();
            maca_menulist_onboarding_queue_redirect();
            wp_safe_redirect(maca_menulist_onboarding_get_admin_url());
            exit;
        }

        add_settings_error(
            'maca_legal',
            'maca_legal_saved',
            __('Tack. Du kan nu använda maca Restu Pro.', 'maca-restu-pro'),
            'success'
        );

        wp_safe_redirect(maca_menulist_legal_get_admin_url());
        exit;
    }

    /**
     * Notice when acceptance is pending.
     */
    public function admin_notices() {
        if (!maca_menulist_user_can_manage_secrets() || maca_menulist_legal_is_accepted()) {
            return;
        }

        if ($this->is_maca_menulist_admin_request()) {
            return;
        }

        $url = maca_menulist_legal_get_admin_url();
        echo '<div class="notice notice-warning"><p>';
        printf(
            wp_kses(
                /* translators: %s: legal page URL */
                __('maca Restu Pro kräver godkännande av villkor och integritetspolicy innan användning. <a href="%s">Granska och godkänn</a>.', 'maca-restu-pro'),
                array('a' => array('href' => true))
            ),
            esc_url($url)
        );
        echo '</p></div>';
    }

    /**
     * Render legal page.
     */
    public function render_page() {
        if (!maca_menulist_user_can_manage_secrets()) {
            return;
        }

        require_once MACA_MENULIST_PLUGIN_DIR . 'includes/markdown.php';

        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Tab navigation only.
        $tab = isset($_GET['tab']) ? sanitize_key(wp_unslash($_GET['tab'])) : 'terms';
        if ($tab !== 'privacy') {
            $tab = 'terms';
        }

        $accepted = maca_menulist_legal_is_accepted();
        $record = maca_menulist_legal_get_acceptance();
        $terms_html = maca_menulist_render_markdown_file(maca_menulist_legal_get_document_path('terms'));
        $privacy_html = maca_menulist_render_markdown_file(maca_menulist_legal_get_document_path('privacy'));

        settings_errors('maca_legal');
        ?>
        <div class="wrap maca-legal-wrap">
            <h1><?php esc_html_e('Villkor och integritet', 'maca-restu-pro'); ?></h1>

            <?php if (!$accepted) : ?>
                <div class="notice notice-warning inline">
                    <p>
                        <?php esc_html_e('Du måste läsa och godkänna dessa dokument innan du använder maca Restu Pro. Publika menyer och QR-sidor förblir dolda tills godkännandet är sparat.', 'maca-restu-pro'); ?>
                    </p>
                </div>
            <?php elseif (!empty($record['accepted_at'])) : ?>
                <div class="notice notice-success inline maca-legal-accepted-notice">
                    <p>
                        <?php
                        $user_label = !empty($record['user_login']) ? (string) $record['user_login'] : __('Okänd användare', 'maca-restu-pro');
                        printf(
                            /* translators: 1: datetime, 2: username */
                            esc_html__('Godkänd %1$s av %2$s (dokumentversion %3$s / %4$s).', 'maca-restu-pro'),
                            esc_html((string) $record['accepted_at']),
                            esc_html($user_label),
                            esc_html((string) ($record['terms_version'] ?? '')),
                            esc_html((string) ($record['privacy_version'] ?? ''))
                        );
                        ?>
                    </p>
                </div>
            <?php endif; ?>

            <nav class="nav-tab-wrapper maca-legal-tabs" aria-label="<?php esc_attr_e('Juridiska dokument', 'maca-restu-pro'); ?>">
                <a href="<?php echo esc_url(maca_menulist_legal_get_admin_url('terms')); ?>" class="nav-tab <?php echo $tab === 'terms' ? 'nav-tab-active' : ''; ?>">
                    <?php esc_html_e('Användarvillkor', 'maca-restu-pro'); ?>
                </a>
                <a href="<?php echo esc_url(maca_menulist_legal_get_admin_url('privacy')); ?>" class="nav-tab <?php echo $tab === 'privacy' ? 'nav-tab-active' : ''; ?>">
                    <?php esc_html_e('Integritetspolicy', 'maca-restu-pro'); ?>
                </a>
            </nav>

            <div class="maca-legal-document">
                <?php
                if ($tab === 'privacy') {
                    echo $privacy_html !== '' ? wp_kses_post($privacy_html) : '<p>' . esc_html__('Integritetspolicyfilen hittades inte.', 'maca-restu-pro') . '</p>';
                } else {
                    echo $terms_html !== '' ? wp_kses_post($terms_html) : '<p>' . esc_html__('Villkorsfilen hittades inte.', 'maca-restu-pro') . '</p>';
                }
                ?>
            </div>

            <?php if (!$accepted) : ?>
                <form method="post" action="" class="maca-legal-accept-form">
                    <?php wp_nonce_field('maca_legal_accept', 'maca_legal_nonce'); ?>
                    <input type="hidden" name="maca_legal_action" value="accept" />

                    <h2><?php esc_html_e('Godkänn för att fortsätta', 'maca-restu-pro'); ?></h2>
                    <p><?php esc_html_e('Genom att kryssa i båda rutorna nedan bekräftar du att du har läst och godkänner för din organisations räkning.', 'maca-restu-pro'); ?></p>

                    <p>
                        <label>
                            <input type="checkbox" name="maca_legal_accept_terms" value="1" required />
                            <?php esc_html_e('Jag godkänner användarvillkoren för maca Restu Pro.', 'maca-restu-pro'); ?>
                        </label>
                    </p>
                    <p>
                        <label>
                            <input type="checkbox" name="maca_legal_accept_privacy" value="1" required />
                            <?php esc_html_e('Jag godkänner integritetspolicyn för maca Restu Pro.', 'maca-restu-pro'); ?>
                        </label>
                    </p>

                    <?php submit_button(__('Godkänn och aktivera plugin', 'maca-restu-pro'), 'primary', 'submit', false); ?>
                </form>
            <?php endif; ?>
        </div>
        <?php
    }

    /**
     * Whether the current request targets maca Restu admin.
     *
     * @return bool
     */
    private function is_maca_menulist_admin_request() {
        return maca_menulist_is_maca_restu_admin_screen();
    }
}
