<?php

namespace App\Core\Ssl;

/**
 * SSL provider modülleri için discovery registry'si (PRC-57).
 *
 * `module.json` `type=ssl` olan provider'lar `ModuleServiceProvider` boot'ta
 * buraya kaydedilir. Hem ACME tabanlı (Let's Encrypt) hem commercial reseller
 * (Comodo, Sectigo, DigiCert) modülleri aynı registry'de yaşar — fark
 * `requiresCustomerInput()` flag'iyle yönetilir.
 *
 * Storage tipi `AbstractSsl` — bu sınıf SSL-spesifik contract metodlarına
 * sahip (createAccount/installCertificate/customerInputSchema/...).
 */
class SslManager
{
    /** @var array<string, AbstractSsl> */
    protected array $modules = [];

    public function register(string $name, AbstractSsl $module): void
    {
        $this->modules[$name] = $module;
    }

    /**
     * @throws \Exception Modül bulunamazsa
     */
    public function get(string $name): AbstractSsl
    {
        if (! isset($this->modules[$name])) {
            throw new \Exception("SSL modülü bulunamadı: {$name}");
        }

        return $this->modules[$name];
    }

    /**
     * @return array<string, AbstractSsl>
     */
    public function getAll(): array
    {
        return $this->modules;
    }

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