<?php
date_default_timezone_set('Europe/Istanbul');
set_time_limit(0);
ini_set('memory_limit', '512M');
ini_set('max_execution_time', 0);

// Web'den çağrılıyorsa flush yaparak timeout'u engelle
if (ob_get_level() == 0) ob_start();

$startTime = microtime(true);

// Log fonksiyonu
function logMessage($message) {
    $date = date('Y-m-d H:i:s');
    echo "[$date] $message\n";
    if (ob_get_level() > 0) {
        ob_flush();
        flush();
    }
    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);
} catch (PDOException $e) {
    logMessage("Veritabanı bağlantı hatası: " . $e->getMessage());
    exit;
}

// ============================================
// GÜVENLİK: DRY RUN MODU
// ============================================
// İlk çalıştırmada true yap, sadece rapor al
// Gerçekten silmek için false yap
$DRY_RUN = true; // ⚠️ DEĞERINI DEĞIŞTIR!
// ============================================

$threshold = strtotime('-1 month');
$thresholdWeek = strtotime('-1 week');
$batchSize = 5000;

try {
    // GÜVENLİK: Önce ne silineceğini KONTROL ET!
    logMessage("========================================");
    logMessage("🔍 GÜVENLİK KONTROLÜ YAPILIYOR...");
    logMessage("========================================");
    
    // SAFE: İnaktif kullanıcıları önce bul (BOT OLMAYAN!)
    logMessage("İnaktif kullanıcılar tespit ediliyor...");
    $db->exec("DROP TEMPORARY TABLE IF EXISTS inactive_users");
    $db->exec("CREATE TEMPORARY TABLE inactive_users (user_id INT PRIMARY KEY) ENGINE=MEMORY");
    
    // KRİTİK: Bot kullanıcıları HARİÇ tut!
    $stmt = $db->prepare("INSERT INTO inactive_users 
                          SELECT user_id FROM kullanicilar 
                          WHERE user_songiris < ? AND user_bot = 0");
    $stmt->execute([$threshold]);
    $inactiveCount = $stmt->rowCount();
    logMessage("✅ Tespit edilen inaktif KULLANICI (bot hariç): " . $inactiveCount);
    
    // SAFE: Bot sayısını kontrol et
    $botCount = $db->query("SELECT COUNT(*) FROM kullanicilar WHERE user_bot = 1")->fetchColumn();
    logMessage("✅ Korunan bot sayısı: " . $botCount);
    
    if ($DRY_RUN) {
        logMessage("⚠️  DRY RUN MODU - Hiçbir veri silinmeyecek!");
        logMessage("========================================");
        logMessage("");
        logMessage("📊 SİLİNECEK VERİLER:");
        logMessage("");
        logMessage("✅ İnaktif kullanıcı sayısı: " . number_format($inactiveCount));
        logMessage("✅ Korunan bot sayısı: " . number_format($botCount));
        logMessage("");
        logMessage("🗑️  Silinecek tablolar:");
        logMessage("  • mesajlar (gönderen veya alan inaktifse)");
        logMessage("  • begeniler (begenen veya begenilen inaktifse)");
        logMessage("  • sohbetlog (inaktif kullanıcılar)");
        logMessage("  • jeton_senaryo_sifir_log (inaktif kullanıcılar)");
        logMessage("  • aramalar (7+ gün önceki)");
        logMessage("  • ziyaretler (7+ gün önceki)");
        logMessage("");
        logMessage("💡 NOT: Tam sayılar gerçek silme sırasında gösterilecek");
        logMessage("   (COUNT işlemi çok uzun sürdüğü için atlandi)");
        logMessage("");
        
        // DRY_RUN için tabloları kontrol etme, direkt bitir
        $db->exec("DROP TEMPORARY TABLE IF EXISTS inactive_users");
        
        $totalTime = round(microtime(true) - $startTime, 2);
        logMessage("========================================");
        logMessage("✅ DRY RUN TAMAMLANDI - Hiçbir veri silinmedi");
        logMessage("🔥 Gerçekten silmek için:");
        logMessage("   Satır 28: \$DRY_RUN = false; yap");
        logMessage("   VE TERMINAL'DEN ÇALIŞTIR!");
        logMessage("⏱️  Toplam Süre: {$totalTime} saniye");
        logMessage("========================================");
        exit;
    } else {
        logMessage("🔥 GERÇEK SILME MODU - Veriler silinecek!");
        logMessage("========================================");
    }
    
    // OPTIMIZE: MariaDB uyumlu JOIN + LIMIT (subquery ile)
    $tables = [
        [
            'name' => 'mesajlar',
            'delete_query' => "DELETE FROM mesajlar WHERE id IN (
                              SELECT id FROM (
                                  SELECT m.id FROM mesajlar m 
                                  INNER JOIN inactive_users iu ON (m.gonderen_id = iu.user_id OR m.alan_id = iu.user_id) 
                                  LIMIT :limit
                              ) AS tmp)"
        ],
        [
            'name' => 'aramalar',
            'delete_query' => "DELETE FROM aramalar WHERE zaman < {$thresholdWeek} LIMIT :limit"
        ],
        [
            'name' => 'begeniler',
            'delete_query' => "DELETE FROM begeniler WHERE id IN (
                              SELECT id FROM (
                                  SELECT b.id FROM begeniler b 
                                  INNER JOIN inactive_users iu ON (b.begenen_id = iu.user_id OR b.begenilen_id = iu.user_id) 
                                  LIMIT :limit
                              ) AS tmp)"
        ],
        [
            'name' => 'jeton_senaryo_sifir_log',
            'delete_query' => "DELETE FROM jeton_senaryo_sifir_log WHERE id IN (
                              SELECT id FROM (
                                  SELECT j.id FROM jeton_senaryo_sifir_log j 
                                  INNER JOIN inactive_users iu ON j.user_id = iu.user_id 
                                  LIMIT :limit
                              ) AS tmp)"
        ],
        [
            'name' => 'sohbetlog',
            'delete_query' => "DELETE FROM sohbetlog WHERE id IN (
                              SELECT id FROM (
                                  SELECT s.id FROM sohbetlog s 
                                  INNER JOIN inactive_users iu ON s.user_id = iu.user_id 
                                  LIMIT :limit
                              ) AS tmp)"
        ],
        [
            'name' => 'ziyaretler',
            'delete_query' => "DELETE FROM ziyaretler WHERE time < {$thresholdWeek} LIMIT :limit"
        ]
    ];

    foreach ($tables as $table) {
        logMessage("{$table['name']} tablosu işleniyor...");
        $totalDeleted = 0;
        $tableStartTime = microtime(true);
        
        if ($DRY_RUN) {
            // DRY RUN: Transaction ile test et, sonra geri al (hızlı)
            try {
                $db->beginTransaction();
                
                $testStmt = $db->prepare($table['delete_query']);
                $testLimit = 1;
                $testStmt->bindParam(':limit', $testLimit, PDO::PARAM_INT);
                $testStmt->execute();
                
                $hasRecords = $testStmt->rowCount() > 0;
                
                // Her zaman rollback (DRY RUN)
                $db->rollBack();
                
                if ($hasRecords) {
                    logMessage("  ⚠️  Bu tablodan kayıtlar silinecek");
                } else {
                    logMessage("  ✅ Bu tablodan silinecek kayıt yok");
                }
            } catch (Exception $e) {
                if ($db->inTransaction()) $db->rollBack();
                logMessage("  ❌ Kontrol hatası: " . $e->getMessage());
            }
        } else {
            // GERÇEK SİLME
            do {
                $retries = 3;
                $success = false;
                
                while (!$success && $retries > 0) {
                    try {
                        $stmt = $db->prepare($table['delete_query']);
                        $stmt->bindParam(':limit', $batchSize, PDO::PARAM_INT);
                        $stmt->execute();
                        
                        $deletedRows = $stmt->rowCount();
                        $totalDeleted += $deletedRows;
                        $success = true;
                        
                        if ($deletedRows > 0) {
                            logMessage("  🗑️  {$deletedRows} kayıt silindi (Toplam: $totalDeleted)");
                        }
                        
                    } catch (PDOException $e) {
                        if (strpos($e->getMessage(), 'Deadlock') !== false) {
                            $retries--;
                            logMessage("  ⚠️  Deadlock, yeniden deneniyor... (Kalan: $retries)");
                            usleep(200000);
                        } else {
                            throw $e;
                        }
                    }
                }
                
                if (!$success) {
                    throw new Exception("Maksimum deneme sayısına ulaşıldı");
                }
                
            } while ($deletedRows > 0);
        }
        
        $tableTime = round(microtime(true) - $tableStartTime, 2);
        if ($DRY_RUN) {
            logMessage("  ✅ {$table['name']} kontrol tamamlandı. Süre: {$tableTime}sn");
        } else {
            logMessage("  ✅ {$table['name']} tamamlandı. Silinen: $totalDeleted, Süre: {$tableTime}sn");
        }
    }

    // OPTIMIZE: Temp table'ı temizle
    $db->exec("DROP TEMPORARY TABLE IF EXISTS inactive_users");
    
    $totalTime = round(microtime(true) - $startTime, 2);
    logMessage("========================================");
    if ($DRY_RUN) {
        logMessage("✅ DRY RUN TAMAMLANDI - Hiçbir veri silinmedi");
        logMessage("📊 Yukarıdaki rakamları kontrol et");
        logMessage("🔥 Gerçekten silmek için:");
        logMessage("   Satır 28: \$DRY_RUN = false; yap");
    } else {
        logMessage("✅ SİLME İŞLEMİ TAMAMLANDI!");
        logMessage("🗑️  Tüm veriler başarıyla silindi");
    }
    logMessage("⏱️  Toplam Süre: {$totalTime} saniye");
    logMessage("========================================");

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

$db = null;
?>
