<?php

namespace CleantalkSP\SpbctWP\VulnerabilityAlarm;

use CleantalkSP\Variables\Get;

class PscCertifiedPluginsController
{
    const TAB_ID = 'security_certified';

    /**
     * @return void
     */
    public static function init()
    {
        add_filter('views_plugin-install', [self::class, 'addPluginInstallLink']);
    }

    /**
     * @param array<string, string> $views
     * @return array<string, string>
     * @psalm-suppress PossiblyUnusedReturnValue
     */
    public static function addPluginInstallLink($views)
    {
        if (! current_user_can('install_plugins')) {
            return $views;
        }

        $label = esc_html__('Security Certified', 'security-malware-firewall');
        $url = esc_url(self::getTabUrl());
        $link = '<a href="' . $url . '">' . $label . '</a>';

        $ordered = [];
        $inserted = false;

        foreach ($views as $key => $view) {
            $ordered[$key] = $view;
            if ($key === 'plugin-install-favorites') {
                $ordered['plugin-install-security_certified'] = $link;
                $inserted = true;
            }
        }

        if (! $inserted) {
            $ordered['plugin-install-security_certified'] = $link;
        }

        return $ordered;
    }

    /**
     * @return void
     */
    public static function ajaxRenderTab()
    {
        if (! current_user_can('install_plugins')) {
            wp_send_json_error(__('Insufficient permissions.', 'security-malware-firewall'), 403);
        }

        self::loadListTableDependencies();

        $page = max(1, (int) ($_POST['page'] ?? $_POST['paged'] ?? 1));
        $api_page = max(0, (int) ($_POST['api_page'] ?? 0));
        $append = ! empty($_POST['append']);
        $search = isset($_POST['search']) ? sanitize_text_field((string) $_POST['search']) : '';
        $filter = isset($_POST['filter']) && sanitize_text_field((string) $_POST['filter']) === SpbcPluginInstallListTable::FILTER_INSTALLED
            ? SpbcPluginInstallListTable::FILTER_INSTALLED
            : SpbcPluginInstallListTable::FILTER_ALL;

        if (! $append) {
            SpbcPluginInstallListTable::clearSession();
        }

        $_REQUEST['paged'] = $page;

        $list_table = self::createListTable($filter, $api_page, $search);
        $list_table->prepare_items();

        $response = [
            'page'     => $list_table->getNextPage(),
            'api_page' => $list_table->getNextApiPage(),
            'has_more' => $list_table->has_more(),
            'filter'   => $filter,
            'search'   => $search,
            'certified_last_month' => PscCertifiedPluginsCache::countCertifiedLastMonth(),
            'shown_count'          => PscCertifiedPluginsCache::countAll(),
        ];

        if ($append) {
            $response['rows_html'] = $list_table->get_rows_html();

            wp_send_json($response);
        }

        ob_start();
        self::renderListTable($list_table, $filter);
        $response['html'] = (string) ob_get_clean();

        wp_send_json($response);
    }

    /**
     * @return bool
     */
    public static function isActiveSettingsTab()
    {
        return Get::getString('spbc_tab') === self::TAB_ID;
    }

    /**
     * Enqueue plugin-install assets only when the Security Certified settings tab is active.
     *
     * @return void
     */
    public static function maybeEnqueueSettingsAssets()
    {
        if (! self::isActiveSettingsTab()) {
            return;
        }

        self::enqueueAssets();
    }

    /**
     * @return void
     */
    public static function enqueueAssets()
    {
        wp_enqueue_style('list-tables');
        wp_enqueue_style('themes');
        wp_enqueue_script('plugin-install');
        wp_enqueue_script('updates');
        add_thickbox();
    }

    /**
     * @return void
     */
    private static function loadListTableDependencies()
    {
        require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
        require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
        require_once ABSPATH . 'wp-admin/includes/class-wp-plugin-install-list-table.php';
    }

    /**
     * @param string $filter
     * @param int $api_page
     * @param string $search
     * @return SpbcPluginInstallListTable
     */
    private static function createListTable($filter = SpbcPluginInstallListTable::FILTER_ALL, $api_page = 0, $search = '')
    {
        self::loadListTableDependencies();

        $list_table = new SpbcPluginInstallListTable();
        $list_table->setFilter($filter);
        $list_table->setRequestedApiPage($api_page);
        $list_table->setSearch($search);

        return $list_table;
    }

    /**
     * @param SpbcPluginInstallListTable $list_table
     * @param string $filter
     * @return void
     */
    public static function renderListTable($list_table, $filter = SpbcPluginInstallListTable::FILTER_ALL)
    {
        if (! current_user_can('install_plugins')) {
            echo '<p>' . esc_html__('Sorry, you are not allowed to install plugins on this site.', 'security-malware-firewall') . '</p>';
            return;
        }

        echo '<div class="plugin-install-php spbc-psc-plugins-tab">';
        echo '<div class="wrap plugin-install-tab-popular">';
        self::renderFilterLinks($filter);
        echo '<form id="plugin-filter" method="post">';
        $list_table->display();
        echo '</form>';
        echo '</div>';
        echo '</div>';
    }

    /**
     * @param string $filter
     * @return void
     */
    private static function renderFilterLinks($current_filter)
    {
        $installed_count = PscCertifiedPluginsCache::countInstalled();

        $links = [
            SpbcPluginInstallListTable::FILTER_ALL       => __('All certified', 'security-malware-firewall'),
            SpbcPluginInstallListTable::FILTER_INSTALLED => sprintf(
                /* translators: %s: Number of certified plugins installed on this site. */
                __('Installed on this site (%s)', 'security-malware-firewall'),
                number_format_i18n($installed_count)
            ),
        ];

        echo '<div class="spbc-psc-plugins-tab__toolbar">';

        echo '<ul class="subsubsub spbc-psc-plugins-tab__filters">';

        $rendered = 0;
        foreach ($links as $filter => $label) {
            $is_current = $filter === $current_filter;
            $separator = ++$rendered < count($links) ? ' | ' : '';

            printf(
                '<li><a href="#" class="spbc-psc-plugins-tab__filter%s" data-spbc-psc-filter="%s"%s>%s</a>%s</li>',
                $is_current ? ' current' : '',
                esc_attr($filter),
                $is_current ? ' aria-current="page"' : '',
                esc_html($label),
                $separator
            );
        }

        echo '</ul>';

        printf(
            '<div class="spbc-psc-plugins-tab__search">'
            . '<input type="search" class="spbc-psc-plugins-tab__search-input" placeholder="%s" data-spbc-psc-search />'
            . '<button type="button" class="button spbc-psc-plugins-tab__search-btn" data-spbc-psc-search-submit>%s</button>'
            . '</div>',
            esc_attr__('Search plugins...', 'security-malware-firewall'),
            esc_html__('Search', 'security-malware-firewall')
        );

        echo '</div>';
    }

    /**
     * @return string
     */
    public static function getTabUrl()
    {
        $path = ( is_network_admin() ? 'settings.php' : 'options-general.php' ) . '?page=spbc&spbc_tab=' . self::TAB_ID;
        return is_network_admin() ? network_admin_url($path) : admin_url($path);
    }
}
