<?php
date_default_timezone_set('Europe/Istanbul');
set_time_limit(0); // Zaman sınırını kaldır
ini_set('memory_limit', '256M'); // Bellek limitini artır

// Log fonksiyonu
function logMessage($message) {
    $date = date('Y-m-d H:i:s');
    echo "[$date] $message\n";
    error_log("[$date] $message\n", 3, __DIR__ . '/cleanup.log');
}

try {
    $db = new PDO("mysql:host=localhost;dbname=heysen_db;charset=utf8mb4", "heysen_db", "VAXw_jJki{uc");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // Transaction kullanımını etkinleştir
    $db->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
} catch (PDOException $e) {
    logMessage("Veritabanı bağlantı hatası: " . $e->getMessage());
    exit;
}

$threshold = strtotime('-1 month');
$thresholdWeek = strtotime('-1 week');
$batchSize = 1000; // Her seferde silinecek maksimum kayıt sayısı

try {
    // Her tablo için batch silme işlemi
    $tables = [
        [
            'name' => 'mesajlar',
            'query' => "DELETE FROM mesajlar WHERE gonderen_id IN 
                      (SELECT user_id FROM kullanicilar WHERE user_songiris < :threshold) 
                      OR alan_id IN (SELECT user_id FROM kullanicilar WHERE user_songiris < :threshold) 
                      LIMIT :limit",
            'threshold' => $threshold
        ],
        [
            'name' => 'aramalar',
            'query' => "DELETE FROM aramalar WHERE zaman < :threshold LIMIT :limit",
            'threshold' => $thresholdWeek
        ],
        [
            'name' => 'begeniler',
            'query' => "DELETE FROM begeniler WHERE begenen_id IN 
                      (SELECT user_id FROM kullanicilar WHERE user_songiris < :threshold) 
                      OR begenilen_id IN (SELECT user_id FROM kullanicilar WHERE user_songiris < :threshold) 
                      LIMIT :limit",
            'threshold' => $threshold
        ],
        [
            'name' => 'jeton_senaryo_sifir_log',
            'query' => "DELETE FROM jeton_senaryo_sifir_log WHERE user_id IN 
                      (SELECT user_id FROM kullanicilar WHERE user_songiris < :threshold) 
                      LIMIT :limit",
            'threshold' => $threshold
        ],
        [
            'name' => 'sohbetlog',
            'query' => "DELETE FROM sohbetlog WHERE user_id IN 
                      (SELECT user_id FROM kullanicilar WHERE user_songiris < :threshold) 
                      LIMIT :limit",
            'threshold' => $threshold
        ],
        [
            'name' => 'ziyaretler',
            'query' => "DELETE FROM ziyaretler WHERE time < :threshold LIMIT :limit",
            'threshold' => $thresholdWeek
        ]
    ];

    foreach ($tables as $table) {
        logMessage("{$table['name']} tablosu temizleniyor...");
        $totalDeleted = 0;
        
        do {
            $retries = 3; // Yeniden deneme sayısı
            $success = false;
            
            while (!$success && $retries > 0) {
                try {
                    $db->beginTransaction();
                    
                    $stmt = $db->prepare($table['query']);
                    $stmt->bindParam(':threshold', $table['threshold'], PDO::PARAM_INT);
                    $stmt->bindParam(':limit', $batchSize, PDO::PARAM_INT);
                    $stmt->execute();
                    
                    $deletedRows = $stmt->rowCount();
                    $totalDeleted += $deletedRows;
                    
                    $db->commit();
                    $success = true;
                    
                    if ($deletedRows > 0) {
                        logMessage("{$table['name']} tablosundan $deletedRows kayıt silindi (Toplam: $totalDeleted)");
                        usleep(500000); // 0.5 saniye bekle - bekleme süresini artırdık
                    }
                    
                } catch (PDOException $e) {
                    if ($db->inTransaction()) {
                        $db->rollBack();
                    }
                    
                    if (strpos($e->getMessage(), 'Deadlock') !== false) {
                        $retries--;
                        logMessage("Deadlock oluştu, yeniden deneniyor... (Kalan deneme: $retries)");
                        usleep(1000000); // 1 saniye bekle
                    } else {
                        throw $e; // Başka bir hata ise yukarı fırlat
                    }
                }
            }
            
            if (!$success) {
                throw new Exception("Maksimum deneme sayısına ulaşıldı, işlem başarısız.");
            }
            
        } while ($deletedRows > 0);
        
        logMessage("{$table['name']} tablosu temizleme tamamlandı. Toplam silinen: $totalDeleted");
    }

    logMessage("Tüm temizlik işlemleri başarıyla tamamlandı.");

} catch (Exception $e) {
    if ($db->inTransaction()) {
        $db->rollBack();
    }
    logMessage("Hata oluştu: " . $e->getMessage());
}

$db = null; // Veritabanı bağlantısını kapat
?>
