<?php
/**
 * Descargar / Limpiar backups - descargar.php
 * =============================================
 * ?file=subdominio.zip   -> Descarga un ZIP individual
 * ?todo=1                -> Empaqueta todos los ZIPs en uno y lo descarga
 * ?limpiar=1             -> Borra todos los ZIPs de respaldo/
 */

require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/config.php';

ini_set('memory_limit', MEMORY_LIMIT);

// Limite maximo para "Descargar TODO" (2 GB)
define('MAX_TODO_SIZE', 8 * 1024 * 1024 * 1024);

// ============================================================
// DESCARGA INDIVIDUAL
// ============================================================
if (isset($_GET['file'])) {
    $file = basename($_GET['file']); // Seguridad: solo nombre, sin rutas
    $filePath = BACKUP_DIR . '/' . $file;

    if (!file_exists($filePath) || pathinfo($file, PATHINFO_EXTENSION) !== 'zip') {
        http_response_code(404);
        die('Archivo no encontrado: ' . htmlspecialchars($file));
    }

    // Sin limite de tiempo para streaming de archivos grandes
    set_time_limit(0);

    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . $file . '"');
    header('Content-Length: ' . filesize($filePath));
    header('Cache-Control: no-cache, must-revalidate');
    readfile($filePath);
    exit;
}

// ============================================================
// DESCARGAR TODO (un ZIP con todos los ZIPs dentro)
// ============================================================
if (isset($_GET['todo'])) {
    if (!is_dir(BACKUP_DIR)) {
        http_response_code(404);
        die('No existe la carpeta de respaldo');
    }

    $zipFiles = glob(BACKUP_DIR . '/*.zip');
    if (empty($zipFiles)) {
        http_response_code(404);
        die('No hay archivos ZIP para descargar');
    }

    // Calcular tamano total antes de intentar
    $totalSize = 0;
    foreach ($zipFiles as $zf) {
        $totalSize += @filesize($zf) ?: 0;
    }

    if ($totalSize > MAX_TODO_SIZE) {
        $sizeGB = number_format($totalSize / 1073741824, 2);
        $limitGB = number_format(MAX_TODO_SIZE / 1073741824, 0);
        header('Location: estado.php?msg=' . urlencode("No se puede descargar todo: {$sizeGB} GB excede el limite de {$limitGB} GB. Use descarga individual o trabaje por grupos de letras."));
        exit;
    }

    set_time_limit(0);

    $megaZipName = 'backup_sie_' . date('Y-m-d_His') . '.zip';
    $megaZipPath = BACKUP_DIR . '/' . $megaZipName;

    $zip = new ZipArchive();
    $result = $zip->open($megaZipPath, ZipArchive::CREATE);
    if ($result !== true) {
        http_response_code(500);
        die('No se pudo crear el archivo ZIP consolidado');
    }

    foreach ($zipFiles as $zf) {
        $zip->addFile($zf, basename($zf));
    }
    $zip->close();

    // Enviar al navegador
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . $megaZipName . '"');
    header('Content-Length: ' . filesize($megaZipPath));
    header('Cache-Control: no-cache, must-revalidate');
    readfile($megaZipPath);

    // Borrar el mega-zip temporal
    @unlink($megaZipPath);
    exit;
}

// ============================================================
// LIMPIAR: borrar todos los ZIPs de respaldo/
// ============================================================
if (isset($_GET['limpiar'])) {
    $deleted = 0;
    $errors  = 0;

    if (is_dir(BACKUP_DIR)) {
        $zipFiles = glob(BACKUP_DIR . '/*.zip');
        foreach ($zipFiles as $zf) {
            if (@unlink($zf)) {
                $deleted++;
            } else {
                $errors++;
            }
        }
    }

    // Tambien limpiar progreso para que estado.php refleje el borrado
    if (file_exists(PROGRESS_FILE)) @unlink(PROGRESS_FILE);
    if (file_exists(LOG_FILE)) @unlink(LOG_FILE);

    header('Location: estado.php?msg=' . urlencode("Limpieza completada: $deleted ZIPs eliminados" . ($errors > 0 ? ", $errors errores" : '')));
    exit;
}

// Si no se paso ningun parametro
header('Location: estado.php');
exit;
