<?php

namespace App\Appointment\Availability\Picker;

use App\Resource\Entity\ClinicResource;
use App\Shared\Time\TimeInterval;

/**
 * منبعی که بیشترین وقت آزاد را دارد — پخش بار.
 *
 * برخلاف `least_gap` که تقویم را فشرده می‌کند، این یکی عمداً پخش می‌کند: وقتی سه
 * اپراتور هم‌ارزند، کلینیکی که نمی‌خواهد یکی‌شان تمام روز کار کند و دو تا بیکار
 * بمانند همین را می‌خواهد.
 *
 * هر دو درست‌اند و انتخاب بینشان تصمیم کسب‌وکاری است، نه فنی.
 */
final class LeastLoadedPicker implements ResourcePicker
{
    public static function code(): string { return 'least_loaded'; }

    public static function label(): string { return 'پخش بار — منبعِ آزادتر زودتر'; }

    public function order(array $candidates, PickContext $context): array
    {
        $ordered = $candidates;

        usort(
            $ordered,
            fn (ClinicResource $a, ClinicResource $b): int
                => $this->freeMinutes($b, $context) <=> $this->freeMinutes($a, $context),
        );

        return $ordered;
    }

    private function freeMinutes(ClinicResource $resource, PickContext $context): int
    {
        $windows = $context->freeWindows[(int) $resource->getId()] ?? [];

        return array_sum(array_map(
            static fn (TimeInterval $w): int => intdiv($w->end - $w->start, 60),
            $windows,
        ));
    }
}
