<?php
/**
 * Sipariş Tamamlama, Lojistik Başlatma ve Stok Zekası Motoru
 * Konum: /magaza/siparis-tamamla.php
 */

require_once 'includes/db.php';
require_once 'includes/functions.php';

// KRİTİK: İletişim ve Lojistik Dosyalarını Dahil Ediyoruz
require_once 'includes/mail.php';
require_once 'includes/sms.php';
require_once 'includes/subscription_helper.php';

// 1. GÜVENLİK VE SEPET KONTROLÜ
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    die("Geçersiz erişim denemesi.");
}

$cart_token = isset($_COOKIE['cart_token']) ? $_COOKIE['cart_token'] : '';
if (!$cart_token) {
    header("Location: sepet.php");
    exit;
}

// 2. FORM VERİLERİNİ AL (İletişim ve Genel)
$order_number = $_POST['order_number'];
$first_name   = trim($_POST['first_name']);
$last_name    = trim($_POST['last_name']);
$email        = trim($_POST['email']);
$phone        = trim($_POST['phone']);
$payment_method = $_POST['payment_method'];

try {
    // === VERİTABANI İŞLEMİ (TRANSACTION) BAŞLAT ===
    $db->beginTransaction();

    // 3. 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 {
        // Otomatik hayalet kayıt: Şifresiz hesap açılır
        $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();
    }

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

    if (isset($_POST['selected_shipping_address_id']) && $_POST['selected_shipping_address_id'] !== 'new') {
        $shipping_address_id = (int)$_POST['selected_shipping_address_id'];
    } else {
        if (!empty($_POST['shipping_city'])) {
            $s_title = !empty($_POST['shipping_title']) ? $_POST['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['shipping_city'], $_POST['shipping_district'], $_POST['shipping_address']]);
            $shipping_address_id = $db->lastInsertId();
        }
    }

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

    if (isset($_POST['same_as_shipping'])) {
        $billing_address_id = $shipping_address_id;
    } else {
        if (isset($_POST['selected_billing_address_id']) && $_POST['selected_billing_address_id'] !== 'new') {
            $billing_address_id = (int)$_POST['selected_billing_address_id'];
        } else {
            $f_baslik = ($_POST['invoice_type'] == 'corporate') ? 'Kurumsal Fatura' : 'Bireysel Fatura';
            $f_tam_adres = $_POST['billing_address'];
            
            if ($_POST['invoice_type'] == 'corporate') {
                $f_tam_adres = "Firma: {$_POST['company_name']} | VD: {$_POST['tax_office']} | VKN: {$_POST['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['billing_city'], $_POST['billing_district'], $f_tam_adres]);
            $billing_address_id = $db->lastInsertId();
        }
    }

    // --------------------------------------------------------
    // 6. 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 Ayarlarını Çek
    $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']) : [];

    // Sepetteki ürünlerin güncel fiyatlarını çek
    $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']);
        
        // Kargo gerektiren ürün kontrolü
        if (in_array($urun['type'], ['physical', 'subscription', 'exam_package', 'single_exam'])) {
            $fiziksel_urun_var_mi = true;
        }

        // VIP Kargo Şemsiyesi
        if ($urun['is_free_shipping'] == 1) {
            $vip_kargo_var_mi = true;
        }

        // Kategori Bazlı Adet Kampanyası Kontrolü
        if (in_array($urun['category_id'], $kargo_hedef_kategoriler)) {
            $adet_kampanyasina_dahil_urun_sayisi += $urun['quantity'];
        }
    }

    // Kuponu tekrar sorgula ve düş
    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']]);
        }
    }

    // YENİ: Akıllı Kargo Karar Motoru
    $kargo = 0;
    $odenecek_ara_toplam = $ara_toplam - $indirim;

    if ($fiziksel_urun_var_mi) {
        if ($vip_kargo_var_mi) {
            $kargo = 0; // Şemsiye kuralı: Bir tane VIP varsa hepsi bedava
        } elseif ($kargo_tutar_aktif && $odenecek_ara_toplam >= $kargo_tutar_baraji) {
            $kargo = 0; // Tutar barajı geçildi
        } elseif ($kargo_adet_aktif && $adet_kampanyasina_dahil_urun_sayisi >= $kargo_adet_baraji) {
            $kargo = 0; // Adet barajı geçildi
        } else {
            $kargo = $kargo_sabit_ucret; // Hiçbir kampanya tutmadıysa sabit ücret
        }
    }

    $genel_toplam = $odenecek_ara_toplam + $kargo;

    // 7. ANA SİPARİŞ KAYDINI OLUŞTUR (orders tablosu)
    $order_status = ($payment_method == 'bank_transfer') ? 'pending' : '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();

    // --------------------------------------------------------
    // 8. Ü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'];
        
        // Sipariş kalemi olarak ekle
        $db->prepare("INSERT INTO order_items (order_id, product_id, quantity, unit_price) VALUES (?, ?, ?, ?)")
           ->execute([$order_id, $urun['product_id'], $urun['quantity'], $b_fiyat]);

        // A. FİZİKSEL VEYA TEKLİ DENEME STOK DÜŞÜMÜ
        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']]);
        }
        
        // B. DENEME PAKETİ KUTU AÇILIMI (STOK VE LOJİSTİK)
        if ($urun['type'] == 'exam_package') {
            // Paketin içindeki denemeleri ve kargo tarihlerini bul
            $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) {
                // Alt ürünün stoğunu düşür (Paketten kaç tane alındıysa o kadar çarpılarak düşer)
                $db->prepare("UPDATE products SET stock_quantity = stock_quantity - ? WHERE id = ?")
                   ->execute([$urun['quantity'], $p_item['exam_product_id']]);

                // Kargo departmanı için Lojistik (Teslimat Takvimi) kaydı oluştur
                $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']]);
            }
        }

        // C. ABONELİK PLANLAMASI (Mevcut Kod)
        if ($urun['type'] == 'subscription') {
            $gun = $urun['duration_days'] ?: 30; // Ürün tablosundan al
            $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);
        }
    }

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

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

    // =========================================================================
    // 11. BİLDİRİMLERİ GÖNDER (GELİŞMİŞ İLETİŞİM MOTORU)
    // =========================================================================
    
    // --- E-Posta Gönderimi ---
    $mail_konu = "Siparişiniz Alındı - 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ıştır.<br>";
    $mail_icerik .= "<strong>Toplam Tutar:</strong> " . number_format($genel_toplam, 2, ',', '.') . " ₺<br><br>";

    // Havale/EFT ise ekstra banka bilgilerini ekle
    if ($payment_method == 'bank_transfer') {
        $mail_icerik .= "<div style='background-color: #fff8e1; border: 1px solid #ffe082; padding: 15px; border-radius: 5px; margin-bottom: 20px;'>";
        $mail_icerik .= "<h3 style='margin-top:0; color: #ff8f00;'>Ödemeniz Bekleniyor (Havale / EFT)</h3>";
        $mail_icerik .= "Siparişinizin onaylanıp işleme alınması için aşağıdaki banka hesabımıza ödemenizi yapmanız gerekmektedir:<br><br>";
        $mail_icerik .= "<strong>Banka:</strong> EnPara A.Ş.<br>";
        $mail_icerik .= "<strong>Alıcı:</strong> Sinerji Rehberlik Danışmanlık Sanayi Ticaret Limited Şirketi<br>";
        $mail_icerik .= "<strong>IBAN:</strong> TR82 0015 7000 0000 0099 0920 96<br><br>";
        $mail_icerik .= "<strong style='color:red;'>ÖNEMLİ:</strong> Lütfen açıklama kısmına SADECE <strong>" . $order_number . "</strong> yazmayı unutmayınız.";
        $mail_icerik .= "</div>";
    } else {
        $mail_icerik .= "Ödemeniz başarıyla alınmıştır. Siparişiniz en kısa sürede hazırlanacaktır.<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 alinmistir. ";
    if ($payment_method == 'bank_transfer') {
        $sms_mesaj .= "Siparisinizin onaylanmasi icin havale/EFT isleminizi tamamlamanizi rica ederiz. ";
    }
    $sms_mesaj .= "Bizi tercih ettiginiz icin tesekkurler.";

    sms_send_simple($phone, $sms_mesaj);

    // --- YÖNETİCİ BİLDİRİMLERİ (YENİ EKLENEN KISIM) ---
    $admin_email = "magaza@sinavkocu.tr";
    $odeme_tipi_yazi = ($payment_method == 'bank_transfer') ? 'Havale/EFT (Ödeme Bekliyor)' : 'Kredi Kartı';
    $admin_mail_konu = "Yeni Sipariş Geldi - Sipariş No: " . $order_number;
    $admin_mail_icerik = "Merhaba Yönetici,<br><br>Sisteme 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>
    <strong>Ödeme Tipi:</strong> $odeme_tipi_yazi<br><br>
    İyi çalışmalar.";
    sendSystemMail($admin_email, $admin_mail_konu, $admin_mail_icerik);

    // Admin SMS'lerinde Türkçe karakter kullanmıyoruz (1sms uyumluluğu için)
    $admin_sms_mesaj = "Sisteme $order_number numarali yeni bir siparis geldi. Tutar: " . number_format($genel_toplam, 2, ',', '.') . " TL. Odeme: $odeme_tipi_yazi.";
    sms_send_simple("05305978087", $admin_sms_mesaj);
    sms_send_simple("05453168686", $admin_sms_mesaj);
    // --------------------------------------------------

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

    // SONUÇ SAYFASINA YÖNLENDİR
    header("Location: siparis-sonuc.php?siparis_no=" . $order_number);
    exit;

} catch (Exception $e) {
    // HATA DURUMUNDA TÜM İŞLEMLERİ GERİ AL (Transaction Güvenliği)
    $db->rollBack();
    die("Sistem Hatası: " . $e->getMessage());
}
?>