<?php
/**
 * ÇARK BİLDİRİM SİSTEMİ
 * 
 * Bu script kullanıcılara çark çevirebilecekleri zaman bildirim gönderir.
 * 
 * Mantık:
 * 1. Kullanıcı hiç çark çevirmemiş + jeton=0 + kayıt üzerinden 24 saat geçmiş → Bildirim
 * 2. Kullanıcı çark çevirmiş + jeton=0 + son çevirme üzerinden 24 saat geçmiş → Bildirim
 * 
 * Cron ile çalıştırılmalı: Her saat başı veya her 30 dakikada bir
 * Örnek cron: 0 * * * * /usr/bin/php /path/to/cark_bildirim.php
 */

ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);
error_reporting(0);

// Web'den çalıştırılınca düzgün görünsün
if (php_sapi_name() !== 'cli') {
    header('Content-Type: text/plain; charset=utf-8');
}

include '../../config.php';

// OneSignal ayarları
define('ONESIGNAL_APP_ID', 'ad1b405f-217b-47b5-b59b-770d801cb89b');
define('ONESIGNAL_API_URL', 'https://onesignal.com/api/v1/notifications');

// ============================
// HELPER FONKSİYONLAR
// ============================

/**
 * OneSignal ile bildirim gönder
 */
function sendNotification($playerIds, $heading, $message, $url = null) {
    if (empty($playerIds)) {
        return ['success' => false, 'message' => 'Boş player ID listesi'];
    }
    
    $content = array("en" => $message);
    $headingArr = array("en" => $heading);
    
    $fields = array(
        'app_id' => ONESIGNAL_APP_ID,
        'include_player_ids' => $playerIds,
        'contents' => $content,
        'headings' => $headingArr,
        'ttl' => 7200, // 2 saat
        'priority' => 10
    );
    
    // URL varsa ekle
    if ($url) {
        $fields['url'] = $url;
    }
    
    $fields = json_encode($fields);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, ONESIGNAL_API_URL);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    $jsonResponse = json_decode($response, true);
    
    return [
        'success' => isset($jsonResponse['id']),
        'recipients' => $jsonResponse['recipients'] ?? 0,
        'response' => $jsonResponse
    ];
}

/**
 * Kullanıcının son bildirim zamanını kontrol et (spam önleme)
 * Her kullanıcıya 24 saatte bir bildirim
 * 
 * EKSTRA GÜVENLİK: Son bildirimden sonra çark çevirmişse bildirim gönderme
 */
function canSendNotification($userId, $db) {
    $query = $db->prepare("SELECT cark_notify FROM kullanicilar WHERE user_id = ?");
    $query->execute([$userId]);
    $result = $query->fetch(PDO::FETCH_ASSOC);
    
    if (!$result) return true;
    
    $lastNotification = $result['cark_notify'] ?? 0;
    $currentTime = time();
    
    // Hiç bildirim gönderilmemişse gönderilebilir
    if ($lastNotification == 0) return true;
    
    // Son bildirimden 23 saat geçmişse tekrar gönder (güvenlik payı)
    $timePassed = ($currentTime - $lastNotification) >= 82800; // 23 saat
    
    if (!$timePassed) {
        return false; // Henüz zaman dolmadı
    }
    
    // EKSTRA KONTROL: Son bildirimden sonra çark çevirmiş mi?
    // Eğer çevirdiyse, yeni çevirme hakkı gelene kadar bildirim gönderme
    $spinQuery = $db->prepare("SELECT MAX(spin_time) as last_spin FROM cark_gecmis WHERE user_id = ?");
    $spinQuery->execute([$userId]);
    $spinResult = $spinQuery->fetch(PDO::FETCH_ASSOC);
    
    $lastSpin = $spinResult['last_spin'] ?? 0;
    
    // Eğer son bildirimden SONRA çark çevirdiyse, bildirim gönderme
    // Çünkü kullanıcı zaten uyarıyı görmüş ve çarkı çevirmiş demektir
    if ($lastSpin > $lastNotification) {
        // Son çevirmeden 24 saat geçmiş mi kontrol et
        // Geçmemişse bildirim gönderme (çünkü henüz yeni çevirme hakkı yok)
        if (($currentTime - $lastSpin) < 86400) {
            return false; // Henüz yeni çevirme hakkı yok
        }
    }
    
    return true; // Tüm kontroller geçti, bildirim gönderilebilir
}

/**
 * Bildirim zamanını güncelle
 */
function updateNotificationTime($userId, $db) {
    $query = $db->prepare("UPDATE kullanicilar SET cark_notify = ? WHERE user_id = ?");
    return $query->execute([time(), $userId]);
}

// ============================
// KULLANICI KONTROLÜ
// ============================

echo "🎡 ÇARK BİLDİRİM SİSTEMİ BAŞLATILDI\n";
echo "⏰ Zaman: " . date('Y-m-d H:i:s') . "\n";
echo "==========================================\n\n";

$currentTime = time();
$oneDayAgo = $currentTime - 86400;

// ADIM 1: Sütun kontrolü (cark_notify sütunu var mı?)
try {
    $checkColumn = $db->query("SHOW COLUMNS FROM kullanicilar LIKE 'cark_notify'");
    $columnExists = $checkColumn->rowCount() > 0;
    
    if (!$columnExists) {
        echo "⚠️  Sütun bulunamadı, oluşturuluyor...\n";
        $db->exec("ALTER TABLE kullanicilar ADD COLUMN cark_notify INT(11) DEFAULT 0 AFTER user_jeton");
        echo "✅ cark_notify sütunu oluşturuldu!\n\n";
    }
} catch (Exception $e) {
    echo "❌ Sütun kontrolü hatası: " . $e->getMessage() . "\n";
    exit;
}

// ADIM 2: Bildirim gönderilecek kullanıcıları bul
$usersToNotify = [];

try {
    // Son 48 saatte aktif kullanıcıları çek (bot olmayan, OneSignal ID'si olan, jetonu 0 olan)
    $twoDaysAgo = $currentTime - 172800; // 48 saat
    
    $query = $db->query("
        SELECT 
            k.user_id,
            k.user_fullname,
            k.user_jeton,
            k.user_kayit,
            k.user_onesignal,
            k.cark_notify,
            k.user_songiris,
            (SELECT MAX(spin_time) FROM cark_gecmis WHERE user_id = k.user_id) as last_spin_time
        FROM kullanicilar k
        WHERE 
            k.user_bot = 0 
            AND k.user_jeton = 0 
            AND k.user_onesignal IS NOT NULL
            AND LENGTH(k.user_onesignal) = 36
            AND k.user_songiris >= $twoDaysAgo
        ORDER BY k.user_songiris DESC
    ");
    
    $totalUsers = 0;
    $eligibleUsers = 0;
    $spamBlockedUsers = 0;
    
    foreach ($query as $user) {
        $totalUsers++;
        
        $userId = $user['user_id'];
        $userJeton = $user['user_jeton'];
        $userKayit = $user['user_kayit'];
        $lastSpinTime = $user['last_spin_time'];
        $lastNotification = $user['cark_notify'] ?? 0;
        
        // KURAL 1: Jetonu 0 olmalı (zaten query'de var ama kontrol edelim)
        if ($userJeton != 0) {
            continue;
        }
        
        // ÖNEMLİ: BİLDİRİM SİSTEMİNDEN ÖNCE ÇARK ÇEVİRMİŞ Mİ?
        // Eğer daha önce çark çevirmiş ama hiç bildirim almamışsa (cark_notify=0)
        // Bu, bildirim sisteminden ÖNCE çevirmiş demektir
        // Bu kullanıcıya ilk seferde bildirim GÖNDERME, sadece cark_notify'ı güncelle
        if ($lastNotification == 0 && $lastSpinTime !== null) {
            // Eski kullanıcı, bildirim sisteminden önce çark çevirmiş
            // cark_notify'ı son çevirme zamanına set et
            updateNotificationTime($userId, $db);
            $spamBlockedUsers++;
            continue;
        }
        
        // KURAL 2: Spam önleme - Son bildirimden 23 saat geçmiş mi?
        if (!canSendNotification($userId, $db)) {
            $spamBlockedUsers++;
            continue;
        }
        
        // KURAL 3a: Hiç çark çevirmemiş + kayıt üzerinden 24 saat geçmiş
        if ($lastSpinTime === null) {
            $canSpinAfterRegistration = ($currentTime - $userKayit) >= 86400;
            
            if ($canSpinAfterRegistration) {
                $usersToNotify[] = $user;
                $eligibleUsers++;
            }
        } 
        // KURAL 3b: Çark çevirmiş + son çevirme üzerinden 24 saat geçmiş
        else {
            $canSpinAfterLastSpin = ($currentTime - $lastSpinTime) >= 86400;
            
            if ($canSpinAfterLastSpin) {
                $usersToNotify[] = $user;
                $eligibleUsers++;
            }
        }
    }
    
    echo "📊 KULLANICI İSTATİSTİKLERİ:\n";
    echo "   - Kontrol edilen toplam kullanıcı: {$totalUsers}\n";
    echo "   - Bildirim gönderilebilir kullanıcı: {$eligibleUsers}\n";
    echo "   - Spam nedeniyle engellenen: {$spamBlockedUsers}\n\n";
    
    // ADIM 3: Bildirim gönder
    if (count($usersToNotify) > 0) {
        echo "📤 BİLDİRİM GÖNDERİLİYOR...\n\n";
        
        // OneSignal max 2000 kullanıcıya tek seferde bildirim gönderebilir
        // Güvenlik için 100'lü gruplara bölelim
        $chunks = array_chunk($usersToNotify, 100);
        
        $totalSent = 0;
        $totalFailed = 0;
        
        foreach ($chunks as $chunkIndex => $chunk) {
            $playerIds = array_column($chunk, 'user_onesignal');
            $userIds = array_column($chunk, 'user_id');
            
            // Bildirim metni
            $heading = "😍Çark Çevir Jeton Kazan!😍";
            $message = "🎁 Ücretsiz çark çevirme hakkınız hazır! Hemen jeton kazanın!";
            $url = "https://app.heysen.net/hesabim.php"; // Çark sayfasına yönlendir
            
            // Bildirim gönder
            $result = sendNotification($playerIds, $heading, $message, $url);
            
            if ($result['success']) {
                $sent = $result['recipients'] ?? count($chunk);
                $totalSent += $sent;
                
                echo "   ✅ Grup " . ($chunkIndex + 1) . ": {$sent}/" . count($chunk) . " kullanıcıya ulaştı\n";
                
                // Bildirim zamanını güncelle
                foreach ($userIds as $uid) {
                    updateNotificationTime($uid, $db);
                }
            } else {
                $totalFailed += count($chunk);
                echo "   ❌ Grup " . ($chunkIndex + 1) . ": Gönderim başarısız\n";
            }
            
            // API rate limit için kısa bekleme
            if (count($chunks) > 1) {
                sleep(1);
            }
        }
        
        $totalAttempted = count($usersToNotify);
        $unreachable = $totalAttempted - $totalSent;
        
        echo "\n📊 BİLDİRİM SONUÇLARI:\n";
        echo "   - Gönderilmeye çalışılan: {$totalAttempted}\n";
        echo "   - Başarıyla ulaşan: {$totalSent}\n";
        
    } else {
        echo "ℹ️  Bildirim gönderilecek kullanıcı yok.\n";
    }
    
} catch (Exception $e) {
    echo "❌ HATA: " . $e->getMessage() . "\n";
    echo "Trace: " . $e->getTraceAsString() . "\n";
}

echo "\n==========================================\n";
echo "✅ ÇARK BİLDİRİM SİSTEMİ TAMAMLANDI\n";
echo "⏰ Bitiş: " . date('Y-m-d H:i:s') . "\n";

?>

