<?php
/**
 * Script para substituir acessos diretos a $_POST, $_GET, $_SESSION
 * por funções seguras que evitam warnings de undefined index.
 * 
 * Uso: php substituir_acessos_array.php
 */

// Configurações
$diretorio = __DIR__ . '/paineladm';  // ajuste se necessário
$backupDir = __DIR__ . '/backup_arrays_' . date('Ymd_His');

// Funções que serão adicionadas ao funcoes.php
$funcoesSeguras = "
// Funções de acesso seguro para evitar warnings de undefined index
if (!function_exists('post')) {
    function post(\$key, \$default = '') {
        return \$_POST[\$key] ?? \$default;
    }
}
if (!function_exists('get')) {
    function get(\$key, \$default = '') {
        return \$_GET[\$key] ?? \$default;
    }
}
if (!function_exists('session')) {
    function session(\$key, \$default = '') {
        return \$_SESSION[\$key] ?? \$default;
    }
}
";

/**
 * Substitui padrões no conteúdo do arquivo
 */
function substituirAcessos($conteudo) {
    // Padrões para $_POST, $_GET, $_SESSION com aspas simples ou duplas
    // Exemplo: $_POST['var'] -> post('var')
    $padroes = [
        '/(\$_POST)\[\s*[\'"]([^\'"]+)[\'"]\s*\]/' => 'post(\'$2\')',
        '/(\$_GET)\[\s*[\'"]([^\'"]+)[\'"]\s*\]/' => 'get(\'$2\')',
        '/(\$_SESSION)\[\s*[\'"]([^\'"]+)[\'"]\s*\]/' => 'session(\'$2\')',
    ];
    
    foreach ($padroes as $regex => $subst) {
        $conteudo = preg_replace($regex, $subst, $conteudo);
    }
    return $conteudo;
}

/**
 * Adiciona as funções seguras no arquivo funcoes.php (se não existirem)
 */
function adicionarFuncoesSeguras($caminhoFuncoes, $funcoesSeguras) {
    if (!file_exists($caminhoFuncoes)) {
        echo "Arquivo funcoes.php não encontrado em $caminhoFuncoes. Criando...\n";
        file_put_contents($caminhoFuncoes, "<?php\n" . $funcoesSeguras);
        return true;
    }
    
    $conteudo = file_get_contents($caminhoFuncoes);
    // Verifica se já existe a função post()
    if (strpos($conteudo, 'function post(') !== false) {
        echo "Funções seguras já estão presentes em funcoes.php.\n";
        return false;
    }
    
    // Insere as funções após o <?php
    if (strpos($conteudo, '<?php') === 0) {
        $novoConteudo = "<?php\n" . $funcoesSeguras . substr($conteudo, 5);
    } else {
        $novoConteudo = "<?php\n" . $funcoesSeguras . "\n" . $conteudo;
    }
    file_put_contents($caminhoFuncoes, $novoConteudo);
    echo "Funções seguras adicionadas ao funcoes.php.\n";
    return true;
}

/**
 * Percorre diretório recursivamente e aplica substituições
 */
function processarDiretorio($dir, $backupDir) {
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
    );
    
    $arquivosModificados = 0;
    foreach ($iterator as $arquivo) {
        if ($arquivo->getExtension() !== 'php') {
            continue;
        }
        $caminho = $arquivo->getPathname();
        
        // Pular pastas vendor, cache, backup
        if (strpos($caminho, '/vendor/') !== false ||
            strpos($caminho, '/cache/') !== false ||
            strpos($caminho, '/backup_') !== false) {
            continue;
        }
        
        $conteudoOriginal = file_get_contents($caminho);
        $novoConteudo = substituirAcessos($conteudoOriginal);
        
        if ($novoConteudo !== $conteudoOriginal) {
            // Criar backup
            $backupPath = $backupDir . '/' . str_replace($dir, '', $caminho);
            if (!is_dir(dirname($backupPath))) {
                mkdir(dirname($backupPath), 0777, true);
            }
            file_put_contents($backupPath, $conteudoOriginal);
            
            // Escrever novo conteúdo
            file_put_contents($caminho, $novoConteudo);
            echo "Modificado: $caminho\n";
            $arquivosModificados++;
        }
    }
    return $arquivosModificados;
}

// Execução principal
echo "Iniciando substituição de acessos a arrays superglobais...\n";

if (!is_dir($diretorio)) {
    die("Diretório não encontrado: $diretorio\n");
}

// Criar pasta de backup
mkdir($backupDir, 0777, true);
echo "Backup criado em: $backupDir\n";

// Processar arquivos
$total = processarDiretorio($diretorio, $backupDir);
echo "Total de arquivos modificados: $total\n";

// Adicionar funções seguras no funcoes.php
$caminhoFuncoes = $diretorio . '/funcoes.php';
adicionarFuncoesSeguras($caminhoFuncoes, $funcoesSeguras);

echo "Script concluído.\n";