<?php
/**
 * Manage imports from lifterlms.com export API
 *
 * @package LifterLMS/Admin/Classes
 *
 * @since 4.8.0
 * @version 4.8.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * LLMS_Export API Class
 *
 * @since 4.8.0
 */
class LLMS_Export_API {

	/**
	 * Make an GET request to the exports API
	 *
	 * @since 4.8.0
	 *
	 * @param array $args Array of query string arguments formatted as an associative array.
	 * @return array|WP_Error
	 */
	protected static function call_api( $args ) {

		/**
		 * Filter the url used to make requests to the LifterLMS.com "exports" api.
		 *
		 * @since 4.8.0
		 *
		 * @param string $url API request url.
		 */
		$base_url = apply_filters(
			'llms_export_api_url',
			'https://academy.lifterlms.com/wp-json/llms-academy/v1/exports'
		);

		$req  = wp_safe_remote_get(
			add_query_arg( $args, $base_url ),
			array(
				'timeout' => 15,
			)
		);
		$body = json_decode( wp_remote_retrieve_body( $req ), true );
		if ( 200 === wp_remote_retrieve_response_code( $req ) ) {
			return $body;
		}

		// If there's a body it's a json encoded error object, otherwise it's already an error object.
		return $body && ! empty( $body['code'] ) ? new WP_Error( $body['code'], $body['message'], $body['data'] ) : $req;

	}

	/**
	 * Retrieve an import array by export IDs.
	 *
	 * @since 4.8.0
	 *
	 * @param int[] $ids Array of export IDs.
	 * @return array|WP_Error
	 */
	public static function get( $ids ) {

		$ids = implode( ',', array_map( 'absint', $ids ) );
		return self::call_api( compact( 'ids' ) );

	}


	/**
	 * Retrieve a list of available exports
	 *
	 * @since 4.8.0
	 *
	 * @param int $page     Results page.
	 * @param int $per_page Results per page.
	 * @return array[]|WP_Error
	 */
	public static function list( $page = 1, $per_page = 10 ) {
		return self::call_api( compact( 'page', 'per_page' ) );
	}

}