package com.zhengmeng.ocrplatform.engine;

import org.springframework.stereotype.Component;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@Component
public class OcrEngineRegistry {
    private final EngineProperties properties;
    private final OcrEngineRuntimeStateService runtimeStateService;
    private final Map<String, OcrEngineAdapter> adapters;

    public OcrEngineRegistry(EngineProperties properties,
                             OcrEngineRuntimeStateService runtimeStateService,
                             List<OcrEngineAdapter> adapters) {
        this.properties = properties;
        this.runtimeStateService = runtimeStateService;
        this.adapters = adapters.stream()
                .collect(Collectors.toUnmodifiableMap(OcrEngineAdapter::engineCode, Function.identity()));
    }

    public OcrEngineAdapter defaultAdapter() {
        return adapter(properties.defaultCode());
    }

    public OcrEngineAdapter adapter(String engineCode) {
        OcrEngineAdapter adapter = adapters.get(engineCode);
        if (adapter == null) {
            throw new OcrEngineNotFoundException(engineCode);
        }
        if (!isEnabled(engineCode)) {
            throw new OcrEngineNotFoundException(engineCode + " is disabled");
        }
        return adapter;
    }

    public List<OcrEngineAdapter> availableAdapters() {
        return adapters.values().stream()
                .sorted(Comparator.comparing(OcrEngineAdapter::engineCode))
                .toList();
    }

    public boolean isAvailable(String engineCode) {
        return adapters.containsKey(engineCode);
    }

    public boolean isEnabled(String engineCode) {
        return adapters.containsKey(engineCode) && runtimeStateService.isEnabled(engineCode, true);
    }
}
