<?php

declare(strict_types=1);

namespace Ekdos\Auth;

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

/**
 * Das Cookie traegt nur die Sitzungskennung.
 *
 * Ohne Max-Age bleibt es ein reines Sitzungscookie: schliesst jemand den Browser
 * vollstaendig, ist beim naechsten Aufruf wieder eine Anmeldung noetig. Das war
 * schon in der Next.js-Fassung so und bleibt bewusst erhalten.
 */
final readonly class SessionCookie
{
    public function __construct(
        private string $name,
        private bool $secure,
    ) {}

    public function read(Request $request): string
    {
        $value = $request->getCookieParams()[$this->name] ?? '';

        return is_string($value) ? $value : '';
    }

    public function attach(Response $response, string $id): Response
    {
        return $response->withAddedHeader('Set-Cookie', $this->build($id, null));
    }

    public function clear(Response $response): Response
    {
        return $response->withAddedHeader('Set-Cookie', $this->build('', 0));
    }

    private function build(string $value, ?int $maxAge): string
    {
        $parts = [
            $this->name . '=' . $value,
            'Path=/',
            'HttpOnly',
            'SameSite=Strict',
        ];

        if ($this->secure) {
            $parts[] = 'Secure';
        }

        if ($maxAge !== null) {
            $parts[] = 'Max-Age=' . $maxAge;
        }

        return implode('; ', $parts);
    }
}
