<?php
// Permite acesso direto APENAS se for o robô do CronJob (cPanel) chamando
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__) && !isset($_GET['cron'])) { exit; }

if (isset($_GET['cron']) && $_GET['cron'] == '1') {
    require_once 'conexao.php';
}

@ini_set('memory_limit', '1024M');
@set_time_limit(0);
@ignore_user_abort(true);

// --- FUNÇÃO INTELIGENTE PARA LER AS CREDENCIAIS DO CONEXAO.PHP ---
function extrairCredenciaisDB() {
    $caminho_conexao = __DIR__ . '/conexao.php';
    if (!file_exists($caminho_conexao)) return [];

    $conteudo = file_get_contents($caminho_conexao);
    $bancos = [];

    // MODO 1: Leitura do novo padrão (Com variáveis $db_geral_nome = '...')
    if (preg_match('/\$db_geral_nome\s*=\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $mGeralNome) &&
        preg_match('/\$db_geral_user\s*=\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $mGeralUser) &&
        preg_match('/\$db_geral_pass\s*=\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $mGeralPass)) {
        
        $bancos[] = ['id' => 'GERAL', 'nome' => $mGeralNome[1], 'user' => $mGeralUser[1], 'pass' => $mGeralPass[1]];
        
        preg_match('/\$db_user_nome\s*=\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $mUserNome);
        preg_match('/\$db_user_user\s*=\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $mUserUser);
        preg_match('/\$db_user_pass\s*=\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $mUserPass);
        $bancos[] = ['id' => 'USER', 'nome' => $mUserNome[1], 'user' => $mUserUser[1], 'pass' => $mUserPass[1]];

        preg_match('/\$db_acessos_nome\s*=\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $mAcessosNome);
        preg_match('/\$db_acessos_user\s*=\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $mAcessosUser);
        preg_match('/\$db_acessos_pass\s*=\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $mAcessosPass);
        $bancos[] = ['id' => 'ACESSOS', 'nome' => $mAcessosNome[1], 'user' => $mAcessosUser[1], 'pass' => $mAcessosPass[1]];

        return $bancos;
    }

    // MODO 2: Leitura do padrão antigo (PDO direto mysql:host=localhost;dbname=...)
    if (preg_match('/\$connGeral.*?dbname=([^;]+).*?[\'"]([^\'"]+)[\'"]\s*,\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $matches)) {
        $bancos[] = ['id' => 'GERAL', 'nome' => trim($matches[1]), 'user' => trim($matches[2]), 'pass' => trim($matches[3])];
    }
    if (preg_match('/\$connUser.*?dbname=([^;]+).*?[\'"]([^\'"]+)[\'"]\s*,\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $matches)) {
        $bancos[] = ['id' => 'USER', 'nome' => trim($matches[1]), 'user' => trim($matches[2]), 'pass' => trim($matches[3])];
    }
    if (preg_match('/\$connAcessos.*?dbname=([^;]+).*?[\'"]([^\'"]+)[\'"]\s*,\s*[\'"]([^\'"]+)[\'"]/i', $conteudo, $matches)) {
        $bancos[] = ['id' => 'ACESSOS', 'nome' => trim($matches[1]), 'user' => trim($matches[2]), 'pass' => trim($matches[3])];
    }

    return $bancos;
}
// ------------------------------------------------------------------

function gerarBackupCompleto($tipo = 'Manual') {
    global $connGeral; 

    // Extrai as configurações diretamente do conexao.php usando a função inteligente
    $config_bancos = extrairCredenciaisDB();

    // Se por acaso a leitura falhar, aborta para não gerar erro fatal.
    if(empty($config_bancos)) return "Erro ao ler as configurações do Banco de Dados no conexao.php.";

    $db_host = 'localhost';
    
    $modo_vps = function_exists('exec') && !in_array('exec', array_map('trim', explode(',', ini_get('disable_functions'))));

    $pasta_backups = __DIR__ . "/backups/";
    if (!is_dir($pasta_backups)) { @mkdir($pasta_backups, 0777, true); }
    @chmod($pasta_backups, 0777);

    $sucesso_algum = false; 
    $retornos_nuvem = "";

    foreach ($config_bancos as $info_db) {
        $dbname = $info_db['nome'];
        $dbuser = $info_db['user'];
        $dbpass = $info_db['pass'];
        $tag    = $info_db['id'];
        
        $data_hora      = date('d-m-Y_H-i-s');
        $nome_sql_temp  = $pasta_backups . strtolower($tag) . ".sql";
        $nome_zip_final = "Backup_" . ucfirst(strtolower($tag)) . "_{$data_hora}.zip";
        $caminho_zip    = $pasta_backups . $nome_zip_final;

        $sql_gerado = false;

        // Na VPS usa mysqldump (muito mais rápido)
        if ($modo_vps) {
            $cmd = "mysqldump --no-tablespaces --single-transaction -h'$db_host' -u'$dbuser' -p'$dbpass' '$dbname' > '$nome_sql_temp' 2>&1";
            exec($cmd, $output, $return_var);
            if ($return_var === 0 && file_exists($nome_sql_temp) && filesize($nome_sql_temp) > 0) {
                $sql_gerado = true;
            }
        }

        // Se falhar na VPS ou estiver em Hospedagem (cPanel), usa o PHP nativo
        if (!$sql_gerado) {
            $sql_gerado = exportarSqlPhp($db_host, $dbuser, $dbpass, $dbname, $nome_sql_temp);
        }

        if ($sql_gerado && file_exists($nome_sql_temp)) {
            if(class_exists('ZipArchive')) {
                $zip = new ZipArchive();
                if ($zip->open($caminho_zip, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
                    $zip->addFile($nome_sql_temp, strtolower($tag) . ".sql");
                    $zip->close();
                    @unlink($nome_sql_temp); 
                    
                    @chmod($caminho_zip, 0777); // Dá permissão no arquivo Zip também

                    registrarBackupNoBanco($tipo, $tag, $nome_zip_final, $caminho_zip, $config_bancos);
                    $sucesso_algum = true;

                    // Envia para o Telegram e guarda a resposta
                    $res = enviarParaTelegramPhp($caminho_zip, $nome_zip_final, $tag);
                    $retornos_nuvem .= "<br><b>[$tag] Telegram:</b> " . htmlspecialchars($res);
                }
            } else {
                return "Erro Crítico: A extensão 'ZipArchive' não está ativada no seu PHP.";
            }
        }
    }

    if($sucesso_algum) {
        return "Concluído!" . $retornos_nuvem; // Retorna os avisos para mostrar na tela
    } else {
        return false;
    }
}

function exportarSqlPhp($host, $user, $pass, $name, $arquivo_saida) {
    try {
        $pdo = new PDO("mysql:host=$host;dbname=$name;charset=utf8mb4", $user, $pass);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (Exception $e) { return false; }

    $f = fopen($arquivo_saida, 'w+');
    if (!$f) return false;

    fwrite($f, "-- BACKUP PHP: $name \n\n");
    $tabelas = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
    foreach ($tabelas as $tab) {
        $create = $pdo->query("SHOW CREATE TABLE `$tab`")->fetch(PDO::FETCH_NUM);
        fwrite($f, "DROP TABLE IF EXISTS `$tab`;\n");
        fwrite($f, $create[1] . ";\n\n");

        $rows = $pdo->query("SELECT * FROM `$tab`");
        while ($row = $rows->fetch(PDO::FETCH_ASSOC)) {
            $vals = [];
            foreach ($row as $val) {
                $vals[] = is_null($val) ? "NULL" : "'" . addslashes($val) . "'";
            }
            fwrite($f, "INSERT INTO `$tab` VALUES(" . implode(",", $vals) . ");\n");
        }
        fwrite($f, "\n");
    }
    fclose($f);
    return true;
}

function registrarBackupNoBanco($tipo, $tag, $nome_arquivo, $caminho_completo, $configs) {
    global $connGeral;
    
    // Tenta encontrar o banco GERAL dentro das configurações pescadas dinamicamente
    $db_geral_info = null;
    foreach($configs as $c) {
        if($c['id'] == 'GERAL') { $db_geral_info = $c; break; }
    }
    
    if (!isset($connGeral) && $db_geral_info) {
        try {
            $connGeral = new PDO("mysql:host=localhost;dbname={$db_geral_info['nome']}", $db_geral_info['user'], $db_geral_info['pass']);
        } catch (Exception $e) { return; }
    }
    
    if(!$connGeral) return;
    
    $tamanho = filesize($caminho_completo);
    $tamanho_fmt = ($tamanho > 1048576) ? round($tamanho/1048576, 2)." MB" : round($tamanho/1024, 2)." KB";
    $tipo_desc = $tipo . ' (' . ucfirst(strtolower($tag)) . ')';

    try {
        $stmt = $connGeral->prepare("INSERT INTO arquivo_backup (tipo, local, data, size) VALUES (?, ?, NOW(), ?)");
        $stmt->execute([$tipo_desc, $nome_arquivo, $tamanho_fmt]);
    } catch (Exception $e) { }
}

// =========================================================================
// MOTOR DE UPLOAD PARA O TELEGRAM
// =========================================================================
function enviarParaTelegramPhp($caminho_arquivo, $nome_arquivo, $tag) {
    global $connGeral;
    if (!isset($connGeral)) return "Erro no BD local.";

    try {
        $config = $connGeral->query("SELECT nuvem_status, nuvem_token, nuvem_pasta FROM backup_automatizado WHERE id=1 LIMIT 1")->fetch(PDO::FETCH_ASSOC);
    } catch (Exception $e) { return "Erro ao ler config."; }

    if (!$config || $config['nuvem_status'] !== 'ativo' || empty($config['nuvem_token'])) {
        return "Envio desativado no painel.";
    }

    $bot_token = trim($config['nuvem_token']);
    $chat_id = trim($config['nuvem_pasta']);

    $url = "https://api.telegram.org/bot" . $bot_token . "/sendDocument";
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    
    if (function_exists('curl_file_create')) {
        $cfile = curl_file_create($caminho_arquivo);
    } else {
        $cfile = '@' . realpath($caminho_arquivo);
    }
    
    $mensagem = "✅ *Backup Automático* - [ " . strtoupper($tag) . " ]\n\n📦 *Arquivo:* `" . $nome_arquivo . "`\n⏰ *Data:* " . date('d/m/Y H:i:s');

    $post_fields = array(
        'chat_id' => $chat_id,
        'document' => $cfile,
        'caption' => $mensagem,
        'parse_mode' => 'Markdown'
    );
    
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    $resposta = curl_exec($ch);
    $erro_curl = curl_error($ch);
    curl_close($ch);

    if($erro_curl) return "Erro cURL: " . $erro_curl;
    
    $res_json = json_decode($resposta, true);
    if(isset($res_json['ok']) && $res_json['ok'] == true) {
        return "Enviado com sucesso para o Telegram!";
    } else {
        return "Falha Telegram: " . ($res_json['description'] ?? 'Erro desconhecido');
    }
}

// =========================================================================
// GATILHO DO CRON JOB
// =========================================================================
if (isset($_GET['cron']) && $_GET['cron'] == '1') {
    global $connGeral;
    if (isset($connGeral)) {
        $auto = $connGeral->query("SELECT * FROM backup_automatizado WHERE id=1")->fetch(PDO::FETCH_ASSOC);
        
        if ($auto && $auto['status'] == 'ativo') {
            $hora_atual = date('H'); 
            $hora_config = date('H', strtotime($auto['horario'])); 
            $frequencia = $auto['tempo']; 
            $dia_semana = date('w'); 

            $deve_rodar = false;

            if ($frequencia == 'diario' && $hora_atual == $hora_config) {
                $deve_rodar = true;
            } elseif ($frequencia == '12h' && ($hora_atual == $hora_config || $hora_atual == ($hora_config + 12) % 24)) {
                $deve_rodar = true;
            } elseif ($frequencia == '6h' && ($hora_atual % 6 == $hora_config % 6)) {
                $deve_rodar = true;
            } elseif ($frequencia == 'semanal' && $dia_semana == 0 && $hora_atual == $hora_config) { 
                $deve_rodar = true;
            }

            if ($deve_rodar || isset($_GET['forcar'])) {
                $log = gerarBackupCompleto('Automático');
                echo "<h3>Processo Finalizado!</h3>" . $log;
            } else {
                echo "Não é hora de rodar o backup. Hora atual: $hora_atual | Configurado para: $hora_config";
            }
        } else {
            echo "Automação desativada no painel.";
        }
    }
    exit;
}
?>