package dev.lions.unionflow.server.payment.orchestration;

import dev.lions.unionflow.server.api.payment.PaymentProvider;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Any;
import jakarta.enterprise.inject.Instance;
import jakarta.inject.Inject;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

/**
 * Registry CDI des providers de paiement disponibles.
 * Résout dynamiquement le bon provider par son code.
 */
@ApplicationScoped
public class PaymentProviderRegistry {

    @Inject
    @Any
    Instance<PaymentProvider> providers;

    /**
     * Retourne le provider identifié par {@code code}.
     *
     * @throws UnsupportedOperationException si aucun provider n'est enregistré pour ce code
     */
    public PaymentProvider get(String code) {
        return StreamSupport.stream(providers.spliterator(), false)
                .filter(p -> p.getProviderCode().equalsIgnoreCase(code))
                .findFirst()
                .orElseThrow(() -> new UnsupportedOperationException(
                        "Provider de paiement non supporté : " + code));
    }

    /** Retourne tous les providers disponibles. */
    public List<PaymentProvider> getAll() {
        return StreamSupport.stream(providers.spliterator(), false)
                .collect(Collectors.toList());
    }

    /** Retourne les codes de tous les providers disponibles. */
    public List<String> getAvailableCodes() {
        return getAll().stream().map(PaymentProvider::getProviderCode).collect(Collectors.toList());
    }
}
