<?php

declare(strict_types=1);

namespace App\Administration\Domain\Policy;

use App\Shared\Domain\Clock;
use DateTimeImmutable;

/**
 * Policy déterminant si le consentement parental est requis.
 *
 * Conformément au RGPD (NFR-C1), le consentement parental est obligatoire
 * pour les utilisateurs de moins de 15 ans.
 */
final readonly class ConsentementParentalPolicy
{
    private const int AGE_MAJORITE_NUMERIQUE = 15;

    public function __construct(
        private Clock $clock,
    ) {
    }

    /**
     * Vérifie si le consentement parental est requis pour un utilisateur
     * né à la date spécifiée.
     */
    public function estRequis(?DateTimeImmutable $dateNaissance): bool
    {
        if ($dateNaissance === null) {
            return false;
        }

        return $this->calculerAge($dateNaissance) < self::AGE_MAJORITE_NUMERIQUE;
    }

    /**
     * Calcule l'âge en années à partir de la date de naissance.
     */
    private function calculerAge(DateTimeImmutable $dateNaissance): int
    {
        $now = $this->clock->now();
        $interval = $now->diff($dateNaissance);

        return $interval->y;
    }
}
