<?php

namespace App\Service;

use App\Entity\ActivityLog;
use App\Entity\ScanSession;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\SecurityBundle\Security;

/**
 * Écrit une entrée du journal d'audit (table activity_logs). L'auteur et la date
 * sont déterminés côté serveur. Best-effort : à appeler APRÈS le flush de
 * l'action métier ; un échec d'écriture du journal ne fait jamais échouer l'action.
 */
final class ActivityLogger
{
    public function __construct(
        private readonly EntityManagerInterface $em,
        private readonly Security $security,
        private readonly LoggerInterface $logger,
    ) {
    }

    /** @param array<string, mixed> $details */
    public function log(string $action, ?ScanSession $scan = null, array $details = []): void
    {
        try {
            $email = $this->security->getUser()?->getUserIdentifier() ?? 'system';
            $this->em->persist(new ActivityLog(
                $email,
                $action,
                $scan?->getId(),
                $scan?->getLabel(),
                $details,
            ));
            $this->em->flush();
        } catch (\Throwable $e) {
            $this->logger->error('Écriture du journal d\'audit impossible', ['action' => $action, 'exception' => $e]);
        }
    }
}
