<?php
// modules/backup.php
require_once '../includes/auth.php';
checkLogin();
require_once '../config/db.php';

$userId = $_SESSION['user_id'];
$isAdmin = isAdmin();
$msg = '';
$error = '';

$backupDir = '../backups/';
$configFile = '../config/backup_config.json';

if (!is_dir($backupDir)) {
    mkdir($backupDir, 0755, true);
    file_put_contents($backupDir . '.htaccess', "Deny from all");
}

// تنظیمات بک‌آپ اتوماتیک
$config = ['auto_enabled' => false, 'interval_hours' => 24, 'last_run' => 0];
if (file_exists($configFile)) {
    $config = json_decode(file_get_contents($configFile), true);
}

// ==========================================
// 🚀 توابع تولید بک‌آپ (بهینه‌شده برای دیتابیس‌های حجیم / جلوگیری از کرش رم)
// ==========================================
function streamFullSQLBackup($pdo, $outputStream) {
    fwrite($outputStream, "-- VPNet Full Database Backup\n-- Date: " . date('Y-m-d H:i:s') . "\n\nSET FOREIGN_KEY_CHECKS=0;\n\n");
    
    $tables = [];
    $query = $pdo->query("SHOW TABLES");
    while ($row = $query->fetch(PDO::FETCH_NUM)) {
        $tables[] = $row[0];
    }

    foreach($tables as $table) {
        fwrite($outputStream, "DROP TABLE IF EXISTS `$table`;\n");
        $createStmt = $pdo->query("SHOW CREATE TABLE `$table`")->fetch(PDO::FETCH_NUM);
        fwrite($outputStream, $createStmt[1] . ";\n\n");
        
        $rows = $pdo->query("SELECT * FROM `$table`");
        while($row = $rows->fetch(PDO::FETCH_ASSOC)) {
            $values = array_map(function($val) use ($pdo) { 
                return ($val === null) ? 'NULL' : $pdo->quote($val); 
            }, array_values($row));
            fwrite($outputStream, "INSERT INTO `$table` (`" . implode("`, `", array_keys($row)) . "`) VALUES (" . implode(", ", $values) . ");\n");
        }
        fwrite($outputStream, "\n");
    }
    fwrite($outputStream, "SET FOREIGN_KEY_CHECKS=1;\n");
}

function generateUserJSONBackup($pdo, $targetId, $targetUsername) {
    $data = [
        'info' => ['username' => $targetUsername, 'backup_date' => date('Y-m-d H:i:s')],
        'transactions' => $pdo->query("SELECT * FROM transactions WHERE user_id = $targetId")->fetchAll(PDO::FETCH_ASSOC),
        'banks' => $pdo->query("SELECT * FROM banks WHERE user_id = $targetId")->fetchAll(PDO::FETCH_ASSOC),
        'settlements' => $pdo->query("SELECT * FROM settlements WHERE user_id = $targetId")->fetchAll(PDO::FETCH_ASSOC)
    ];
    return json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}

// ==========================================
// ⏰ اجرای بک‌آپ خودکار
// ==========================================
if ($isAdmin && ($config['auto_enabled'] ?? false)) {
    $lastRun = $config['last_run'] ?? 0;
    $intervalSeconds = ($config['interval_hours'] ?? 24) * 3600;
    
    if (time() - $lastRun >= $intervalSeconds) {
        try {
            $filename = $backupDir . 'autobackup_' . date('Y-m-d_H-i-s') . '.sql';
            $file = fopen($filename, 'w');
            streamFullSQLBackup($pdo, $file);
            fclose($file);
            
            $config['last_run'] = time();
            file_put_contents($configFile, json_encode($config));
        } catch(Exception $e) {
            // مخفی کردن خطا برای عدم تداخل در کار مدیر
        }
    }
}

// ==========================================
// 🛠 پردازش درخواست‌ها
// ==========================================

// دانلود فایل از آرشیو (دور زدن امن htaccess)
if (isset($_GET['download_file']) && $isAdmin) {
    $fileToDownload = basename($_GET['download_file']); 
    $filePath = $backupDir . $fileToDownload;
    
    if (file_exists($filePath) && is_file($filePath)) {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . $fileToDownload . '"');
        header('Content-Length: ' . filesize($filePath));
        readfile($filePath);
        exit;
    } else {
        $error = "فایل مورد نظر پیدا نشد.";
    }
}

// حذف فایل از آرشیو
if (isset($_GET['delete_file']) && $isAdmin) {
    $fileToDelete = basename($_GET['delete_file']); 
    $filePath = $backupDir . $fileToDelete;
    
    if (file_exists($filePath) && is_file($filePath)) {
        if (unlink($filePath)) {
            $msg = "فایل بک‌آپ با موفقیت از سرور حذف شد.";
        } else {
            $error = "خطا در حذف فایل. سطح دسترسی پوشه را بررسی کنید.";
        }
    } else {
        $error = "فایل مورد نظر پیدا نشد.";
    }
}

// عملیات فرم‌ها
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
    
    // ۱. دانلود دستی
    if ($_POST['action'] == 'download_backup') {
        if ($isAdmin && empty($_POST['target_user_id'])) {
            header('Content-Type: application/sql');
            header('Content-Disposition: attachment; filename="VPNet_FullBackup_' . date('Y-m-d_H-i-s') . '.sql"');
            streamFullSQLBackup($pdo, fopen('php://output', 'w'));
            exit;
        } elseif ($isAdmin && !empty($_POST['target_user_id'])) {
            $tId = (int)$_POST['target_user_id'];
            $uInfo = $pdo->query("SELECT username FROM users WHERE id = $tId")->fetch();
            $json = generateUserJSONBackup($pdo, $tId, $uInfo['username']);
            header('Content-Type: application/json');
            header('Content-Disposition: attachment; filename="Backup_User_'.$uInfo['username'].'_'.date('Y-m-d').'.json"');
            echo $json; exit;
        } else {
            $json = generateUserJSONBackup($pdo, $userId, $_SESSION['username']);
            header('Content-Type: application/json');
            header('Content-Disposition: attachment; filename="MyData_Backup_' . date('Y-m-d') . '.json"');
            echo $json; exit;
        }
    }

    // ۲. تنظیمات بک‌آپ خودکار
    if ($_POST['action'] == 'save_settings' && $isAdmin) {
        $config['auto_enabled'] = isset($_POST['auto_enabled']) ? true : false;
        $config['interval_hours'] = (int)$_POST['interval_hours'];
        $config['last_run'] = $config['last_run'] ?? 0; // حفظ زمان اجرای قبلی
        file_put_contents($configFile, json_encode($config));
        $msg = "تنظیمات ذخیره شد.";
    }

    // ۳. بازگردانی (Import) - ایمن در برابر قطع دیتابیس (Error 2006)
    if ($_POST['action'] == 'import_backup') {
        if (isset($_FILES['backup_file']) && $_FILES['backup_file']['error'] == UPLOAD_ERR_OK) {
            if ($isAdmin && strpos($_FILES['backup_file']['name'], '.sql') !== false) {
                try { 
                    $file = fopen($_FILES['backup_file']['tmp_name'], 'r');
                    $query = '';
                    $pdo->exec("SET FOREIGN_KEY_CHECKS=0;");
                    
                    // پردازش خط‌به‌خط (Stream) برای جلوگیری از ارسال پکیج سنگین به MySQL
                    while ($line = fgets($file)) {
                        $trimLine = trim($line);
                        if (empty($trimLine) || substr($trimLine, 0, 2) === '--') continue;
                        
                        $query .= $line;
                        if (substr(rtrim($query), -1) === ';') {
                            $pdo->exec($query);
                            $query = '';
                        }
                    }
                    fclose($file);
                    $pdo->exec("SET FOREIGN_KEY_CHECKS=1;");
                    $msg = "دیتابیس با موفقیت بازگردانی شد."; 
                } catch(Exception $e) { 
                    $error = "خطا در بازگردانی دیتابیس: " . $e->getMessage(); 
                    $pdo->exec("SET FOREIGN_KEY_CHECKS=1;");
                }
            } else {
                $fileContent = file_get_contents($_FILES['backup_file']['tmp_name']);
                $data = json_decode($fileContent, true);
                if ($data) {
                    $pdo->beginTransaction();
                    try {
                        $pdo->exec("DELETE FROM transactions WHERE user_id = $userId");
                        $pdo->exec("DELETE FROM banks WHERE user_id = $userId");
                        $pdo->exec("DELETE FROM settlements WHERE user_id = $userId");
                        $bankMap = []; $settMap = [];
                        foreach(($data['banks'] ?? []) as $b) { $pdo->prepare("INSERT INTO banks (user_id, bank_name, card_number) VALUES (?,?,?)")->execute([$userId, $b['bank_name'], $b['card_number']]); $bankMap[$b['id']] = $pdo->lastInsertId(); }
                        foreach(($data['settlements'] ?? []) as $s) { $pdo->prepare("INSERT INTO settlements (user_id, amount, receipt_text, receipt_file, status, created_at) VALUES (?,?,?,?,?,?)")->execute([$userId, $s['amount'], $s['receipt_text'], $s['receipt_file'], $s['status'], $s['created_at']]); $settMap[$s['id']] = $pdo->lastInsertId(); }
                        foreach(($data['transactions'] ?? []) as $t) {
                            $nB = $t['bank_id'] ? ($bankMap[$t['bank_id']] ?? null) : null;
                            $nS = $t['settlement_id'] ? ($settMap[$t['settlement_id']] ?? null) : null;
                            $pdo->prepare("INSERT INTO transactions (user_id, type, customer_name, account_username, plan, volume, discount, bank_id, paid_amount, profit, admin_profit, date_shamsi, is_settled, settlement_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)")->execute([$userId, $t['type'], $t['customer_name'], $t['account_username'], $t['plan'], $t['volume'], $t['discount'], $nB, $t['paid_amount'], $t['profit'], $t['admin_profit'], $t['date_shamsi'], $t['is_settled'], $nS]);
                        }
                        $pdo->commit(); $msg = "اطلاعات با موفقیت Import شد.";
                    } catch(Exception $e) { $pdo->rollBack(); $error = "خطا در پردازش فایل JSON."; }
                }
            }
        }
    }
}

$usersList = $isAdmin ? $pdo->query("SELECT id, username FROM users WHERE role='operator'")->fetchAll() : [];
$autoBackups = glob($backupDir . 'autobackup_*.sql');
if ($autoBackups === false) { $autoBackups = []; }
usort($autoBackups, function($a, $b) { return filemtime($b) - filemtime($a); });

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

<?php if($msg): ?>
    <div class="bg-emerald-100 border border-emerald-400 text-emerald-800 px-5 py-4 rounded-xl mb-6 font-bold shadow-sm">✅ <?php echo $msg; ?></div>
<?php endif; ?>

<?php if($error): ?>
    <div class="bg-rose-100 border border-rose-400 text-rose-800 px-5 py-4 rounded-xl mb-6 font-bold shadow-sm">⚠️ <?php echo $error; ?></div>
<?php endif; ?>

<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
    
    <div class="space-y-8">
        <div class="bg-white rounded-3xl shadow-sm border border-gray-100 p-8 border-t-8 border-t-blue-500">
            <h2 class="text-xl font-bold mb-6 text-gray-800">خروجی فایل پشتیبان</h2>
            
            <form method="POST" class="mb-6 p-6 bg-blue-50 rounded-2xl border border-blue-100 text-center">
                <input type="hidden" name="action" value="download_backup">
                <h3 class="font-bold text-blue-800 mb-2"><?php echo $isAdmin ? 'بک‌آپ کامل دیتابیس (SQL)' : 'بک‌آپ اختصاصی شما (JSON)'; ?></h3>
                <button type="submit" class="bg-blue-600 text-white px-8 py-3 rounded-xl font-bold hover:bg-blue-700 shadow-md transition">📥 دریافت فایل بک‌آپ</button>
            </form>

            <?php if($isAdmin): ?>
            <div class="p-6 bg-purple-50 rounded-2xl border border-purple-100">
                <h3 class="font-bold text-purple-800 mb-4 text-sm">تهیه پشتیبان اختصاصی از اپراتور خاص</h3>
                <form method="POST" class="flex gap-2">
                    <input type="hidden" name="action" value="download_backup">
                    <select name="target_user_id" required class="flex-1 border rounded-xl p-2.5 bg-white text-sm outline-none focus:ring-2 focus:ring-purple-200">
                        <option value="">انتخاب اپراتور...</option>
                        <?php foreach($usersList as $u): ?>
                            <option value="<?php echo $u['id']; ?>"><?php echo htmlspecialchars($u['username']); ?></option>
                        <?php endforeach; ?>
                    </select>
                    <button type="submit" class="bg-purple-600 text-white px-4 py-2.5 rounded-xl text-xs font-bold hover:bg-purple-700 transition">دریافت JSON</button>
                </form>
            </div>
            <?php endif; ?>
        </div>

        <div class="bg-white rounded-3xl shadow-sm border border-gray-100 p-8 border-t-8 border-t-red-500">
            <h2 class="text-xl font-bold mb-4 text-gray-800">بازگردانی فایل پشتیبان</h2>
            <p class="text-xs text-red-500 font-bold mb-4">⚠️ با این کار، اطلاعات فعلی حذف و با فایل جدید جایگزین می‌شود.</p>
            <form method="POST" enctype="multipart/form-data" onsubmit="return confirm('آیا از جایگزینی اطلاعات مطمئن هستید؟');">
                <input type="hidden" name="action" value="import_backup">
                <input type="file" name="backup_file" required class="w-full border p-2.5 rounded-xl bg-gray-50 text-sm mb-4">
                <button type="submit" class="w-full bg-gray-800 text-white py-3 rounded-xl font-bold hover:bg-gray-900 transition">آپلود و جایگزینی نهایی</button>
            </form>
        </div>
    </div>

    <?php if($isAdmin): ?>
    <div class="space-y-8">
        <div class="bg-white rounded-3xl shadow-sm border border-gray-100 p-8 border-t-8 border-t-green-500">
            <h2 class="text-xl font-bold mb-6 text-gray-800">تنظیمات پشتیبان‌گیری خودکار</h2>
            <form method="POST" class="space-y-4">
                <input type="hidden" name="action" value="save_settings">
                <label class="flex items-center gap-3 cursor-pointer p-4 bg-gray-50 rounded-xl border">
                    <input type="checkbox" name="auto_enabled" class="w-5 h-5 text-green-600" <?php echo $config['auto_enabled'] ? 'checked' : ''; ?>>
                    <span class="font-bold text-gray-700">فعال‌سازی بک‌آپ اتوماتیک کل دیتابیس</span>
                </label>
                <div>
                    <label class="block text-sm font-bold mb-2 text-gray-600">دوره زمانی</label>
                    <select name="interval_hours" class="w-full border rounded-xl p-3 bg-gray-50">
                        <option value="1" <?php if($config['interval_hours']==1) echo 'selected'; ?>>هر ۱ ساعت</option>
                        <option value="24" <?php if($config['interval_hours']==24) echo 'selected'; ?>>هر ۲۴ ساعت (روزانه)</option>
                        <option value="168" <?php if($config['interval_hours']==168) echo 'selected'; ?>>هفتگی</option>
                    </select>
                </div>
                <button type="submit" class="w-full bg-green-600 text-white py-3 rounded-xl font-bold hover:bg-green-700 shadow-md">ذخیره تنظیمات دوره</button>
            </form>
        </div>

        <div class="bg-white rounded-3xl shadow-sm border border-gray-100 p-8">
            <h2 class="text-xl font-bold mb-4 text-gray-800">آرشیو بک‌آپ‌های سرور</h2>
            <div class="space-y-2 max-h-60 overflow-y-auto">
                <?php if (empty($autoBackups)): ?>
                    <p class="text-gray-500 text-sm py-4 text-center">هیچ فایلی در آرشیو یافت نشد.</p>
                <?php else: ?>
                    <?php foreach($autoBackups as $file): $fn = basename($file); ?>
                        <div class="flex justify-between items-center p-3 border rounded-xl bg-white text-xs">
                            <span dir="ltr" class="font-bold"><?php echo $fn; ?></span>
                            <div class="flex gap-2">
                                <a href="?download_file=<?php echo urlencode($fn); ?>" target="_blank" download onclick="setTimeout(() => { document.getElementById('page-loading-overlay')?.classList.add('opacity-0', 'pointer-events-none'); }, 1000);" class="text-blue-600 font-bold hover:underline">دانلود</a>
                                <a href="?delete_file=<?php echo urlencode($fn); ?>" onclick="return confirm('آیا از حذف این فایل پشتیبان مطمئن هستید؟');" class="text-red-500 font-bold hover:underline">حذف</a>
                            </div>
                        </div>
                    <?php endforeach; ?>
                <?php endif; ?>
            </div>
        </div>
    </div>
    <?php endif; ?>
</div>

<script>
    document.addEventListener('DOMContentLoaded', () => {
        const forms = document.querySelectorAll('form');
        forms.forEach(form => {
            const actionInput = form.querySelector('input[name="action"][value="download_backup"]');
            if (actionInput) {
                form.addEventListener('submit', () => {
                    setTimeout(() => {
                        const overlay = document.getElementById('page-loading-overlay');
                        if (overlay) {
                            overlay.classList.remove('opacity-100');
                            overlay.classList.add('opacity-0', 'pointer-events-none');
                        }
                    }, 2500); 
                });
            }
        });
    });
</script>

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