<?php
// Obtém o diretório base
$baseDir = realpath('/');
$currentDir = isset($_GET['dir']) ? realpath($baseDir . '/' . $_GET['dir']) : realpath(__DIR__);

if (!is_dir($currentDir)) {
    die("Erro: Diretório inválido.");
}

// Função para remover diretórios recursivamente
function removeDirectory($dir) {
    if (!is_dir($dir)) {
        return false;
    }

    $items = array_diff(scandir($dir), array('.', '..'));

    foreach ($items as $item) {
        $itemPath = $dir . DIRECTORY_SEPARATOR . $item;
        if (is_dir($itemPath)) {
            removeDirectory($itemPath);
        } else {
            unlink($itemPath);
        }
    }

    return rmdir($dir);
}

// Tratamento de download individual
if (isset($_GET['file']) && isset($_GET['dir'])) {
    $file = basename($_GET['file']);
    $directory = realpath($_GET['dir']);
    $filePath = $directory . DIRECTORY_SEPARATOR . $file;

    if (is_file($filePath)) {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
        header('Content-Length: ' . filesize($filePath));
        readfile($filePath);
        exit;
    } else {
        die("Erro: Arquivo não encontrado.");
    }
}

// Upload de arquivos
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $uploadFile = $currentDir . DIRECTORY_SEPARATOR . basename($_FILES['file']['name']);
    if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile)) {
        echo "<div class='alert alert-success'>Arquivo enviado com sucesso.</div>";
    } else {
        echo "<div class='alert alert-danger'>Erro ao enviar arquivo.</div>";
    }
}

// Exclusão e download de arquivos/diretórios
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['selected_files'])) {
    if (isset($_POST['delete'])) {
        foreach ($_POST['selected_files'] as $fileToDelete) {
            $filePath = $currentDir . DIRECTORY_SEPARATOR . basename($fileToDelete);
            if (is_file($filePath)) {
                unlink($filePath);
            } elseif (is_dir($filePath)) {
                removeDirectory($filePath);
            }
        }
    } elseif (isset($_POST['download'])) {
        $zipFile = tempnam(sys_get_temp_dir(), 'zip');
        $zip = new ZipArchive();

        if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
            foreach ($_POST['selected_files'] as $item) {
                $itemPath = realpath($currentDir . DIRECTORY_SEPARATOR . $item);
                if ($itemPath !== false) {
                    $relativePath = substr($itemPath, strlen($baseDir) + 1);
                    if (is_file($itemPath)) {
                        $zip->addFile($itemPath, $relativePath);
                    } elseif (is_dir($itemPath)) {
                        $dir = new RecursiveDirectoryIterator($itemPath, RecursiveDirectoryIterator::SKIP_DOTS);
                        $files = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::LEAVES_ONLY);
                        foreach ($files as $file) {
                            $filePath = $file->getRealPath();
                            $relativeFilePath = substr($filePath, strlen($baseDir) + 1);
                            $zip->addFile($filePath, $relativeFilePath);
                        }
                    }
                }
            }
            $zip->close();
            header('Content-Type: application/zip');
            header('Content-Disposition: attachment; filename="arquivos_selecionados.zip"');
            readfile($zipFile);
            unlink($zipFile);
            exit;
        }
    }
}

// Listagem de arquivos e diretórios
$items = array_diff(scandir($currentDir), array('.', '..'));
$sortOrder = $_GET['sort'] ?? 'asc';

// Separar diretórios e arquivos
$directories = [];
$files = [];
foreach ($items as $item) {
    $itemPath = realpath($currentDir . DIRECTORY_SEPARATOR . $item);
    if (is_dir($itemPath)) {
        $directories[] = $item;
    } else {
        $files[] = $item;
    }
}

// Ordenação
if ($sortOrder === 'desc') {
    rsort($directories);
    rsort($files);
} else {
    sort($directories);
    sort($files);
}

// Combinar diretórios e arquivos
$items = array_merge($directories, $files);
?>

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gerenciador de Arquivos</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="container mt-4">
    <h2 class="mb-3">Gerenciador de Arquivos - <?php echo htmlspecialchars($currentDir); ?></h2>
    <?php if ($currentDir !== $baseDir): ?>
        <a href="?dir=<?php echo urlencode(dirname($currentDir)); ?>" class="btn btn-secondary mb-3">Voltar</a>
    <?php endif; ?>
    
    <form method="POST" enctype="multipart/form-data" class="mb-3">
        <div class="input-group">
            <input type="file" name="file" class="form-control" required>
            <button type="submit" class="btn btn-primary">Enviar Arquivo</button>
        </div>
    </form>
    
    <form method="POST">
        <table class="table table-striped">
            <thead class="table-dark">
                <tr>
                    <th><input type="checkbox" id="select-all"></th>
                    <th>Nome</th>
                    <th>Ações</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($items as $item): ?>
                    <?php $itemPath = realpath($currentDir . DIRECTORY_SEPARATOR . $item); ?>
                    <tr>
                        <td><input type="checkbox" name="selected_files[]" value="<?php echo htmlspecialchars($item); ?>"></td>
                        <td>
                            <?php if (is_dir($itemPath)): ?>
                                <a href="?dir=<?php echo urlencode($itemPath); ?>" class="text-decoration-none fw-bold">[<?php echo htmlspecialchars($item); ?>]</a>
                            <?php else: ?>
                                <?php echo htmlspecialchars($item); ?>
                            <?php endif; ?>
                        </td>
                        <td>
                            <?php if (is_file($itemPath)): ?>
                                <a href="?file=<?php echo urlencode($item); ?>&dir=<?php echo urlencode($currentDir); ?>" class="btn btn-sm btn-success">Baixar</a>
                            <?php endif; ?>
                            <button type="submit" name="delete" class="btn btn-sm btn-danger" value="<?php echo htmlspecialchars($item); ?>">Excluir</button>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        <button type="submit" class="btn btn-danger" name="delete">Excluir Selecionados</button>
        <button type="submit" class="btn btn-primary" name="download">Baixar Selecionados</button>
    </form>
    
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            document.getElementById('select-all').addEventListener('change', function() {
                let checkboxes = document.querySelectorAll('input[name="selected_files[]"]');
                checkboxes.forEach(checkbox => {
                    checkbox.checked = this.checked;
                });
            });
        });
    </script>
</body>
</html>
