<?php

namespace MintyPHP\App\Module;

use MintyPHP\App\AppContainer;

/**
 * Resolve module-declared classes from DI first and only fall back to direct
 * instantiation when the class is not container-bound and has no required
 * constructor arguments.
 */
final class ModuleClassResolver
{
    public static function resolve(AppContainer $container, string $class): ?object
    {
        $class = trim($class);
        if ($class === '') {
            return null;
        }

        if ($container->has($class)) {
            try {
                $resolved = $container->get($class);
                return is_object($resolved) ? $resolved : null;
            } catch (\Throwable) {
                return null;
            }
        }

        if (!class_exists($class)) {
            return null;
        }

        try {
            $reflection = new \ReflectionClass($class);
            if (!$reflection->isInstantiable()) {
                return null;
            }

            $constructor = $reflection->getConstructor();
            if ($constructor !== null && $constructor->getNumberOfRequiredParameters() > 0) {
                return null;
            }

            return $reflection->newInstance();
        } catch (\Throwable) {
            return null;
        }
    }
}
