<?php

namespace TablePress\PhpOffice\PhpSpreadsheet\Calculation\Web;

use TablePress\PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
use TablePress\PhpOffice\PhpSpreadsheet\Settings;
use TablePress\Psr\Http\Client\ClientExceptionInterface;

class Service
{
	/**
	 * WEBSERVICE.
	 *
	 * Returns data from a web service on the Internet or Intranet.
	 *
	 * Excel Function:
	 *        Webservice(url)
	 *
	 * @return string the output resulting from a call to the webservice
	 */
	public static function webService(string $url): string
	{
		$url = trim($url);
		if (strlen($url) > 2048) {
			return ExcelError::VALUE(); // Invalid URL length
		}

		if (!preg_match('/^http[s]?:\/\//', $url)) {
			return ExcelError::VALUE(); // Invalid protocol
		}

		// Get results from the webservice
		$client = Settings::getHttpClient();
		$requestFactory = Settings::getRequestFactory();
		$request = $requestFactory->createRequest('GET', $url);

		try {
			$response = $client->sendRequest($request);
		} catch (ClientExceptionInterface $exception) {
			return ExcelError::VALUE(); // cURL error
		}

		if ($response->getStatusCode() != 200) {
			return ExcelError::VALUE(); // cURL error
		}

		$output = $response->getBody()->getContents();
		if (strlen($output) > 32767) {
			return ExcelError::VALUE(); // Output not a string or too long
		}

		return $output;
	}

	/**
				 * URLENCODE.
				 *
				 * Returns data from a web service on the Internet or Intranet.
				 *
				 * Excel Function:
				 *        urlEncode(text)
				 *
				 * @return string the url encoded output
				 * @param mixed $text
				 */
				public static function urlEncode($text): string
	{
		if (!is_string($text)) {
			return ExcelError::VALUE();
		}

		return str_replace('+', '%20', urlencode($text));
	}
}
