mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-29 02:01:33 +00:00
49 lines
1.3 KiB
PHP
49 lines
1.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Services\NameFixing;
|
|
|
|
final class DonorMatchSelector
|
|
{
|
|
/**
|
|
* @param list<object> $donors
|
|
*/
|
|
public function select(array $donors, int $targetSize, int $tolerancePercent): ?object
|
|
{
|
|
if ($targetSize <= 0 || $donors === []) {
|
|
return null;
|
|
}
|
|
|
|
$eligible = [];
|
|
|
|
foreach ($donors as $donor) {
|
|
$donorSize = (int) ($donor->relsize ?? $donor->size ?? 0);
|
|
if ($donorSize <= 0) {
|
|
continue;
|
|
}
|
|
|
|
$difference = abs($donorSize - $targetSize);
|
|
$differencePercent = ($difference / $donorSize) * 100;
|
|
|
|
if ($differencePercent <= $tolerancePercent) {
|
|
$eligible[] = [
|
|
'donor' => $donor,
|
|
'difference' => $difference,
|
|
'id' => (int) ($donor->releases_id ?? $donor->id ?? PHP_INT_MAX),
|
|
];
|
|
}
|
|
}
|
|
|
|
if ($eligible === []) {
|
|
return null;
|
|
}
|
|
|
|
usort($eligible, static function (array $left, array $right): int {
|
|
return [$left['difference'], $left['id']] <=> [$right['difference'], $right['id']];
|
|
});
|
|
|
|
return $eligible[0]['donor'];
|
|
}
|
|
}
|