<?php
/**
 * Google Console Class
 *
 * Responsible for processing APIs for Google Console.
 *
 * @since 1.0.0
 * @package SureRank
 */

namespace SureRank\Inc\GoogleSearchConsole;

use SureRank\Inc\Functions\Requests;
use SureRank\Inc\Traits\Get_Instance;

/**
 * APIs Class
 *
 * Responsible for processing APIs for Google Console.
 *
 * @since 1.0.0
 */
class GoogleConsole {

	use Get_Instance;
	/**
	 * Instance object.
	 *
	 * @var self Class Instance.
	 */
	private static $instance = null;

	/**
	 * Get Header.
	 *
	 * @since 1.0.0
	 * @return array<string, string>
	 */
	public function get_header() {
		$credentials = Auth::get_instance()->get_credentials( null );
		return [
			'Authorization' => 'Bearer ' . ( $credentials['access_token'] ?? '' ),
			'Accept'        => 'application/json',
		];
	}

	/**
	 * Call API
	 *
	 * @since 1.0.0
	 * @param string                                  $endpoint Endpoint.
	 * @param string                                  $method Method.
	 * @param array<string, mixed>|array<int, string> $args Args.
	 * @return array<string, mixed>|array<int, array<string, mixed>>
	 */
	public function call_api( $endpoint, $method = 'GET', $args = [] ) {
		if ( ! Auth::get_instance()->auth_check() ) {
			wp_send_json_error(
				[
					'message' => __( 'Invalid credentials', 'surerank' ),
				]
			);
		}

		$request_args            = [];
		$request_args['headers'] = $this->get_header();
		$request_args['method']  = $method;
		$request_args['timeout'] = 30; // phpcs:ignore WordPressVIPMinimum.Performance.RemoteRequestTimeout.timeout_timeout

		switch ( strtoupper( $method ) ) {
			case 'POST':
			case 'PUT':
			case 'PATCH':
				$request_args['headers']['Content-Type'] = 'application/json';
				$request_args['body']                    = ! empty( $args ) ? (string) wp_json_encode( $args ) : '{}';
				break;
			case 'GET':
			case 'DELETE':
				if ( ! empty( $args ) ) {
					$endpoint = add_query_arg( $args, $endpoint );
				}
				break;
			default:
				break;
		}

		$response = Requests::request( $endpoint, $request_args );

		if ( is_wp_error( $response ) ) {
			return [
				'error'   => true,
				'message' => $response->get_error_message(),
				'code'    => $response->get_error_code(),
			];
		}

		$response_code    = wp_remote_retrieve_response_code( $response );
		$response_body    = wp_remote_retrieve_body( $response );
		$decoded_response = json_decode( $response_body, true );

		if ( $response_code >= 400 ) {

			$error         = $decoded_response['error'] ?? [];
			$error_message = $error['message'] ?? __( 'Unknown error', 'surerank' );

			return [
				'error'   => true,
				'message' => $error_message,
				'code'    => $response_code,
			];
		}

		return $decoded_response;
	}
}
