<?php
// 1. TWARDE WYMUSZENIE UTF-8 (aby escapeshellarg nie zjadało liter np. "ł")
setlocale(LC_ALL, "pl_PL.UTF-8", "en_US.UTF-8", "C.UTF-8");
putenv("LC_ALL=C.UTF-8");

// 2. ŁADOWANIE FUNKCJI ZANIM COKOLWIEK WYŚLEMY NA EKRAN (Naprawa błędu session_start)
require_once 'functions.php';
checkAuth();
requireAdmin();

if (!validateCsrfToken()) die('Nieprawidłowy token bezpieczeństwa.');

ini_set('display_errors', 0);
error_reporting(E_ALL);

// 3. ZWOLNIENIE SESJI PO JEJ URUCHOMIENIU
session_write_close();

// 4. KONFIGURACJA STRUMIENIA TERMINALA
ini_set('output_buffering', 'off');
ini_set('zlib.output_compression', false);
while (ob_get_level()) { ob_end_clean(); }
header('Content-Type: text/plain; charset=utf-8');
header('Cache-Control: no-cache');

// Dopiero teraz wysyłamy bajty "pobudzające" okno terminala
echo str_repeat(" ", 1024) . "\n";

$cfg = cfg();
$folderKey = $_POST['folder'] ?? '';
$subPath = sanitizePath($_POST['path'] ?? '');
$files = $_POST['files'] ?? [];

function terminalLog($msg, $color = "#0f0") {
    $allowedColors = ['#0f0', '#fff', '#0ff', '#aaa', '#ff0', 'red'];
    if (!in_array($color, $allowedColors, true)) $color = '#0f0';
    echo "<span style='color:{$color};'>" . htmlspecialchars($msg, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . "</span>\n";
    flush(); 
}

function runCmdLive($cmd) {
    $fp = popen($cmd, "r");
    while (!feof($fp)) {
        $line = fgets($fp);
        if ($line !== false) {
            echo "<span style='color:#ccc;'>" . htmlspecialchars(rtrim($line)) . "</span>\n";
            flush();
        }
    }
    return pclose($fp);
}

if (empty($files)) { terminalLog("[BŁĄD] Brak plików do rozpakowania.", "red"); exit; }
if (!isset($cfg['allowedFolders'][$folderKey])) { terminalLog("[BŁĄD] Odmowa dostępu.", "red"); exit; }

$targetDir = rtrim('/mnt/mega' . $cfg['allowedFolders'][$folderKey] . '/' . $subPath, '/');
$baseTemp = __DIR__ . '/data/yt_temp';
$activeJobDir = $baseTemp . '/unpack_live_' . uniqid();
@mkdir($activeJobDir, 0777, true);
@touch($activeJobDir . '/.active');
register_shutdown_function(function() use ($activeJobDir) { @unlink($activeJobDir . '/.active'); });

terminalLog("[SYSTEM] Inicjalizacja Środowiska Terminala FUSE...");
runCmdLive("mkdir -p " . escapeshellarg($baseTemp));

foreach($files as $file) {
    $safeName = basename($file);
    $fullPath = $targetDir . '/' . $safeName;
    
    // Generowanie nazwy folderu na podstawie nazwy archiwum
    $archiveNameNoExt = pathinfo($safeName, PATHINFO_FILENAME);
    // Usuwamy ewentualne dziwne znaki z nazwy nowego folderu docelowego
    $cleanFolderName = preg_replace('/[^A-Za-z0-9_\-\.]/', '_', $archiveNameNoExt);
    
    $tempDir = $activeJobDir . '/' . $cleanFolderName;
    // Ostateczny katalog docelowy w chmurze
    $finalCloudDir = $targetDir . '/' . $cleanFolderName;
    
    terminalLog("\n=======================================================", "#fff");
    terminalLog("[OPERACJA] Ekstrakcja pliku: $safeName", "#0ff");
    terminalLog("[INFO] Zostanie utworzony dedykowany folder: $cleanFolderName", "#aaa");

    if (!file_exists($fullPath)) {
        terminalLog("[BŁĄD] Archiwum $safeName nie istnieje w chmurze! Sprawdź ścieżkę: " . $fullPath, "red");
        continue;
    }

    $ext = strtolower(pathinfo($fullPath, PATHINFO_EXTENSION));
    $sFull = escapeshellarg($fullPath);
    $sExtr = escapeshellarg($tempDir);
    $sTargParent = escapeshellarg($targetDir);
    
    runCmdLive("mkdir -p {$sExtr}");
    terminalLog("[KROK 1/2] Odczyt i ekstrakcja (Bypass FUSE)...", "#ff0");
    
    if ($ext === 'zip') {
        $ret = runCmdLive("unzip -o {$sFull} -d {$sExtr} 2>&1");
    } else {
        $ret = runCmdLive("unrar x -y -o+ {$sFull} {$sExtr}/ 2>&1");
    }

    if ($ret !== 0 && $ret !== 1) { 
        terminalLog("[BŁĄD KRYTYCZNY] Archiwum uszkodzone! (Kod: $ret)", "red");
    } else {
        terminalLog("[SUKCES] Zrzucono do izolowanego środowiska.", "#0f0");
        terminalLog("[KROK 2/2] Kopiowanie gotowego katalogu na MEGA...", "#ff0");
        
        $retCp = runCmdLive("\\cp -rf {$sExtr} {$sTargParent}/ 2>&1");
        
        if ($retCp !== 0) {
            terminalLog("[BŁĄD] Zrzut przerwany (Kod rclone: $retCp)", "red");
        } else {
            terminalLog("[SUKCES FINAŁOWY] Wyodrębniono do: /{$cleanFolderName}", "#0f0");
        }
    }
    // Sprzątamy cały katalog sesji dla tego pliku
    runCmdLive("rm -rf " . escapeshellarg($tempDir));
}

@unlink($activeJobDir . '/.active');
@rmdir($activeJobDir);
invalidateSearchIndex();

// Opóźnione wyczyszczenie ukrytego cache
exec("nohup bash -c 'sleep 600 && sudo -n /usr/local/bin/clean_vfs.sh' >/dev/null 2>&1 < /dev/null &");

terminalLog("\n=======================================================", "#fff");
terminalLog("[ZAKOŃCZONO] Proces zamknięty. Możesz odświeżyć folder.", "#0f0");
?>
