<?php
/**
 * Get the User ID of a Goodreads account using its Author ID.
 *
 * @package automattic/jetpack
 */

/**
 * Goodreads block endpoint.
 */
class WPCOM_REST_API_V2_Endpoint_Goodreads extends WP_REST_Controller {
	/**
	 * Constructor.
	 */
	public function __construct() {
		add_action( 'rest_api_init', array( $this, 'register_routes' ) );
	}

	/**
	 * Register endpoint route.
	 */
	public function register_routes() {
		register_rest_route(
			'wpcom/v2',
			'/goodreads/user-id',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_goodreads_user_id' ),
					'permission_callback' => function () {
						return current_user_can( 'edit_posts' );
					},
					'args'                => array(
						'id' => array(
							'description'       => __( 'Goodreads user ID', 'jetpack' ),
							'type'              => 'integer',
							'required'          => true,
							'minimum'           => 1,
							'validate_callback' => function ( $param ) {
								return is_numeric( $param ) && (int) $param > 0;
							},
						),
					),
				),
			)
		);
	}

	/**
	 * Get the user ID from the author ID.
	 *
	 * @param \WP_REST_Request $request request object.
	 *
	 * @return \WP_Error|int Goodreads user ID (or 404 error if not found).
	 */
	public function get_goodreads_user_id( $request ) {
		$profile_id = $request->get_param( 'id' );
		$url        = 'https://www.goodreads.com/author/show/' . $profile_id;
		$response   = wp_remote_get( esc_url_raw( $url ) );
		$not_found  = new WP_Error( 'not_found', 'Goodreads user not found.', array( 'status' => 404 ) );

		if ( is_wp_error( $response ) ) {
			return $response;
		}

		$body    = wp_remote_retrieve_body( $response );
		$pattern = '/goodreads\.com\/user\/updates_rss\/(\d+)/';

		if ( preg_match( $pattern, $body, $matches ) ) {
			$user_id = intval( $matches[1] );
			return $user_id;
		}

		return $not_found;
	}
}

wpcom_rest_api_v2_load_plugin( 'WPCOM_REST_API_V2_Endpoint_Goodreads' );
