<?php
/**
 * Script de Validação de Endpoints
 * 
 * Valida se todos os endpoints registrados têm controllers e métodos correspondentes
 */

require_once __DIR__ . '/../src/Autoloader.php';
Gestoreasy\Autoloader::register();

use Gestoreasy\Core\Routing\Router;
use Gestoreasy\Core\Module\ModuleManager;
use ReflectionClass;
use ReflectionMethod;

$modulesDir = __DIR__ . '/../modules';
$router = new Router();
$moduleManager = new ModuleManager($router);

echo "=== Validação de Endpoints ===\n\n";

// Carregar módulos
echo "Carregando módulos...\n";
$moduleManager->loadModules($modulesDir);

// Listar rotas registradas
$routes = $router->list();

echo "Total de rotas registradas: " . count($routes) . "\n\n";

$errors = [];
$warnings = [];
$success = [];

// Agrupar rotas por controller
$routesByController = [];

foreach ($routes as $route) {
    $handler = $route['handler'] ?? null;
    if (is_array($handler) && count($handler) === 2) {
        [$controllerClass, $method] = $handler;
        if (!isset($routesByController[$controllerClass])) {
            $routesByController[$controllerClass] = [];
        }
        $routesByController[$controllerClass][] = [
            'method' => $route['method'] ?? 'GET',
            'path' => $route['path'] ?? '',
            'handler_method' => $method
        ];
    }
}

// Validar cada controller
foreach ($routesByController as $controllerClass => $controllerRoutes) {
    echo "Validando controller: $controllerClass\n";
    
    // Verificar se a classe existe
    if (!class_exists($controllerClass)) {
        $errors[] = "Controller não existe: $controllerClass";
        echo "  ❌ ERRO: Classe não existe\n";
        continue;
    }
    
    // Verificar se os métodos existem
    try {
        $reflection = new ReflectionClass($controllerClass);
        $methods = $reflection->getMethods(ReflectionMethod::IS_PUBLIC);
        $methodNames = array_map(fn($m) => $m->getName(), $methods);
        
        foreach ($controllerRoutes as $route) {
            $methodName = $route['handler_method'];
            $path = $route['path'];
            $httpMethod = $route['method'];
            
            if (!in_array($methodName, $methodNames)) {
                $errors[] = "Método não existe: $controllerClass::$methodName (rota: $httpMethod $path)";
                echo "  ❌ ERRO: Método $methodName não existe\n";
            } else {
                $success[] = "$controllerClass::$methodName";
                echo "  ✅ Método $methodName existe\n";
            }
        }
    } catch (ReflectionException $e) {
        $errors[] = "Erro ao refletir classe $controllerClass: " . $e->getMessage();
        echo "  ❌ ERRO: " . $e->getMessage() . "\n";
    }
    
    echo "\n";
}

// Resumo
echo "=== Resumo ===\n";
echo "✅ Endpoints válidos: " . count($success) . "\n";
echo "❌ Erros encontrados: " . count($errors) . "\n";
echo "⚠️  Avisos: " . count($warnings) . "\n\n";

if (!empty($errors)) {
    echo "=== Erros Encontrados ===\n";
    foreach ($errors as $error) {
        echo "❌ $error\n";
    }
    echo "\n";
    exit(1);
}

if (!empty($warnings)) {
    echo "=== Avisos ===\n";
    foreach ($warnings as $warning) {
        echo "⚠️  $warning\n";
    }
    echo "\n";
}

echo "✅ Todos os endpoints estão válidos!\n";
exit(0);

