<?php

declare(strict_types=1);

namespace Ekdos\Http\Middleware;

use Ekdos\Support\Json;
use Ekdos\Users\Permission;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface as Handler;
use Slim\Psr7\Response as Psr7Response;

/**
 * Ersetzt die frueheren Namensabfragen ("nur Sascha", "nur Svenja") durch ein Recht.
 * Die Meldung nennt das fehlende Recht, damit im Buero klar ist, wer helfen kann.
 */
final readonly class RequirePermission implements MiddlewareInterface
{
    public function __construct(private string $permission) {}

    public function process(Request $request, Handler $handler): Response
    {
        $session = SessionMiddleware::of($request);

        if ($session === null) {
            return Json::error(new Psr7Response(), 'Bitte erneut anmelden.', 401);
        }

        if (!$session->can($this->permission)) {
            return Json::error(
                new Psr7Response(),
                'Dafür fehlt die Berechtigung "' . Permission::label($this->permission) . '".',
                403,
            );
        }

        return $handler->handle($request);
    }
}
