<?php
/**
 * iyzico Ödeme Callback Sayfası
 * Ödeme sonucunu alır, siparişi günceller ve Telegram bildirimi gönderir
 * 
 * @version 1.0.0
 */

// Config'i dahil et
require_once __DIR__ . '/config.php';

// Telegram bildirim fonksiyonlarını dahil et
require_once __DIR__ . '/includes/telegram.php';

// iyzico helper'ı dahil et
require_once __DIR__ . '/includes/iyzico.php';

// Token kontrolü
$token = $_POST['token'] ?? $_GET['token'] ?? null;

if (empty($token)) {
    setFlash('error', 'Geçersiz ödeme işlemi.');
    redirect(SITE_URL);
    exit;
}

// iyzico instance
$iyzico = getIyzicoInstance($db, $settings);

// SDK yüklü mü kontrol et
if (!$iyzico->isSDKLoaded()) {
    setFlash('error', 'Ödeme sistemi yapılandırması hatalı.');
    redirect(SITE_URL);
    exit;
}

// Ödeme sonucunu al
$result = $iyzico->retrieveCheckoutForm($token);

// Token ile siparişi bul
$order = $iyzico->findOrderByToken($token);

if (!$order) {
    // Conversation ID ile dene
    if (!empty($result['conversation_id'])) {
        $order = $iyzico->findOrderByConversationId($result['conversation_id']);
    }
    
    if (!$order) {
        setFlash('error', 'Sipariş bulunamadı.');
        redirect(SITE_URL);
        exit;
    }
}

// Sipariş zaten işlenmiş mi kontrol et
if ($order['status'] === 'paid' || $order['status'] === 'completed') {
    // Zaten başarılı, başarı sayfasına yönlendir
    $_SESSION['order_success'] = [
        'order_number' => $order['order_number'],
        'package_name' => $order['package_name'],
        'amount' => $order['amount'],
        'discount' => $order['discount_amount'],
        'payment_method' => 'iyzico',
        'already_processed' => true
    ];
    
    redirect(SITE_URL . '/siparis-basarili.php');
    exit;
}

// ==================== ÖDEME BAŞARILI ====================
if ($result['success']) {
    
    // Siparişi güncelle
    $updateResult = $iyzico->updateOrderPayment($order['id'], $result);
    
    if ($updateResult) {
        
        // ==================== TELEGRAM BİLDİRİMİ ====================
        try {
            // Sipariş verilerini hazırla
            $orderDataTelegram = [
                'order_number' => $order['order_number'],
                'customer_name' => $order['customer_name'],
                'customer_email' => $order['customer_email'],
                'customer_phone' => $order['customer_phone'],
                'social_media_link' => $order['social_media_link'],
                'amount' => $order['amount'],
                'discount_amount' => $order['discount_amount'] ?? 0,
                'coupon_code' => $order['coupon_code'] ?? null,
                'kdv_amount' => $order['kdv_amount'] ?? 0
            ];
            
            // Paket verilerini hazırla
            $packageDataTelegram = [
                'name' => $order['package_name'],
                'category_name' => $order['category_name']
            ];
            
            // Yeni sipariş bildirimi
            sendNewOrderNotification($orderDataTelegram, $packageDataTelegram);
            
            // Ödeme bildirimi (kredi kartı ile ödendi)
            sendIyzicoPaymentNotification($orderDataTelegram, $packageDataTelegram, $result);
            
        } catch (Exception $e) {
            // Telegram hatası siparişi etkilemesin
            error_log('iyzico callback - Telegram bildirim hatası: ' . $e->getMessage());
        }
        // ==================== TELEGRAM BİLDİRİMİ SON ====================
        
        // Session'a başarı bilgilerini kaydet
        $_SESSION['order_success'] = [
            'order_number' => $order['order_number'],
            'package_name' => $order['package_name'],
            'amount' => $order['amount'],
            'discount' => $order['discount_amount'] ?? 0,
            'original_amount' => $order['amount'] + ($order['discount_amount'] ?? 0),
            'kdv_enabled' => !empty($order['kdv_rate']),
            'kdv_rate' => $order['kdv_rate'] ?? 0,
            'kdv_amount' => $order['kdv_amount'] ?? 0,
            'payment_method' => 'iyzico',
            'card_family' => $result['card_family'] ?? null,
            'card_association' => $result['card_association'] ?? null,
            'last_four' => $result['last_four_digits'] ?? null,
            'installment' => $result['installment'] ?? 1
        ];
        
        // iyzico session'ı temizle
        unset($_SESSION['iyzico_order']);
        
        // Başarılı sayfasına yönlendir
        redirect(SITE_URL . '/siparis-basarili.php');
        exit;
        
    } else {
        // Veritabanı güncelleme hatası
        error_log('iyzico callback - DB update error for order: ' . $order['order_number']);
        
        setFlash('error', 'Ödemeniz alındı ancak sipariş güncellenirken bir hata oluştu. Lütfen bizimle iletişime geçin. Sipariş No: ' . $order['order_number']);
        redirect(SITE_URL . '/iletisim.php');
        exit;
    }
    
}

// ==================== ÖDEME BAŞARISIZ ====================
else {
    
    // Siparişi iptal olarak işaretle
    try {
        $errorMessage = $result['error_message'] ?? 'Bilinmeyen hata';
        $errorCode = $result['error_code'] ?? 'UNKNOWN';
        
        $stmt = $db->prepare("
            UPDATE orders SET 
                status = 'cancelled',
                admin_note = ?,
                updated_at = NOW()
            WHERE id = ?
        ");
        $stmt->execute([
            'iyzico ödeme hatası: [' . $errorCode . '] ' . $errorMessage,
            $order['id']
        ]);
        
        // Kupon kullanıldıysa geri al
        if (!empty($order['coupon_id'])) {
            $db->prepare("UPDATE coupons SET usage_count = usage_count - 1 WHERE id = ? AND usage_count > 0")->execute([$order['coupon_id']]);
            $db->prepare("DELETE FROM coupon_usage WHERE order_id = ?")->execute([$order['id']]);
        }
        
        // Paket satış sayısını geri al
        $db->prepare("UPDATE packages SET total_sales = total_sales - 1 WHERE id = ? AND total_sales > 0")->execute([$order['package_id']]);
        
    } catch (PDOException $e) {
        error_log('iyzico callback - Cancel update error: ' . $e->getMessage());
    }
    
    // iyzico session'ı temizle
    unset($_SESSION['iyzico_order']);
    
    // Hata mesajını belirle
    $userErrorMessage = 'Ödeme işlemi başarısız oldu.';
    
    // Yaygın hata kodlarına göre kullanıcı dostu mesajlar
    $errorCode = $result['error_code'] ?? '';
    $errorMessage = $result['error_message'] ?? '';
    
    if (stripos($errorMessage, 'insufficient') !== false || stripos($errorMessage, 'yetersiz') !== false) {
        $userErrorMessage = 'Kartınızda yeterli bakiye bulunmuyor.';
    } elseif (stripos($errorMessage, 'invalid card') !== false || stripos($errorMessage, 'geçersiz kart') !== false) {
        $userErrorMessage = 'Kart bilgileri geçersiz. Lütfen kontrol edip tekrar deneyin.';
    } elseif (stripos($errorMessage, 'expired') !== false || stripos($errorMessage, 'süresi') !== false) {
        $userErrorMessage = 'Kartınızın süresi dolmuş.';
    } elseif (stripos($errorMessage, '3d') !== false || stripos($errorMessage, 'secure') !== false) {
        $userErrorMessage = '3D Secure doğrulaması başarısız oldu.';
    } elseif (stripos($errorMessage, 'limit') !== false) {
        $userErrorMessage = 'Kart limiti aşıldı.';
    } elseif (stripos($errorMessage, 'blocked') !== false || stripos($errorMessage, 'bloke') !== false) {
        $userErrorMessage = 'Kartınız bloke edilmiş. Lütfen bankanızla iletişime geçin.';
    } elseif (!empty($errorMessage)) {
        $userErrorMessage = 'Ödeme hatası: ' . $errorMessage;
    }
    
    setFlash('error', $userErrorMessage . ' Farklı bir kart deneyebilir veya havale/EFT ile ödeme yapabilirsiniz.');
    redirect(SITE_URL . '/odeme.php?paket=' . $order['package_id']);
    exit;
}