<?php
ini_set('memory_limit', '-1');
set_time_limit(0);

require_once __DIR__ . '/config.php';

$pdo = getConexaoAtiva();
$pdo_int = getConexaoInterna();

$pdo->exec("SET NAMES utf8mb4");
$pdo_int->exec("SET NAMES utf8mb4");

$config_painel = $pdo_int->query("SELECT * FROM painel_config LIMIT 1")->fetch(PDO::FETCH_ASSOC);

if (!$config_painel || empty($config_painel['telegram_ativo'])) {
    exit("Backup Telegram Desativado.\n");
}

// Verifica se o horário atual bate com o horário programado
$horario_programado = $config_painel['telegram_horario'] ?? '03:00';
$horario_atual = date('H:i');

// Permite execução manual se passar o parâmetro ?force=1 via Cron/URL
if ($horario_atual !== $horario_programado && !isset($_GET['force'])) {
    exit("Fora do horário programado ({$horario_programado}). Horário atual: {$horario_atual}\n");
}

$botToken = $config_painel['telegram_bot_token'];
$chatId   = $config_painel['telegram_chat_id'];
$nome_painel = !empty($config_painel['nome_painel']) ? $config_painel['nome_painel'] : 'TOP IPTV';

// Gera a Dump SQL
$tables = [];
$stmt = $pdo->query("SHOW TABLES");
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
    $tables[] = $row[0];
}

$sql_dump = "-- Backup Automático Telegram: " . $nome_painel . "\n";
$sql_dump .= "-- Data: " . date('d/m/Y H:i:s') . "\n\nSET FOREIGN_KEY_CHECKS=0;\n\n";

foreach ($tables as $table) {
    $sql_dump .= "DROP TABLE IF EXISTS `$table`;\n";
    $row2 = $pdo->query("SHOW CREATE TABLE `$table`")->fetch(PDO::FETCH_NUM);
    $sql_dump .= $row2[1] . ";\n\n";

    $stmt_data = $pdo->query("SELECT * FROM `$table`");
    $linhas = $stmt_data->fetchAll(PDO::FETCH_ASSOC);

    if (count($linhas) > 0) {
        foreach ($linhas as $row_data) {
            $keys = array_keys($row_data);
            $keys_str = "`" . implode("`, `", $keys) . "`";
            $values_str = "";
            foreach ($row_data as $v) {
                $values_str .= ($v === null) ? "NULL," : $pdo->quote($v) . ",";
            }
            $values_str = rtrim($values_str, ",");
            $sql_dump .= "INSERT INTO `$table` ($keys_str) VALUES ($values_str);\n";
        }
        $sql_dump .= "\n\n";
    }
}
$sql_dump .= "SET FOREIGN_KEY_CHECKS=1;\n";

// Salva Arquivo Temporário
$temp_dir = sys_get_temp_dir();
$prefixo = 'backup_' . preg_replace('/[^A-Za-z0-9_]/', '', str_replace(' ', '_', strtolower($nome_painel))) . '_' . date('Y-m-d_H-i');
$nome_sql = $prefixo . '.sql';
$caminho_sql = $temp_dir . '/' . $nome_sql;

file_put_contents($caminho_sql, $sql_dump);

// Compactação ZIP
$caminho_envio = $caminho_sql;
$nome_envio = $nome_sql;

if (class_exists('ZipArchive')) {
    $nome_zip = $prefixo . '.zip';
    $caminho_zip = $temp_dir . '/' . $nome_zip;
    $zip = new ZipArchive();
    if ($zip->open($caminho_zip, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
        $zip->addFile($caminho_sql, $nome_sql);
        $zip->close();
        @unlink($caminho_sql);
        $caminho_envio = $caminho_zip;
        $nome_envio = $nome_zip;
    }
}

// Envia via API do Telegram
$url = "https://api.telegram.org/bot{$botToken}/sendDocument";
$post_fields = [
    'chat_id' => $chatId,
    'caption' => "📦 *Backup Automático Concluído*\n\n⚙️ *Painel:* {$nome_painel}\n📅 *Data:* " . date('d/m/Y H:i:s') . "\n📁 *Arquivo:* {$nome_envio}",
    'parse_mode' => 'Markdown',
    'document' => new CURLFile($caminho_envio)
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:multipart/form-data"));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
$response = curl_exec($ch);
curl_close($ch);

@unlink($caminho_envio);
echo "Backup enviado com sucesso!\n";
