<?php
/**
 * QNB Finansbank 3D Secure Dönüş ve Sipariş Tamamlama Dosyası
 * Konum: /magaza/odeme-sonuc.php
 */
session_start();

require_once 'includes/db.php';
require_once 'includes/functions.php';
require_once 'includes/mail.php';
require_once 'includes/sms.php';
require_once 'includes/subscription_helper.php';
require_once 'includes/QNBPay.php'; 

$kok_dizin = "/magaza/";

// 1. BANKADAN GELEN VERİYİ KONTROL ET (Artık hem GET hem POST destekliyor)
$hash_key = isset($_GET['hash_key']) ? $_GET['hash_key'] : (isset($_POST['hash_key']) ? $_POST['hash_key'] : '');

if (empty($hash_key)) {
    die("Geçersiz işlem. Banka dönüş verisi alınamadı veya yetkisiz erişim.");
}

// QNB API Bilgileri
$app_id = '25c111670437d5d1a51328f6becbac3a';
$app_secret = 'e21d68775e3ca49bf6b9947d4ab2d705';
$merchant_key = '$2y$10$RV0jSGZydTCRYi6PJGppGuIc2IirixDFgkWTa63sglfEibQjgJDQC';



$qnbPay = new QNBPay($app_id, $app_secret, $merchant_key, '18330', false);

// 2. GELEN HASH'İ DOĞRULA (Güvenlik Kontrolü)
list($status, $total, $invoiceId, $orderId, $currencyCode) = $qnbPay->validateHashKey($hash_key, $app_secret);

// Bankadan gelen direkt hata mesajını yakala (Eğer varsa)
$banka_hata_mesaji = isset($_GET['error']) ? $_GET['error'] : (isset($_POST['error']) ? $_POST['error'] : '');

// 3. ÖDEME BAŞARISIZ İSE
if ($status != '1' && strtolower($status) !== 'success') {
    // Kredi kartı hatası, kullanıcıyı ödeme adımına geri yolla
    $hata = !empty($banka_hata_mesaji) ? "Banka Reddi: " . $banka_hata_mesaji : "Kredi kartı işleminiz reddedildi veya 3D şifresi hatalı girildi.";
    $_SESSION['payment_error'] = $hata;
    header("Location: " . $kok_dizin . "odeme-adimi.php");
    exit;
}

// =========================================================================
// 4. ÖDEME BAŞARILI! SİPARİŞİ OLUŞTURMA AŞAMASINA GEÇİYORUZ
// =========================================================================

// Session'da bekleyen sipariş form verileri var mı kontrol et
if (!isset($_SESSION['pending_order_post']) || empty($_COOKIE['cart_token'])) {
    die("Güvenlik Uyarısı: Sipariş oturumu zaman aşımına uğramış. Ödemeniz alınmış olabilir, lütfen mağaza yöneticisi ile iletişime geçiniz. (Sipariş No: $invoiceId)");
}

$post_data = $_SESSION['pending_order_post'];
$cart_token = $_COOKIE['cart_token'];

// Form (Session) Verilerini Değişkenlere Aktar
$order_number = $invoiceId; 
$first_name   = trim($post_data['first_name']);
$last_name    = trim($post_data['last_name']);
$email        = trim($post_data['email']);
$phone        = trim($post_data['phone']);
$payment_method = 'credit_card'; 

try {
    $db->beginTransaction();

    // 5. KULLANICIYI BUL VEYA YENİ (GHOST) HESAP OLUŞTUR
    $user_stmt = $db->prepare("SELECT id FROM users WHERE email = ?");
    $user_stmt->execute([$email]);
    $user = $user_stmt->fetch();

    if ($user) {
        $user_id = $user['id'];
    } else {
        $random_password = password_hash(uniqid(), PASSWORD_DEFAULT); 
        $ins_user = $db->prepare("INSERT INTO users (role, name, surname, email, phone, password, status) VALUES ('customer', ?, ?, ?, ?, ?, 1)");
        $ins_user->execute([$first_name, $last_name, $email, $phone, $random_password]);
        $user_id = $db->lastInsertId();
    }

    // 6. ADRES YÖNETİMİ (TESLİMAT ADRESİ)
    $shipping_address_id = NULL;

    if (isset($post_data['selected_shipping_address_id']) && $post_data['selected_shipping_address_id'] !== 'new') {
        $shipping_address_id = (int)$post_data['selected_shipping_address_id'];
    } else {
        if (!empty($post_data['shipping_city'])) {
            $s_title = !empty($post_data['shipping_title']) ? $post_data['shipping_title'] : 'Yeni Teslimat Adresi';
            $ship_ins = $db->prepare("INSERT INTO user_addresses (user_id, title, city, district, full_address) VALUES (?, ?, ?, ?, ?)");
            $ship_ins->execute([$user_id, $s_title, $post_data['shipping_city'], $post_data['shipping_district'], $post_data['shipping_address']]);
            $shipping_address_id = $db->lastInsertId();
        }
    }

    // 7. ADRES YÖNETİMİ (FATURA ADRESİ)
    $billing_address_id = NULL;

    if (isset($post_data['same_as_shipping'])) {
        $billing_address_id = $shipping_address_id;
    } else {
        if (isset($post_data['selected_billing_address_id']) && $post_data['selected_billing_address_id'] !== 'new') {
            $billing_address_id = (int)$post_data['selected_billing_address_id'];
        } else {
            $f_baslik = ($post_data['invoice_type'] == 'corporate') ? 'Kurumsal Fatura' : 'Bireysel Fatura';
            $f_tam_adres = $post_data['billing_address'];
            
            if ($post_data['invoice_type'] == 'corporate') {
                $f_tam_adres = "Firma: {$post_data['company_name']} | VD: {$post_data['tax_office']} | VKN: {$post_data['tax_number']} \n" . $f_tam_adres;
            }

            $bill_ins = $db->prepare("INSERT INTO user_addresses (user_id, title, city, district, full_address) VALUES (?, ?, ?, ?, ?)");
            $bill_ins->execute([$user_id, $f_baslik, $post_data['billing_city'], $post_data['billing_district'], $f_tam_adres]);
            $billing_address_id = $db->lastInsertId();
        }
    }

    // 8. SEPETİ VE TUTARLARI GÜVENLİ HESAPLA (YAPAY ZEKA KARGO MOTORU)
    $cart_stmt = $db->prepare("SELECT c.id as cart_id, c.coupon_code FROM carts c WHERE c.session_token = ?");
    $cart_stmt->execute([$cart_token]);
    $cart_data = $cart_stmt->fetch();
    $cart_id = $cart_data['cart_id'];
    $coupon_code = $cart_data['coupon_code'];

    $kargo_ayarlari = $db->query("SELECT * FROM shipping_settings WHERE id = 1")->fetch(PDO::FETCH_ASSOC);
    $kargo_sabit_ucret = (float)$kargo_ayarlari['fixed_fee'];
    $kargo_tutar_baraji = (float)$kargo_ayarlari['free_amount_limit'];
    $kargo_tutar_aktif = (bool)$kargo_ayarlari['free_amount_status'];
    $kargo_adet_baraji = (int)$kargo_ayarlari['free_quantity_limit'];
    $kargo_adet_aktif = (bool)$kargo_ayarlari['free_quantity_status'];
    $kargo_hedef_kategoriler = $kargo_ayarlari['target_categories'] ? explode(',', $kargo_ayarlari['target_categories']) : [];

    $items_stmt = $db->prepare("
        SELECT ci.quantity, p.id as product_id, p.price, p.discount_price, p.type, p.duration_days, p.is_free_shipping, p.category_id 
        FROM cart_items ci JOIN products p ON ci.product_id = p.id WHERE ci.cart_id = ?
    ");
    $items_stmt->execute([$cart_id]);
    $sepet_urunleri = $items_stmt->fetchAll();

    $ara_toplam = 0;
    $indirim = 0;
    $fiziksel_urun_var_mi = false;
    $vip_kargo_var_mi = false; 
    $adet_kampanyasina_dahil_urun_sayisi = 0; 

    foreach ($sepet_urunleri as $urun) {
        $fiyat = ($urun['discount_price'] > 0) ? $urun['discount_price'] : $urun['price'];
        $ara_toplam += ($fiyat * $urun['quantity']);
        
        if (in_array($urun['type'], ['physical', 'subscription', 'exam_package', 'single_exam'])) {
            $fiziksel_urun_var_mi = true;
        }
        if ($urun['is_free_shipping'] == 1) {
            $vip_kargo_var_mi = true;
        }
        if (in_array($urun['category_id'], $kargo_hedef_kategoriler)) {
            $adet_kampanyasina_dahil_urun_sayisi += $urun['quantity'];
        }
    }

    if ($coupon_code) {
        $cpn = $db->prepare("SELECT * FROM coupons WHERE code = ? AND status = 1");
        $cpn->execute([$coupon_code]);
        $k = $cpn->fetch();
        if ($k && ($k['min_cart_amount'] == 0 || $ara_toplam >= $k['min_cart_amount'])) {
            $indirim = ($k['discount_type'] == 'percentage') ? ($ara_toplam * $k['discount_value'] / 100) : $k['discount_value'];
            if ($indirim > $ara_toplam) $indirim = $ara_toplam;
            $db->prepare("UPDATE coupons SET used_count = used_count + 1 WHERE id = ?")->execute([$k['id']]);
        }
    }

    $kargo = 0;
    $odenecek_ara_toplam = $ara_toplam - $indirim;

    if ($fiziksel_urun_var_mi) {
        if ($vip_kargo_var_mi) { $kargo = 0; }
        elseif ($kargo_tutar_aktif && $odenecek_ara_toplam >= $kargo_tutar_baraji) { $kargo = 0; }
        elseif ($kargo_adet_aktif && $adet_kampanyasina_dahil_urun_sayisi >= $kargo_adet_baraji) { $kargo = 0; }
        else { $kargo = $kargo_sabit_ucret; }
    }

    $genel_toplam = $odenecek_ara_toplam + $kargo;

    // 9. ANA SİPARİŞ KAYDINI OLUŞTUR
    $order_status = 'processing';
    $order_ins = $db->prepare("INSERT INTO orders (user_id, order_number, total_amount, shipping_amount, shipping_address_id, billing_address_id, status) VALUES (?, ?, ?, ?, ?, ?, ?)");
    $order_ins->execute([$user_id, $order_number, $genel_toplam, $kargo, $shipping_address_id, $billing_address_id, $order_status]);
    $order_id = $db->lastInsertId();

    // 10. ÜRÜNLERİ AKTAR, STOKLARI DÜŞÜR VE LOJİSTİK PLANLA
    foreach ($sepet_urunleri as $urun) {
        $b_fiyat = ($urun['discount_price'] > 0) ? $urun['discount_price'] : $urun['price'];
        
        $db->prepare("INSERT INTO order_items (order_id, product_id, quantity, unit_price) VALUES (?, ?, ?, ?)")
           ->execute([$order_id, $urun['product_id'], $urun['quantity'], $b_fiyat]);

        if ($urun['type'] == 'physical' || $urun['type'] == 'single_exam') {
            $db->prepare("UPDATE products SET stock_quantity = stock_quantity - ? WHERE id = ?")->execute([$urun['quantity'], $urun['product_id']]);
        }
        
        if ($urun['type'] == 'exam_package') {
            $pkg_stmt = $db->prepare("SELECT exam_product_id, delivery_sequence, delivery_date FROM package_items WHERE package_product_id = ?");
            $pkg_stmt->execute([$urun['product_id']]);
            $package_items = $pkg_stmt->fetchAll();

            foreach ($package_items as $p_item) {
                $db->prepare("UPDATE products SET stock_quantity = stock_quantity - ? WHERE id = ?")
                   ->execute([$urun['quantity'], $p_item['exam_product_id']]);

                $del_ins = $db->prepare("INSERT INTO order_deliveries (order_id, package_id, exam_id, delivery_sequence, planned_date, status) VALUES (?, ?, ?, ?, ?, 'pending')");
                $del_ins->execute([$order_id, $urun['product_id'], $p_item['exam_product_id'], $p_item['delivery_sequence'], $p_item['delivery_date']]);
            }
        }

        if ($urun['type'] == 'subscription') {
            $gun = $urun['duration_days'] ?: 30; 
            $b_tarih = date('Y-m-d');
            $s_tarih = date('Y-m-d', strtotime("+$gun days"));
            
            $sub_ins = $db->prepare("INSERT INTO subscriptions (user_id, product_id, status, start_date, end_date) VALUES (?, ?, 'active', ?, ?)");
            $sub_ins->execute([$user_id, $urun['product_id'], $b_tarih, $s_tarih]);
            $new_sub_id = $db->lastInsertId();

            createSubscriptionSchedule($db, $new_sub_id);
        }
    }

    // 11. ÖDEME KAYDINI GİR
    $db->prepare("INSERT INTO payments (order_id, payment_method, amount, status) VALUES (?, ?, ?, ?)")
       ->execute([$order_id, $payment_method, $genel_toplam, 'approved']);

    // 12. SEPETİ TEMİZLE VE ÇEREZİ ÖLDÜR
    $db->prepare("DELETE FROM carts WHERE session_token = ?")->execute([$cart_token]);
    setcookie('cart_token', '', time() - 3600, "/");

    unset($_SESSION['pending_order_post']);
    unset($_SESSION['pending_order_amount']);
    
    // --- E-Posta Gönderimi ---
    $mail_konu = "Siparişiniz Alındı ve Onaylandı - Sipariş No: " . $order_number;
    $mail_icerik = "Merhaba " . $first_name . " " . $last_name . ",<br><br>";
    $mail_icerik .= "SINAVKOCU Mağaza'dan vermiş olduğunuz <strong>" . $order_number . "</strong> numaralı siparişiniz başarıyla alınmış ve kredi kartı ödemeniz onaylanmıştır.<br>";
    $mail_icerik .= "<strong>Tahsil Edilen Tutar:</strong> " . number_format($genel_toplam, 2, ',', '.') . " ₺<br><br>";
    $mail_icerik .= "Siparişiniz en kısa sürede hazırlanıp kargoya teslim edilecektir.<br><br>";
    $mail_icerik .= "Bizi tercih ettiğiniz için teşekkür ederiz.<br><strong>SINAVKOCU Mağaza Ekibi</strong>";

    sendSystemMail($email, $mail_konu, $mail_icerik);

    // --- Müşteri SMS Gönderimi (Mevcut Kod) ---
    $sms_mesaj = "SINAVKOCU Magaza: Sayin " . $first_name . " " . $last_name . ", " . $order_number . " numarali siparisiniz ve kredi karti odemeniz basariyla onaylanmistir. Tesekkur ederiz.";
    sms_send_simple($phone, $sms_mesaj);

    // --- YÖNETİCİ BİLDİRİMLERİ (YENİ EKLENEN KISIM) ---
    $admin_email = "magaza@sinavkocu.tr";
    $admin_mail_konu = "Yeni Sipariş Geldi (Kredi Kartı) - Sipariş No: " . $order_number;
    $admin_mail_icerik = "Merhaba Yönetici,<br><br>Sisteme kredi kartı ile ödenmiş yeni bir sipariş düştü. Detaylar:<br><br>
    <strong>Sipariş No:</strong> $order_number<br>
    <strong>Müşteri:</strong> $first_name $last_name ($phone - $email)<br>
    <strong>Tutar:</strong> " . number_format($genel_toplam, 2, ',', '.') . " ₺<br><br>
    İyi çalışmalar.";
    sendSystemMail($admin_email, $admin_mail_konu, $admin_mail_icerik);

    $admin_sms_mesaj = "Sisteme $order_number numarali yeni bir siparis geldi (Kredi Karti). Tutar: " . number_format($genel_toplam, 2, ',', '.') . " TL.";
    sms_send_simple("05305978087", $admin_sms_mesaj);
    sms_send_simple("05453168686", $admin_sms_mesaj);
    // --------------------------------------------------

    // === HER ŞEY TAMAMSA VERİYİ ONAYLA ===
    $db->commit();

    // 14. SONUÇ SAYFASINA YÖNLENDİR (Görsel Teşekkür Sayfası)
    header("Location: siparis-sonuc.php?siparis_no=" . $order_number);
    exit;

} catch (Exception $e) {
    $db->rollBack();
    error_log("KRİTİK HATA: Banka onayladı ama sipariş yazılamadı! Sipariş No: $invoiceId - Hata: " . $e->getMessage());
    die("Ödemeniz banka tarafından onaylandı ancak sistemde bir hata oluştu. Lütfen $invoiceId numaralı işlem koduyla müşteri hizmetlerine ulaşınız. Hata detayı: " . $e->getMessage());
}
?>