<?php
require_once 'includes/db.php';

// Güvenlik: Sadece POST isteklerini kabul et
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    die(json_encode(['status' => 'error', 'message' => 'Geçersiz istek türü.']));
}

// 1. ZİYARETÇİ İÇİN SEPET JETONU OLUŞTUR VEYA BUL
if (!isset($_COOKIE['cart_token'])) {
    $cart_token = bin2hex(random_bytes(16));
    setcookie('cart_token', $cart_token, time() + (86400 * 30), "/");
} else {
    $cart_token = $_COOKIE['cart_token'];
}

// Sepeti veritabanında bul, yoksa oluştur
$cart_stmt = $db->prepare("SELECT id FROM carts WHERE session_token = ?");
$cart_stmt->execute([$cart_token]);
$cart = $cart_stmt->fetch();

if (!$cart) {
    $insert_cart = $db->prepare("INSERT INTO carts (session_token) VALUES (?)");
    $insert_cart->execute([$cart_token]);
    $cart_id = $db->lastInsertId();
} else {
    $cart_id = $cart['id'];
}

$action = isset($_POST['action']) ? $_POST['action'] : '';

try {
    if ($action === 'add') {
        $product_id = (int)$_POST['product_id'];
        $quantity = isset($_POST['quantity']) ? (int)$_POST['quantity'] : 1;
        if ($quantity < 1) $quantity = 1;

        $prod_stmt = $db->prepare("SELECT id, name, stock_quantity, type, status FROM products WHERE id = ?");
        $prod_stmt->execute([$product_id]);
        $product = $prod_stmt->fetch();

        if (!$product || $product['status'] == 0) {
            echo json_encode(['status' => 'error', 'message' => 'Bu ürün satışta değil.']); exit;
        }

        if ($product['type'] == 'physical') {
            $check_item = $db->prepare("SELECT quantity FROM cart_items WHERE cart_id = ? AND product_id = ?");
            $check_item->execute([$cart_id, $product_id]);
            $existing_item = $check_item->fetch();
            $total_req = $existing_item ? ($existing_item['quantity'] + $quantity) : $quantity;

            if ($product['stock_quantity'] < $total_req) {
                echo json_encode(['status' => 'error', 'message' => 'Yetersiz stok! En fazla '.$product['stock_quantity'].' eklenebilir.']); exit;
            }
        }

        $add_stmt = $db->prepare("INSERT INTO cart_items (cart_id, product_id, quantity) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE quantity = quantity + ?");
        $add_stmt->execute([$cart_id, $product_id, $quantity, $quantity]);

        echo json_encode(['status' => 'success', 'message' => $product['name'] . ' sepete eklendi!']); exit;

    } elseif ($action === 'remove') {
        $item_id = (int)$_POST['item_id'];
        $del_stmt = $db->prepare("DELETE FROM cart_items WHERE id = ? AND cart_id = ?");
        $del_stmt->execute([$item_id, $cart_id]);
        echo json_encode(['status' => 'success', 'message' => 'Ürün sepetten çıkarıldı.']); exit;

    } elseif ($action === 'update') {
        $item_id = (int)$_POST['item_id'];
        $new_qty = (int)$_POST['quantity'];
        if ($new_qty < 1) { echo json_encode(['status' => 'error', 'message' => 'Geçersiz miktar.']); exit; }

        $chk_stmt = $db->prepare("SELECT ci.id, p.stock_quantity, p.type FROM cart_items ci JOIN products p ON ci.product_id = p.id WHERE ci.id = ? AND ci.cart_id = ?");
        $chk_stmt->execute([$item_id, $cart_id]);
        $item = $chk_stmt->fetch();

        if ($item) {
            if ($item['type'] == 'physical' && $item['stock_quantity'] < $new_qty) {
                echo json_encode(['status' => 'error', 'message' => 'Stok yetersiz!']); exit;
            }
            $upd_stmt = $db->prepare("UPDATE cart_items SET quantity = ? WHERE id = ?");
            $upd_stmt->execute([$new_qty, $item_id]);
            echo json_encode(['status' => 'success', 'message' => 'Miktar güncellendi.']); exit;
        }

    } 
    // --- YENİ: KUPON KODU UYGULAMA ALANI ---
    elseif ($action === 'apply_coupon') {
        $code = trim($_POST['coupon_code']);
        
        if (empty($code)) {
            echo json_encode(['status' => 'error', 'message' => 'Lütfen bir kupon kodu girin.']); exit;
        }

        // Kuponu Veritabanında Ara
        $stmt = $db->prepare("SELECT * FROM coupons WHERE code = ? AND status = 1");
        $stmt->execute([$code]);
        $coupon = $stmt->fetch();

        if (!$coupon) {
            echo json_encode(['status' => 'error', 'message' => 'Geçersiz veya süresi dolmuş kupon kodu.']); exit;
        }

        // Süre Kontrolü
        if ($coupon['valid_until'] && strtotime($coupon['valid_until']) < time()) {
            echo json_encode(['status' => 'error', 'message' => 'Bu kupon kodunun kullanım süresi dolmuştur.']); exit;
        }

        // Kullanım Limiti Kontrolü
        if ($coupon['usage_limit'] && $coupon['used_count'] >= $coupon['usage_limit']) {
            echo json_encode(['status' => 'error', 'message' => 'Bu kupon kodu maksimum kullanım limitine ulaşmıştır.']); exit;
        }

        // Sepet Alt Limit Kontrolü İçin Sepet Toplamını Hesapla
        $calc_stmt = $db->prepare("
            SELECT SUM(ci.quantity * COALESCE(NULLIF(p.discount_price, 0), p.price)) as subtotal 
            FROM cart_items ci 
            JOIN products p ON ci.product_id = p.id 
            WHERE ci.cart_id = ?
        ");
        $calc_stmt->execute([$cart_id]);
        $subtotal = $calc_stmt->fetchColumn() ?: 0;

        if ($coupon['min_cart_amount'] > 0 && $subtotal < $coupon['min_cart_amount']) {
            echo json_encode(['status' => 'error', 'message' => 'Bu kuponu kullanabilmek için sepetiniz en az ' . number_format($coupon['min_cart_amount'], 2) . ' ₺ olmalıdır.']); exit;
        }

        // Sepete Kuponu Tanımla
        $upd = $db->prepare("UPDATE carts SET coupon_code = ? WHERE id = ?");
        $upd->execute([$coupon['code'], $cart_id]);
        
        echo json_encode(['status' => 'success', 'message' => 'Kupon başarıyla uygulandı!']); exit;

    } 
    // --- YENİ: KUPONU İPTAL ETME ---
    elseif ($action === 'remove_coupon') {
        $upd = $db->prepare("UPDATE carts SET coupon_code = NULL WHERE id = ?");
        $upd->execute([$cart_id]);
        echo json_encode(['status' => 'success', 'message' => 'Kupon iptal edildi.']); exit;
    }

} catch (Exception $e) {
    echo json_encode(['status' => 'error', 'message' => 'Bir sistem hatası oluştu: ' . $e->getMessage()]);
}
?>