<?php
/**
 * SMM Paket Satış Scripti - API Fiyat İzleme Cron
 * 
 * Bu cron dosyası şunları yapar:
 * 1. Mevcut API servislerindeki fiyat değişikliklerini tespit eder
 * 2. Zarar eden paketleri tespit eder ve bildirim gönderir
 * 3. Detaylı kar/zarar analizi yapar
 * 4. Tüm işlemleri tek log dosyasına yazar
 * 
 * NOT: Yeni servis eklemez, sadece mevcut servisleri kontrol eder
 * 
 * Cron komutu: 0 0,6,12,18 * * * php /path/to/cron/price-monitor.php
 * 
 * @version 1.2.0
 */

// CLI kontrolü
$allowedKey = 'smm-price-monitor-2026';

if (php_sapi_name() !== 'cli') {
    if (!isset($_GET['cron_key']) || $_GET['cron_key'] !== $allowedKey) {
        http_response_code(403);
        die('Erisim reddedildi.');
    }
}

// Zaman limiti
set_time_limit(300);

// Hata raporlama
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);

// Config dosyasını dahil et
require_once __DIR__ . '/../config.php';
require_once __DIR__ . '/../includes/telegram.php';

// Log dizini ve dosyası
$logDir = __DIR__ . '/../logs';
$logFile = $logDir . '/price-monitor.log';

// Log dizinini oluştur
if (!is_dir($logDir)) {
    mkdir($logDir, 0755, true);
}

/**
 * Log fonksiyonu - Tek dosyaya yazar
 */
function cronLog($message, $type = 'INFO', $data = null) {
    global $logFile;
    
    $timestamp = date('Y-m-d H:i:s');
    
    $logEntry = "[{$timestamp}] [{$type}] {$message}";
    
    if ($data !== null) {
        $jsonData = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        $logEntry .= " | " . $jsonData;
    }
    
    $logEntry .= "\n";
    
    // Konsola yaz
    echo $logEntry;
    
    // Log dosyasına yaz
    file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX);
}

/**
 * Bölüm başlığı
 */
function logSection($title) {
    $line = str_repeat('=', 60);
    cronLog($line);
    cronLog($title);
    cronLog($line);
}

// Başlangıç zamanı
$scriptStartTime = microtime(true);

logSection('API FIYAT IZLEME BASLADI - ' . date('d.m.Y H:i:s'));

/**
 * API'den servisleri çek
 */
function fetchApiServices($apiUrl, $apiKey) {
    $url = rtrim($apiUrl, '/');
    
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query(['key' => $apiKey, 'action' => 'services']),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 60,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    curl_close($ch);
    
    if ($error) {
        return ['success' => false, 'error' => $error];
    }
    
    if ($httpCode !== 200) {
        return ['success' => false, 'error' => 'HTTP ' . $httpCode];
    }
    
    $services = json_decode($response, true);
    
    if (!is_array($services) || isset($services['error'])) {
        $err = isset($services['error']) ? $services['error'] : 'Gecersiz yanit';
        return ['success' => false, 'error' => $err];
    }
    
    return ['success' => true, 'services' => $services];
}

/**
 * Maliyet hesapla
 */
function calculateCost($apiRate, $quantity) {
    // API rate = 1000 adet icin fiyat
    return ($apiRate / 1000) * $quantity;
}

try {
    // Veritabanı kontrolü
    $db->query("SELECT 1");
    cronLog("Veritabani baglantisi OK");
    
    // Aktif API sağlayıcıları
    $providers = $db->query("SELECT * FROM api_providers WHERE status = 'active'")->fetchAll(PDO::FETCH_ASSOC);
    
    if (empty($providers)) {
        cronLog("Aktif API saglayicisi yok", 'WARNING');
        logSection('CRON SONLANDI');
        exit;
    }
    
    cronLog("Aktif saglayici sayisi: " . count($providers));
    
    // İstatistikler
    $stats = [
        'services_checked' => 0,
        'price_changes' => 0,
        'packages_checked' => 0,
        'packages_loss' => 0,
        'total_loss' => 0
    ];
    
    $priceChanges = [];
    $lossPackages = [];
    
    foreach ($providers as $provider) {
        cronLog("");
        cronLog("--- SAGLAYICI: {$provider['name']} (ID: {$provider['id']}) ---");
        cronLog("Rate Multiplier: {$provider['rate_multiplier']}");
        
        // API'den servisleri çek
        $result = fetchApiServices($provider['api_url'], $provider['api_key']);
        
        if (!$result['success']) {
            cronLog("API HATASI: {$result['error']}", 'ERROR');
            continue;
        }
        
        $apiServices = $result['services'];
        cronLog("API'den " . count($apiServices) . " servis alindi");
        
        // API servislerini ID'ye göre indexle
        $apiServiceMap = [];
        foreach ($apiServices as $svc) {
            $svcId = isset($svc['service']) ? $svc['service'] : null;
            if ($svcId) {
                $apiServiceMap[$svcId] = $svc;
            }
        }
        
        // Veritabanındaki MEVCUT servisleri kontrol et (yeni ekleme yok!)
        $stmt = $db->prepare("SELECT * FROM api_services WHERE provider_id = ?");
        $stmt->execute([$provider['id']]);
        $dbServices = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        cronLog("Veritabaninda " . count($dbServices) . " kayitli servis var");
        
        foreach ($dbServices as $dbService) {
            $serviceId = $dbService['service_id'];
            $stats['services_checked']++;
            
            // API'de bu servis var mı?
            if (!isset($apiServiceMap[$serviceId])) {
                cronLog("Servis API'de bulunamadi: {$dbService['name']} (ID: {$serviceId})", 'WARNING');
                continue;
            }
            
            $apiService = $apiServiceMap[$serviceId];
            $oldRate = floatval($dbService['rate']);
            $newRate = floatval($apiService['rate']);
            
            // Fiyat değişikliği kontrolü
            if ($oldRate > 0 && $oldRate != $newRate) {
                $changePercent = (($newRate - $oldRate) / $oldRate) * 100;
                
                if (abs($changePercent) >= 1) {
                    $direction = $changePercent > 0 ? 'ARTTI' : 'AZALDI';
                    
                    $changeData = [
                        'provider' => $provider['name'],
                        'service_id' => $serviceId,
                        'service_name' => $dbService['name'],
                        'old_rate' => $oldRate,
                        'new_rate' => $newRate,
                        'change_percent' => round($changePercent, 2),
                        'direction' => $changePercent > 0 ? 'up' : 'down'
                    ];
                    
                    $priceChanges[] = $changeData;
                    $stats['price_changes']++;
                    
                    cronLog("FIYAT {$direction}: {$dbService['name']}", 'PRICE');
                    cronLog("  Eski: {$oldRate} TL -> Yeni: {$newRate} TL (%{$changePercent})");
                    
                    // Veritabanını güncelle
                    $updateStmt = $db->prepare("UPDATE api_services SET rate = ?, name = ? WHERE id = ?");
                    $updateStmt->execute([$newRate, $apiService['name'], $dbService['id']]);
                }
            }
        }
        
        // Bu sağlayıcıya bağlı paketleri kontrol et
        cronLog("");
        cronLog("Paketler kontrol ediliyor...");
        
        $stmt = $db->prepare("
            SELECT p.*, c.name as category_name
            FROM packages p
            LEFT JOIN categories c ON p.category_id = c.id
            WHERE p.api_provider_id = ? 
            AND p.api_service_id IS NOT NULL 
            AND p.is_active = 1
            AND p.quantity > 0
        ");
        $stmt->execute([$provider['id']]);
        $packages = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        cronLog("API'ye bagli " . count($packages) . " aktif paket bulundu");
        
        $rateMultiplier = floatval($provider['rate_multiplier']);
        
        foreach ($packages as $pkg) {
            $stats['packages_checked']++;
            
            $pkgServiceId = $pkg['api_service_id'];
            
            // API'de bu servis var mı?
            if (!isset($apiServiceMap[$pkgServiceId])) {
                cronLog("  [!] Paket '{$pkg['name']}' icin API servisi bulunamadi (ID: {$pkgServiceId})", 'WARNING');
                continue;
            }
            
            $apiSvc = $apiServiceMap[$pkgServiceId];
            
            // Hesaplamalar
            $pkgPrice = floatval($pkg['price']);           // Bizim satis fiyatimiz
            $pkgQuantity = intval($pkg['quantity']);       // Sattığımız miktar
            $apiRate = floatval($apiSvc['rate']);          // API 1000 adet fiyati
            $adjustedRate = $apiRate * $rateMultiplier;    // Carpan uygulanmis
            
            // Bu miktar icin maliyet
            $cost = calculateCost($adjustedRate, $pkgQuantity);
            
            // Kar/Zarar
            $profit = $pkgPrice - $cost;
            $margin = $pkgPrice > 0 ? ($profit / $pkgPrice) * 100 : 0;
            
            // Onerilen minimum fiyat (%20 kar icin)
            $recommendedMin = $cost * 1.20;
            
            if ($profit < 0) {
                // ZARAR VAR!
                $stats['packages_loss']++;
                $stats['total_loss'] += abs($profit);
                
                $lossData = [
                    'package_id' => $pkg['id'],
                    'package_name' => $pkg['name'],
                    'quantity' => $pkgQuantity,
                    'sale_price' => $pkgPrice,
                    'api_rate' => $apiRate,
                    'adjusted_rate' => $adjustedRate,
                    'cost' => round($cost, 2),
                    'loss' => round(abs($profit), 2),
                    'margin' => round($margin, 2),
                    'recommended_min' => round($recommendedMin, 2)
                ];
                
                $lossPackages[] = $lossData;
                
                cronLog("  [ZARAR] {$pkg['name']}", 'LOSS');
                cronLog("    Miktar: {$pkgQuantity} adet");
                cronLog("    Satis Fiyati: {$pkgPrice} TL");
                cronLog("    API Rate: {$apiRate} TL/1K (x{$rateMultiplier} = {$adjustedRate} TL/1K)");
                cronLog("    Maliyet: " . round($cost, 2) . " TL");
                cronLog("    ZARAR: " . round(abs($profit), 2) . " TL/satis");
                cronLog("    Onerilen Min Fiyat: " . round($recommendedMin, 2) . " TL");
            } else {
                cronLog("  [OK] {$pkg['name']} - Kar: " . round($profit, 2) . " TL (%{$margin})");
            }
        }
    }
    
    // ==================== TELEGRAM BİLDİRİMLERİ ====================
    
    cronLog("");
    logSection('TELEGRAM BILDIRIMLERI');
    
    // 1. Fiyat Değişikliği Bildirimi
    if (!empty($priceChanges)) {
        cronLog("Fiyat degisikligi bildirimi gonderiliyor (" . count($priceChanges) . " adet)");
        
        $msg = "📊 <b>API Fiyat Değişikliği</b>\n\n";
        $msg .= "Toplam: " . count($priceChanges) . " servis\n";
        $msg .= "━━━━━━━━━━━━━━━━━━━━\n\n";
        
        $upCount = 0;
        $downCount = 0;
        
        foreach (array_slice($priceChanges, 0, 10) as $ch) {
            $emoji = $ch['direction'] === 'up' ? '🔴' : '🟢';
            $arrow = $ch['direction'] === 'up' ? '↑' : '↓';
            
            if ($ch['direction'] === 'up') {
                $upCount++;
            } else {
                $downCount++;
            }
            
            $name = mb_substr($ch['service_name'], 0, 35, 'UTF-8');
            $msg .= "{$emoji} <b>{$name}</b>\n";
            $msg .= "   {$ch['old_rate']}₺ → {$ch['new_rate']}₺ ({$arrow}" . abs($ch['change_percent']) . "%)\n\n";
        }
        
        if (count($priceChanges) > 10) {
            $msg .= "... ve " . (count($priceChanges) - 10) . " değişiklik daha\n\n";
        }
        
        $msg .= "━━━━━━━━━━━━━━━━━━━━\n";
        $msg .= "📈 Artan: {$upCount} | 📉 Azalan: {$downCount}\n";
        $msg .= "📅 " . date('d.m.Y H:i');
        
        $res = sendTelegramNotification($msg);
        cronLog($res['success'] ? "Bildirim gonderildi" : "Bildirim HATASI: " . $res['error'], $res['success'] ? 'OK' : 'ERROR');
        
        usleep(500000);
    }
    
    // 2. Zarar Bildirimi
    if (!empty($lossPackages)) {
        cronLog("Zarar bildirimi gonderiliyor (" . count($lossPackages) . " paket)");
        
        $msg = "🚨 <b>ZARAR EDEN PAKETLER!</b>\n\n";
        $msg .= "Toplam: " . count($lossPackages) . " paket\n";
        $msg .= "━━━━━━━━━━━━━━━━━━━━\n\n";
        
        $totalLoss = 0;
        
        foreach ($lossPackages as $lp) {
            $totalLoss += $lp['loss'];
            
            $name = mb_substr($lp['package_name'], 0, 30, 'UTF-8');
            $msg .= "❌ <b>{$name}</b>\n";
            $msg .= "📦 {$lp['quantity']} adet\n";
            $msg .= "💰 Satış: {$lp['sale_price']}₺\n";
            $msg .= "💵 Maliyet: {$lp['cost']}₺\n";
            $msg .= "📉 <b>Zarar: {$lp['loss']}₺</b>\n";
            $msg .= "💡 Önerilen: {$lp['recommended_min']}₺\n\n";
        }
        
        $msg .= "━━━━━━━━━━━━━━━━━━━━\n";
        $msg .= "💸 <b>Toplam Zarar: " . round($totalLoss, 2) . "₺/satış</b>\n";
        $msg .= "⚠️ Fiyatları güncelleyin!\n";
        $msg .= "📅 " . date('d.m.Y H:i');
        
        $res = sendTelegramNotification($msg);
        cronLog($res['success'] ? "Bildirim gonderildi" : "Bildirim HATASI: " . $res['error'], $res['success'] ? 'OK' : 'ERROR');
    }
    
    if (empty($priceChanges) && empty($lossPackages)) {
        cronLog("Bildirim gonderilecek bir sey yok - Her sey yolunda!");
    }
    
    // ==================== ÖZET ====================
    
    cronLog("");
    logSection('OZET RAPOR');
    cronLog("Kontrol edilen servis: {$stats['services_checked']}");
    cronLog("Fiyat degisikligi: {$stats['price_changes']}");
    cronLog("Kontrol edilen paket: {$stats['packages_checked']}");
    cronLog("Zarardaki paket: {$stats['packages_loss']}");
    cronLog("Toplam potansiyel zarar: " . round($stats['total_loss'], 2) . " TL/satis");
    
    $duration = round(microtime(true) - $scriptStartTime, 2);
    cronLog("Calisma suresi: {$duration} saniye");
    
    logSection('API FIYAT IZLEME TAMAMLANDI - ' . date('d.m.Y H:i:s'));
    
} catch (PDOException $e) {
    cronLog("VERITABANI HATASI: " . $e->getMessage(), 'CRITICAL');
    
    $errMsg = "🔴 <b>CRON HATA!</b>\n\n";
    $errMsg .= "Dosya: price-monitor.php\n";
    $errMsg .= "Hata: " . mb_substr($e->getMessage(), 0, 150, 'UTF-8') . "\n";
    $errMsg .= "📅 " . date('d.m.Y H:i');
    
    sendTelegramNotification($errMsg);
    
} catch (Exception $e) {
    cronLog("GENEL HATA: " . $e->getMessage(), 'CRITICAL');
}