<?php

declare(strict_types=1);

namespace App\Module\Core\Domain\Security;

use App\Module\Core\Domain\Entity\User;
use App\Module\Core\Domain\Exception\LastAdminProtectionException;

/**
 * Contrat du gardien de l'invariant "au moins un admin sur l'instance".
 *
 * Separer l'interface de l'implementation permet de tester unitairement
 * les processors qui dependent de ce garde sans instancier le repository.
 */
interface AdminHeadcountGuardInterface
{
    /**
     * Verifie qu'il restera au moins un admin apres la demote de $user.
     *
     * @throws LastAdminProtectionException si le seuil minimum serait franchi
     */
    public function ensureAtLeastOneAdminRemainsAfterDemotion(User $user): void;

    /**
     * Verifie qu'il restera au moins un admin apres la suppression de $user.
     *
     * @throws LastAdminProtectionException si le seuil minimum serait franchi
     */
    public function ensureAtLeastOneAdminRemainsAfterDeletion(User $user): void;
}
