<?php

declare(strict_types=1);

namespace App\Framework\Database\Notifications;

/**
 * Value Object für empfangene PostgreSQL NOTIFY Nachricht
 */
final readonly class Notification
{
    public function __construct(
        public Channel $channel,
        public NotificationPayload $payload,
        public int $pid
    ) {}

    /**
     * Erstellt eine Notification aus PDO notification array
     *
     * @param array{message: string, pid: int, channel?: string} $notification
     */
    public static function fromPdoNotification(array $notification): self
    {
        // PDO gibt ein Array mit 'message' (channel), 'payload' und 'pid' zurück
        // Bei älteren PDO-Versionen heißt das Feld 'channel' nicht 'message'
        $channelName = $notification['channel'] ?? $notification['message'] ?? '';
        $payload = $notification['payload'] ?? '';

        return new self(
            channel: Channel::fromString($channelName),
            payload: NotificationPayload::fromString($payload),
            pid: $notification['pid']
        );
    }

    /**
     * Gibt den Channel-Namen zurück
     */
    public function getChannelName(): string
    {
        return $this->channel->name;
    }

    /**
     * Gibt das Payload als String zurück
     */
    public function getPayloadString(): string
    {
        return $this->payload->toString();
    }

    /**
     * Gibt das Payload als Array zurück (wenn JSON)
     *
     * @return array<mixed>|null
     */
    public function getPayloadArray(): ?array
    {
        return $this->payload->toArray();
    }

    /**
     * Gibt die Process-ID des sendenden Prozesses zurück
     */
    public function getSenderPid(): int
    {
        return $this->pid;
    }
}
