<?php

namespace App\Shared\Event\MessageHandler;

use App\Shared\Event\Message\DomainEventMessage;
use Psr\Log\LoggerInterface;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;

/**
 * درزِ اتصال مصرف‌کننده‌ها.
 *
 * خودش کاری جز ثبت لاگ نمی‌کند و **نباید بکند**: پیامک، حسابداری و گزارش هر کدام
 * مصرف‌کنندهٔ خودشان را کنار این ثبت می‌کنند. وجودش لازم است چون messenger پیامِ
 * بدون handler را خطا می‌دهد، و آن خطا در صندوق خروجی به‌عنوان «شکست انتشار» ثبت
 * می‌شد — یعنی یک ایراد پیکربندی، شبیه یک رویداد گم‌شده به نظر می‌رسید.
 *
 * مصرف‌کنندهٔ تازه باید **idempotent** باشد: messenger ممکن است پیام را دوباره تحویل
 * بدهد و `DomainEventMessage::$uuid` همان شناسه‌ای است که با آن تکراری را می‌شناسد.
 */
#[AsMessageHandler]
final class DomainEventHandler
{
    public function __construct(
        private readonly LoggerInterface $logger,
    ) {}

    public function __invoke(DomainEventMessage $message): void
    {
        $this->logger->info('domain event published', [
            'uuid'        => $message->uuid,
            'name'        => $message->name,
            'entity_type' => $message->entityType,
            'entity_id'   => $message->entityId,
        ]);
    }
}
