<?php

namespace MintyPHP\App\Module;

use RuntimeException;

/**
 * Loads a single module manifest from disk without requiring the module to be enabled.
 *
 * Unlike ModuleRegistry (which only loads enabled modules), this loader can resolve
 * any module by its directory — used by validation and deactivation tooling.
 */
final class ModuleManifestLoader
{
    /**
     * Load and validate a module manifest from its on-disk location.
     *
     * @param string $modulesDir Absolute path to the modules/ directory
     * @param string $moduleId   Directory name / module ID
     *
     * @throws RuntimeException If the manifest file is missing or invalid
     */
    public static function loadFromDisk(string $modulesDir, string $moduleId): ModuleManifest
    {
        $manifestFile = rtrim($modulesDir, '/') . '/' . $moduleId . '/module.php';

        if (!is_file($manifestFile)) {
            throw new RuntimeException(
                "Module manifest not found at: {$manifestFile}"
            );
        }

        $raw = require $manifestFile;
        if (!is_array($raw)) {
            throw new RuntimeException(
                "Module manifest at '{$manifestFile}' must return an array."
            );
        }

        ModuleManifestSchemaValidator::assertValid($raw, $moduleId, $manifestFile);

        return ModuleManifest::fromArray($raw, dirname($manifestFile));
    }
}
