<?php

namespace App\Appointment\Availability\Picker;

use Symfony\Component\DependencyInjection\Attribute\AutowireIterator;

/**
 * حل استراتژی از روی کلیدِ ذخیره‌شده در تنظیمات محیط.
 *
 * کلید ناشناخته **خطا نمی‌دهد** و به پیش‌فرض برمی‌گردد: تنظیماتی که با نسخهٔ قدیمی
 * ذخیره شده نباید نوبت‌دهی یک کلینیک را بخواباند. اعتبارسنجی جای خودش هنگام ذخیره است.
 */
final class ResourcePickerRegistry
{
    /** @var array<string, ResourcePicker> */
    private array $byCode = [];

    /** @param iterable<ResourcePicker> $pickers */
    public function __construct(
        #[AutowireIterator('app.resource_picker')] iterable $pickers,
    ) {
        foreach ($pickers as $picker) {
            $this->byCode[$picker::code()] = $picker;
        }
    }

    public function get(?string $code): ResourcePicker
    {
        return $this->byCode[$code ?? ''] ?? $this->byCode[FirstAvailablePicker::code()];
    }

    public function has(string $code): bool
    {
        return isset($this->byCode[$code]);
    }

    /** @return list<array{code: string, label: string}> ورودی انتخابگر پنل */
    public function describe(): array
    {
        $out = [];

        foreach ($this->byCode as $code => $picker) {
            $out[] = ['code' => $code, 'label' => $picker::label()];
        }

        return $out;
    }
}
