<?php

namespace App\Billing\EventSubscriber;

use App\Billing\Event\InvoiceFinalized;
use App\Billing\Service\ClaimService;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;

/**
 * هر صورتحساب نهایی‌شده‌ی بیمه‌دار باید مطالبه داشته باشد، از هر مسیری که نهایی شده باشد.
 * خطا در این مرحله نباید نهایی‌شدن صورتحساب را برگرداند؛ فقط لاگ می‌شود.
 */
#[AsEventListener(event: InvoiceFinalized::class)]
class CreateClaimsOnInvoiceFinalized
{
    public function __construct(
        private readonly ClaimService    $claimService,
        private readonly LoggerInterface $logger,
    ) {}

    public function __invoke(InvoiceFinalized $event): void
    {
        try {
            $this->claimService->syncFromInvoice($event->invoice);
        } catch (\Throwable $e) {
            $this->logger->error('claim sync failed', [
                'invoice' => $event->invoice->getUuid(),
                'error'   => $e->getMessage(),
            ]);
        }
    }
}
