<?php

namespace Technical\Integrations\Support;

use Technical\Integrations\Contracts\ActivityProvider;

/**
 * Registre des fournisseurs d'activités disponibles (Garmin/Strava/...).
 * Bindé en singleton par IntegrationsServiceProvider::register().
 *
 * Pour brancher un fournisseur externe : dans le boot() de sa propre couche
 * (ex functional/strava), appeler
 * `app(ProviderRegistry::class)->register(new StravaProvider(...))`.
 * La couche technical/integrations n'a alors jamais besoin de connaître ce fournisseur.
 */
class ProviderRegistry
{
    /** @var array<string, ActivityProvider> */
    private array $providers = [];

    /** Enregistre un fournisseur dans le registre, sous sa clé (ActivityProvider::key()). */
    public function register(ActivityProvider $provider): void
    {
        $this->providers[$provider->key()] = $provider;
    }

    /** Récupère un fournisseur par sa clé, ou null s'il n'est pas enregistré. */
    public function get(string $key): ?ActivityProvider
    {
        return $this->providers[$key] ?? null;
    }

    /**
     * Liste de tous les fournisseurs enregistrés.
     *
     * @return array<int, ActivityProvider>
     */
    public function all(): array
    {
        return array_values($this->providers);
    }

    /**
     * Liste des clés de tous les fournisseurs enregistrés.
     *
     * @return array<int, string>
     */
    public function keys(): array
    {
        return array_keys($this->providers);
    }
}
