<?php

namespace App\Appointment\Availability\Picker;

use App\Resource\Entity\ClinicResource;

/**
 * همان منبعی که جلسهٔ قبل بود — ترجیح، نه الزام.
 *
 * بیمار دورهٔ لیزر ترجیح می‌دهد هر هشت جلسه را با همان اپراتور بگذراند. ولی اگر آن
 * اپراتور آزاد نباشد، **رزرو رد نمی‌شود**: به ترتیب پایه برمی‌گردد. اجبار به همان
 * منبع یعنی بیمار دو هفته منتظر بماند، و آن بدتر از عوض شدن اپراتور است.
 */
final class SameAsPreviousPicker implements ResourcePicker
{
    public function __construct(
        private readonly ResourcePicker $fallback = new LeastGapPicker(),
    ) {}

    public static function code(): string { return 'same_as_previous'; }

    public static function label(): string { return 'همان منبع جلسهٔ قبل — اگر آزاد باشد'; }

    public function order(array $candidates, PickContext $context): array
    {
        $base = $this->fallback->order($candidates, $context);

        if ($context->preferredResourceIds === []) {
            return $base;
        }

        $preferred = [];
        $rest      = [];

        foreach ($base as $candidate) {
            if (in_array((int) $candidate->getId(), $context->preferredResourceIds, true)) {
                $preferred[] = $candidate;
            } else {
                $rest[] = $candidate;
            }
        }

        return [...$preferred, ...$rest];
    }
}
