<?php

declare(strict_types=1);

namespace App\Services;

use Illuminate\Support\Collection;
use Random\Randomizer;

/**
 * Отбор получателей входящего лида: ≤ CAP случайных из eligible (sharing cap).
 *
 * cap=3 — защита владельца номера-донора (лид продаётся максимум 3 раза).
 * Eligible уже отфильтрован LeadRouter (есть остаток лимита) → отбор лимит не
 * превышает. Рандом через инъектируемый \Random\Randomizer (тесты сидируют
 * Mt19937 для детерминизма; прод — CSPRNG по умолчанию).
 *
 * Spec: docs/superpowers/specs/2026-05-20-project-migration-redesign-design.md §4.6.
 */
final class LeadDistributor
{
    public const CAP = 3;

    public function __construct(private readonly Randomizer $randomizer = new Randomizer) {}

    /**
     * @template T
     *
     * @param  Collection<int, T>  $eligible
     * @return Collection<int, T>
     */
    public function selectRecipients(Collection $eligible): Collection
    {
        $items = $eligible->values()->all();

        if (count($items) <= self::CAP) {
            return collect($items);
        }

        $keys = $this->randomizer->pickArrayKeys($items, self::CAP);

        return collect($keys)->map(fn (int $k) => $items[$k])->values();
    }
}
