<?php

declare(strict_types=1);

/*
 * This file is part of the VITICORE2 package.
 *
 * (c) CP Creation <web@cpcreation.fr>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace CpCreation\VitiCore\Bridge\Symfony\Bundle\Event;

/**
 * Classe abstraite DomainEvent.
 *
 * Représente un événement de domaine — un fait métier significatif
 * survenu dans le système, exprimé sous forme d’objet immuable.
 *
 * ## Objectif
 * Fournir une base commune à tous les événements de domaine :
 * - Enregistrer la date d’occurrence de l’événement ;
 * - Identifier si l’événement doit être dispatché par le système ;
 * - Servir de contrat commun pour les handlers d’événements.
 *
 * ## Exemple d’implémentation :
 * ```php
 * final class UserRegisteredEvent extends DomainEvent
 * {
 *     public function __construct(
 *         private readonly string $userId
 *     ) {
 *     }
 *
 *     public function userId(): string
 *     {
 *         return $this->userId;
 *     }
 * }
 * ```
 */
abstract class DomainEvent
{
    private const string DATE_FORMAT = 'Y-m-d H:i:s';
    private string $occurredOn;

    /**
     * @param string|null $occurredOn date et heure d’occurrence au format Y-m-d H:i:s
     */
    public function __construct(?string $occurredOn = null,
    ) {
        $this->occurredOn = $occurredOn
            ?? (new \DateTimeImmutable())->format(self::DATE_FORMAT);
    }

    /**
     * Retourne la date d’occurrence de l’événement.
     */
    public function occurredOn(): string
    {
        return $this->occurredOn;
    }
}
