<?php

declare(strict_types=1);

final class Router
{
	private string $route;
	private string $method;
	private ?string $requestBody = null;
	private ?string $contentType = null;

	public function __construct(string $route, string $method)
	{
		$this->route = $route;
		$this->method = $method;
	}

	public function setRequestBody(string $contentType, string $content): void
	{
		$this->contentType = $contentType;
		$this->requestBody = $content;
	}

	public function route(): void
	{
		foreach (ROUTES[$this->method] as $route => $params) {
			preg_match_all($this->createRegex($route, $params['params']), $this->route, $matches);

			if (count($matches[0]) > 0) {
				$class = new ReflectionClass($params['controller']);

				/** @var AbstractController $controller */
				$controller = $class->newInstance($matches[0][0]);

				if ($this->requestBody !== null && $this->contentType !== null) {
					$controller->setRequestBody($this->contentType, $this->requestBody);
				}

				$controller->handle();
				$controller->getResponse()->respond();

				return;
			}
		}
	}

	private function createRegex(string $route, array $params): string
	{
		foreach ($params as $param => $values) {
			switch ($values['type']) {
				case 'int':
					$route = str_replace('{' . $param . '}', '[0-9]+', $route);
			}
		}

		return '/' . str_replace('/', '\\/', $route) . '/';
	}
}