<?php

namespace App\Core\Vm;

use App\Core\Product\ProductInterface;

/**
 * VM-tipinde modüllerin discovery registry'si.
 *
 * `module.json` `type=vm` olan provider'lar `ModuleServiceProvider` boot'ta
 * buraya kaydedilir. Admin UI "VM Providers" listesi + ProductProvisioning'in
 * `paramSchema() !== []` schema-driven mapping pipeline'ı bu registry'yi
 * kullanır.
 *
 * Storage tipi `ProductInterface` — VM modüllerinin kendileri zaten
 * AbstractVm → AbstractProduct → ProductInterface'i implement ediyor.
 */
class VmManager
{
    /** @var array<string, ProductInterface> */
    protected array $modules = [];

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

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

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

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

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