<?php
if (session_status() === PHP_SESSION_NONE) session_start();
require_once __DIR__ . '/../config.php';

if (!isLoggedIn() || !isAdmin()) {
    setMessage('دسترسی غیرمجاز', 'error');
    redirect('../login.php');
}

$page_title = 'پشتیبان‌گیری از پایگاه داده';

$backup_dir = defined('BACKUP_PATH') && is_dir(BACKUP_PATH) ? BACKUP_PATH : dirname(__DIR__) . '/backups';
if (!is_dir($backup_dir)) @mkdir($backup_dir, 0755, true);
if (!is_writable($backup_dir)) {
    setMessage('پوشه بکاپ قابل نوشتن نیست: ' . htmlspecialchars($backup_dir), 'error');
    // Allow to view existing backups even if not writable
}

// Handle backup creation
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'create') {
    $name = preg_replace('/[^a-zA-Z0-9_\x{0600}-\x{06FF}\-\s]/u', '', trim($_POST['backup_name'] ?? ''));
    $name = $name !== '' ? $name : 'backup';
    $name .= '_' . date('Ymd_His');
    $filename = $name . '.sql.gz';
    $filepath = $backup_dir . '/' . $filename;

    try {
        $sql = "-- Database Backup: " . DB_NAME . "\n-- Date: " . date('Y-m-d H:i:s') . "\n";
        $sql .= "SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS=0;\n\n";

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

            $rows = $pdo->query("SELECT * FROM `{$table}`")->fetchAll(PDO::FETCH_ASSOC);
            if ($rows) {
                $cols = array_keys($rows[0]);
                $sql .= "INSERT INTO `{$table}` (`" . implode('`,`', $cols) . "`) VALUES\n";
                $vals = [];
                foreach ($rows as $row) {
                    $vals[] = '(' . implode(', ', array_map([$pdo, 'quote'], $row)) . ')';
                }
                $sql .= implode(",\n", $vals) . ";\n\n";
            }
        }
        $sql .= "SET FOREIGN_KEY_CHECKS=1;\n";

        if (function_exists('gzencode')) {
            file_put_contents($filepath, gzencode($sql, 9));
        } else {
            $filename = $name . '.sql';
            $filepath = $backup_dir . '/' . $filename;
            file_put_contents($filepath, $sql);
        }

        setMessage('بکاپ با موفقیت ایجاد شد: ' . htmlspecialchars($filename));
    } catch (Exception $e) {
        setMessage('خطا در ایجاد بکاپ: ' . $e->getMessage(), 'error');
    }
    redirect('backup.php');
}

// Handle download
if (isset($_GET['download'])) {
    $f = basename($_GET['download']);
    $path = realpath($backup_dir . '/' . $f);
    if ($path && strpos($path, realpath($backup_dir)) === 0 && is_file($path)) {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . $f . '"');
        header('Content-Length: ' . filesize($path));
        readfile($path);
        exit;
    }
    setMessage('فایل بکاپ یافت نشد.', 'error');
    redirect('backup.php');
}

// Handle delete
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'delete') {
    $f = basename($_POST['file'] ?? '');
    $path = realpath($backup_dir . '/' . $f);
    if ($path && strpos($path, realpath($backup_dir)) === 0 && is_file($path)) {
        @unlink($path);
        setMessage('بکاپ حذف شد.');
    }
    redirect('backup.php');
}

// List backups
$backups = [];
if (is_dir($backup_dir)) {
    $files = glob($backup_dir . '/*.sql.gz');
    if (is_array($files)) {
        foreach ($files as $f) {
            $backups[] = ['name' => basename($f), 'size' => filesize($f), 'time' => filemtime($f)];
        }
    }
    $files_sql = glob($backup_dir . '/*.sql');
    if (is_array($files_sql)) {
        foreach ($files_sql as $f) {
            $backups[] = ['name' => basename($f), 'size' => filesize($f), 'time' => filemtime($f)];
        }
    }
    usort($backups, fn($a, $b) => $b['time'] - $a['time']);
}

require_once __DIR__ . '/../includes/header.php';
?>

<div class="card admin-main-card mb-4">
    <div class="card-header">
        <h3 class="card-title mb-0"><?= htmlspecialchars($page_title) ?></h3>
    </div>
    <div class="card-body pb-0">
        <p class="text-muted small mb-0">ایجاد، دانلود و بازیابی نسخه پشتیبان از پایگاه داده.</p>
    </div>
</div>

<div class="row">
    <!-- Create Backup Card -->
    <div class="col-lg-5">
        <div class="card h-100">
            <div class="card-header">
                <h4 class="card-title mb-0"><i class="bi bi-plus-circle me-2"></i>ایجاد بکاپ جدید</h4>
            </div>
            <div class="card-body">
                <p class="text-muted">یک فایل بکاپ کامل از پایگاه داده فعلی ایجاد کنید. فایل‌ها به صورت فشرده (Gzip) ذخیره می‌شوند.</p>
                <form method="POST">
                    <input type="hidden" name="action" value="create">
                    <div class="mb-3">
                        <label for="backup_name" class="form-label">نام بکاپ (اختیاری)</label>
                        <input type="text" name="backup_name" id="backup_name" class="form-control" placeholder="مثلاً: before_update">
                        <div class="form-text">تاریخ و ساعت به صورت خودکار به نام فایل اضافه می‌شود.</div>
                    </div>
                    <button type="submit" class="btn btn-primary w-100">
                        <i class="bi bi-database-add me-2"></i> ایجاد و ذخیره بکاپ
                    </button>
                </form>
            </div>
        </div>
    </div>

    <!-- Backups List Card -->
    <div class="col-lg-7">
        <div class="card h-100">
            <div class="card-header">
                <h4 class="card-title mb-0"><i class="bi bi-list-ul me-2"></i>لیست بکاپ‌ها</h4>
            </div>
            <div class="card-body p-0">
                <?php if (empty($backups)): ?>
                    <div class="p-4 text-center text-muted">هنوز هیچ بکاپی ایجاد نشده است.</div>
                <?php else: ?>
                    <div class="table-responsive">
                        <table class="table table-hover align-middle mb-0">
                            <thead>
                                <tr>
                                    <th>نام فایل</th>
                                    <th>حجم</th>
                                    <th>تاریخ</th>
                                    <th class="text-end">عملیات</th>
                                </tr>
                            </thead>
                            <tbody>
                                <?php foreach ($backups as $b): ?>
                                    <tr>
                                        <td><code class="d-inline-block text-truncate" style="max-width: 250px;"><?= htmlspecialchars($b['name']) ?></code></td>
                                        <td><?= number_format($b['size'] / 1024, 1) ?> KB</td>
                                        <td><?= date('Y/m/d H:i', $b['time']) ?></td>
                                        <td class="text-end">
                                            <a href="?download=<?= urlencode($b['name']) ?>" class="btn btn-sm btn-success">
                                                <i class="bi bi-download"></i>
                                            </a>
                                            <form method="POST" class="d-inline" onsubmit="return confirm('آیا از حذف این بکاپ اطمینان دارید؟');">
                                                <input type="hidden" name="action" value="delete">
                                                <input type="hidden" name="file" value="<?= htmlspecialchars($b['name']) ?>">
                                                <button type="submit" class="btn btn-sm btn-danger"><i class="bi bi-trash"></i></button>
                                            </form>
                                        </td>
                                    </tr>
                                <?php endforeach; ?>
                            </tbody>
                        </table>
                    </div>
                <?php endif; ?>
            </div>
        </div>
    </div>
</div>

<?php require_once __DIR__ . '/../includes/footer.php'; ?>

