<?php

namespace NoahVet\Reef\Application\Business;

use NoahVet\Reef\Domain\Business\Model\AbstractEntityWithTeam;

/**
 * Fournit la boucle de collecte par lot et yield pour les énumérateurs composites WithTeam.
 *
 * Les sous-classes appellent {@see enumerateBatched()} dans leur méthode enumerateAll(),
 * en passant la source d'entités de base, la taille du lot et un callable factory.
 */
abstract class AbstractWithTeamEnumerator
{
    /**
     * Itère $source par lots de $batchSize, passe chaque lot complet à $createBatch,
     * puis yield les modèles WithTeam résultants un par un.
     *
     * @param iterable<object>                                     $source
     * @param callable(list<object>): list<AbstractEntityWithTeam> $createBatch
     *
     * @return \Generator<AbstractEntityWithTeam>
     */
    protected function enumerateBatched(
        iterable $source,
        int $batchSize,
        callable $createBatch,
    ): \Generator {
        $batch = [];

        foreach ($source as $item) {
            $batch[] = $item;

            if (\count($batch) === $batchSize) {
                foreach ($createBatch($batch) as $result) {
                    yield $result;
                }
                $batch = [];
            }
        }

        if (!empty($batch)) {
            foreach ($createBatch($batch) as $result) {
                yield $result;
            }
        }
    }
}
