<?php

declare(strict_types=1);

class ApiResponse implements JsonSerializable
{
	public const STATUS_OK = 200;
	public const STATUS_FORBIDDEN = 403;
	public const STATUS_UNAUTHORIZED = 401;
	public const STATUS_BAD_REQUEST = 400;
	public const STATUS_NOT_FOUND = 404;
	public const STATUS_SERVER_ERROR = 500;

	public const MIME_TYPE_PLAINTEXT = 'text/plain';
	public const MIME_TYPE_JSON = 'application/json';
	public const MIME_TYPE_SVG = 'image/svg+xml';

	protected int $status = ServerStatus::OK;
	protected string $mimeType = MimeType::PLAINTEXT;
	protected array $parameters = [];

	public function __construct(int $status = ServerStatus::OK)
	{
		$this->setStatus($status);
	}

	public function setParameter(string $key, $value): void
	{
		$this->parameters[$key] = $value;
	}

	public function setStatus(int $status): void
	{
		$this->status = $status;
	}

	public function setMessage(string $message): void
	{
		$this->setParameter('message', $message);
	}

	public function setMimeType(string $mimeType): void
	{
		$this->mimeType = $mimeType;
	}

	public function setBody(JsonSerializable $data): void
	{
		$this->parameters = $data->jsonSerialize();
	}

	public function SetMessageIdNotFound(string $instanceName): void
	{
		$this->setMessage(sprintf('Die für %s angeforderte ID existiert nicht!', $instanceName));
	}

	public function getStatus(): int
	{
		return $this->status;
	}

	public function getMimeType(): string
	{
		return $this->mimeType;
	}

	public function jsonSerialize()
	{
		return $this->parameters;
	}

	public function respond(): void
	{
		http_response_code($this->status);
		header('Content-Type: ' . $this->mimeType);
	}
}