/home/smartbloks/.trash/extendify/app/Assist/Controllers/SupportArticlesController.php
<?php
/**
 * Controls Support Articles
 */

namespace Extendify\Assist\Controllers;

use Extendify\Http;

if (!defined('ABSPATH')) {
    die('No direct access.');
}

/**
 * The controller for fetching support articles
 */
class SupportArticlesController
{
    /**
     * Return support articles from source.
     *
     * @return \WP_REST_Response
     */
    public static function articles()
    {
        $response = Http::get('/support-articles');
        return new \WP_REST_Response(
            $response,
            wp_remote_retrieve_response_code($response)
        );
    }

    /**
     * Return support article categories from source.
     *
     * @return \WP_REST_Response
     */
    public static function categories()
    {
        $response = Http::get('/support-article-categories');
        return new \WP_REST_Response(
            $response,
            wp_remote_retrieve_response_code($response)
        );
    }

    /**
     * Return the search result from source documentation.
     *
     * @param \WP_REST_Request $request - The request.
     * @return \WP_REST_Response
     */
    public static function searchArticles(\WP_REST_Request $request)
    {
        $params = http_build_query([
            'search' => $request->get_param('search'),
            'per_page' => $request->get_param('per_page'),
            'offset' => $request->get_param('offset'),
        ]);

        $url = sprintf('https://wordpress.org/documentation/wp-json/wp/v2/articles?%s', $params);

        $response = \wp_remote_get($url);

        if (\is_wp_error($response)) {
            wp_send_json_error($response->get_error_message(), 404);
        }

        return new \WP_REST_Response(
            ['data' => json_decode(\wp_remote_retrieve_body($response), true)],
            \wp_remote_retrieve_response_code($response)
        );
    }

    /**
     * Return the selected support article from source.
     *
     * @param \WP_REST_Request $request - The request.
     * @return \WP_REST_Response
     */
    public static function article($request)
    {
        $url = add_query_arg(
            'slug',
            $request->get_param('slug'),
            'https://wordpress.org/documentation/wp-json/wp/v2/articles'
        );
        $response = \wp_remote_get($url);
        if (\is_wp_error($response)) {
            wp_send_json_error($response->get_error_message(), 404);
        }

        return new \WP_REST_Response(
            ['data' => json_decode(\wp_remote_retrieve_body($response), true)],
            \wp_remote_retrieve_response_code($response)
        );
    }

    /**
     * Return the data
     *
     * @return \WP_REST_Response
     */
    public static function get()
    {
        $data = get_option('extendify_assist_support_articles', []);
        return new \WP_REST_Response($data);
    }

    /**
     * Persist the data
     *
     * @param \WP_REST_Request $request - The request.
     * @return \WP_REST_Response
     */
    public static function store($request)
    {
        $data = json_decode($request->get_param('data'), true);
        update_option('extendify_assist_support_articles', $data);
        return new \WP_REST_Response($data);
    }

    /**
     * Attempts to find a redirect URL from the old docs site
     *
     * @param \WP_REST_Request $request - The request.
     * @return \WP_REST_Response
     */
    public static function getRedirect($request)
    {
        $url = 'https://wordpress.org' . $request->get_param('path');
        $response = \wp_remote_head($url);
        $location = \wp_remote_retrieve_header($response, 'location');
        if (\is_wp_error($response)) {
            wp_send_json_error(\__('Page not found', 'extendify'), 404);
        }

        // No redirect, we're done.
        if (empty($location)) {
            return new \WP_REST_Response(['data' => $url], 200);
        }

        // Keep going until no more redirects.
        $request->set_param('path', \wp_parse_url($location, PHP_URL_PATH));
        return self::getRedirect($request);
    }
}