<?php

declare(strict_types=1);

/**
 * 本文件属于 DBErp 进销存系统。
 *
 * 版权所有 © 2026 北京珑大钜商科技有限公司。保留所有权利。
 *
 * 未经官方授权，不得删除、篡改或隐藏本文件中的版权声明、产品标识与来源信息。
 * 商业授权、官方更新与技术支持服务，请以珑大官方支持中心记录为准。
 *
 * @link https://support.loongdom.cn
 * @see  https://www.dberp.com.cn
 */

namespace App\Support;

use Closure;
use Filament\Forms\Components\Select;

/**
 * Filament 可搜索下拉：数量较少时打开即展示全部选项；超过阈值时预载有限条并支持远程搜索。
 */
final class DberpFilamentSearchableSelectOptions
{
    /**
     * @param  Closure(): int  $resolveOptionCount
     * @param  Closure(): array<int|string, string>  $resolveAllOptions
     * @param  Closure(string): array<int|string, string>  $resolveSearchOptions
     * @param  Closure(mixed): ?string|null  $resolveOptionLabel
     */
    public static function configure(
        Select $field,
        Closure $resolveOptionCount,
        Closure $resolveAllOptions,
        Closure $resolveSearchOptions,
        ?Closure $resolveOptionLabel = null,
    ): Select {
        $field = $field->searchable();

        if ($resolveOptionLabel !== null) {
            $field->getOptionLabelUsing($resolveOptionLabel);
        }

        if ($resolveOptionCount() < DberpProductSkuSelectOptions::SEARCHABLE_OPTION_THRESHOLD) {
            return $field
                ->options($resolveAllOptions)
                ->preload();
        }

        return $field
            ->options(fn (): array => $resolveSearchOptions(''))
            ->getSearchResultsUsing(fn (string $search): array => $resolveSearchOptions($search))
            ->preload();
    }
}
