<?php
/**
 * Sınav Koçu - Genel Fonksiyonlar (Merkezi Motor)
 * Konum: /includes/functions.php
 */

// 1. OTURUM KONTROLÜ
// -------------------------------------------------------------------------
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

/**
 * SEO Uyumlu Link (Slug) Oluşturucu
 * Türkçe karakterleri temizler ve URL dostu metin üretir.
 */
function seoLink($str) {
    $str = mb_strtolower($str, 'UTF-8');
    $str = str_replace(
        ['ı', 'ğ', 'ü', 'ş', 'ö', 'ç', ' ', 'İ', 'Ğ', 'Ü', 'Ş', 'Ö', 'Ç'],
        ['i', 'g', 'u', 's', 'o', 'c', '-', 'i', 'g', 'u', 's', 'o', 'c'],
        $str
    );
    $str = preg_replace('/[^a-z0-9\-]/', '', $str); // Sadece harf, rakam ve tire
    $str = preg_replace('/-+/', '-', $str); // Çoklu tireyi teke düşür
    return trim($str, '-');
}

/**
 * Admin Yetki Kontrolü
 * Senior Dokunuşu: Oturum yoksa veya yetki 'admin' değilse girişe yönlendirir.
 */
function adminCheck() {
    if (!isset($_SESSION['admin_id']) || $_SESSION['admin_role'] !== 'admin') {
        // Alt klasörlerden ana dizindeki login'e gitmeyi garantiler
        header("Location: /magaza/admin/login.php");
        exit;
    }
}

/**
 * Fiyat Formatlayıcı
 * Örn: 1500.50 -> 1.500,50 ₺
 */
function formatPrice($price) {
    return number_format((float)$price, 2, ',', '.') . ' ₺';
}

/**
 * Tarih Formatlayıcı
 * Örn: 2026-03-14 15:30 -> 14.03.2026 15:30
 */
function formatDate($date, $full = true) {
    if (!$date || $date == '0000-00-00' || $date == '0000-00-00 00:00:00') return '-';
    $format = $full ? 'd.m.Y H:i' : 'd.m.Y';
    return date($format, strtotime($date));
}

/**
 * Durum Rozeti (Badge) Oluşturucu
 * ÇAKIŞMA KORUMALI: Eğer başka sayfada tanımlanmışsa hata vermez.
 */
if (!function_exists('getStatusBadge')) {
    function getStatusBadge($status, $type = 'order') {
        $badges = [];
        
        switch ($type) {
            case 'order':
                $badges = [
                    'pending'   => '<span class="badge bg-warning text-dark">Bekliyor</span>',
                    'completed' => '<span class="badge bg-success">Tamamlandı</span>',
                    'shipped'   => '<span class="badge bg-primary">Kargolandı</span>',
                    'cancelled' => '<span class="badge bg-danger">İptal</span>'
                ];
                break;
                
            case 'subscription':
                $badges = [
                    'active'    => '<span class="badge bg-success rounded-pill px-3"><i class="bi bi-check-circle me-1"></i> Aktif</span>',
                    'pending'   => '<span class="badge bg-warning text-dark rounded-pill px-3"><i class="bi bi-clock me-1"></i> Beklemede</span>',
                    'expired'   => '<span class="badge bg-danger rounded-pill px-3"><i class="bi bi-exclamation-octagon me-1"></i> Süresi Doldu</span>',
                    'cancelled' => '<span class="badge bg-secondary rounded-pill px-3"><i class="bi bi-x-circle me-1"></i> İptal</span>'
                ];
                break;

            case 'ticket':
                $badges = [
                    'open'        => '<span class="badge bg-danger">Açık</span>',
                    'in_progress' => '<span class="badge bg-info text-dark">İşlemde</span>',
                    'answered'    => '<span class="badge bg-success">Cevaplandı</span>',
                    'closed'      => '<span class="badge bg-secondary">Kapandı</span>'
                ];
                break;
                
            default:
                $badges = [
                    '1' => '<span class="badge bg-success">Aktif</span>',
                    '0' => '<span class="badge bg-danger">Pasif</span>',
                    'active' => '<span class="badge bg-success">Aktif</span>',
                    'passive' => '<span class="badge bg-danger">Pasif</span>'
                ];
                break;
        }
        
        return $badges[$status] ?? '<span class="badge bg-dark">'.$status.'</span>';
    }
}

/**
 * XSS Koruması (Güvenli Çıktı)
 * Formlardan gelen verileri ekrana basarken temizler.
 */
function clean($data) {
    if (is_array($data)) {
        return array_map('clean', $data);
    }
    return htmlspecialchars(trim($data), ENT_QUOTES, 'UTF-8');
}

/**
 * Telefon Numarası Temizleyici
 * WhatsApp linkleri ve SMS gönderimi için sadece rakamları bırakır.
 */
function cleanPhone($phone) {
    return preg_replace('/[^0-9]/', '', $phone);
}

/**
 * KVKK İsim Maskeleme (Örn: Ahmet Yılmaz -> A**** Y*****)
 */
function maskNameKVKK($name) {
    $parts = explode(" ", trim($name));
    $masked = [];
    foreach ($parts as $part) {
        if (mb_strlen($part, 'UTF-8') > 1) {
            $ilk_harf = mb_substr($part, 0, 1, 'UTF-8');
            $kalan_uzunluk = mb_strlen($part, 'UTF-8') - 1;
            $masked[] = $ilk_harf . str_repeat('*', $kalan_uzunluk);
        } else {
            $masked[] = $part;
        }
    }
    return implode(" ", $masked);
}

/**
 * Akıllı Görsel Yükleme ve Optimizasyon Motoru
 * Fotoğrafları boyutlandırır, WebP yapar ve YIL/AY klasörüne kaydeder.
 */
function uploadAndOptimizeImage($tmp_name, $original_name, $base_dir = '../../uploads/products') {
    // 1. Yıl ve Ay tabanlı klasör yolunu oluştur
    $yil_ay = date('Y/m');
    $hedef_klasor = $base_dir . '/' . $yil_ay;

    // Klasör yoksa oluştur (İzinleri 0777 yap)
    if (!file_exists($hedef_klasor)) {
        mkdir($hedef_klasor, 0777, true);
    }

    // 2. Görsel bilgilerini al
    $image_info = @getimagesize($tmp_name);
    if (!$image_info) return false; // Dosya resim değilse iptal

    $mime = $image_info['mime'];
    $width = $image_info[0];
    $height = $image_info[1];

    // 3. Maksimum genişlik ayarı (E-Ticaret için 1000px idealdir)
    $max_width = 1000;
    if ($width > $max_width) {
        $ratio = $max_width / $width;
        $new_width = $max_width;
        $new_height = $height * $ratio;
    } else {
        $new_width = $width;
        $new_height = $height;
    }

    // 4. Yeni boş bir tuval oluştur
    $image_p = imagecreatetruecolor($new_width, $new_height);

    // PNG ve WEBP için şeffaflık (transparency) koruması
    imagealphablending($image_p, false);
    imagesavealpha($image_p, true);
    $transparent = imagecolorallocatealpha($image_p, 255, 255, 255, 127);
    imagefilledrectangle($image_p, 0, 0, $new_width, $new_height, $transparent);

    // 5. Orijinal dosyayı hafızaya al
    switch ($mime) {
        case 'image/jpeg': $image = imagecreatefromjpeg($tmp_name); break;
        case 'image/png':  $image = imagecreatefrompng($tmp_name); break;
        case 'image/webp': $image = imagecreatefromwebp($tmp_name); break;
        case 'image/gif':  $image = imagecreatefromgif($tmp_name); break;
        default: return false;
    }
    
    // 6. Resmi yeni tuvale kopyala ve boyutlandır
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

    // 7. Benzersiz dosya adı oluştur ve YENİ NESİL WEBP olarak kaydet!
    $benzersiz_ad = uniqid('img_') . '_' . time() . '.webp';
    $tam_yol = $hedef_klasor . '/' . $benzersiz_ad;

    // %80 Kalite ile WebP olarak kaydet
    imagewebp($image_p, $tam_yol, 80);

    // Hafızayı temizle
    imagedestroy($image_p);
    imagedestroy($image);

    // Veritabanına kaydedilecek URL yolunu döndür
    return 'uploads/products/' . $yil_ay . '/' . $benzersiz_ad;
}

// =========================================================================
// BİLDİRİM SİSTEMİ FONKSİYONLARI 
// =========================================================================

/**
 * Kullanıcıya Site İçi Bildirim Gönderir
 * @param int $user_id Kullanıcı ID
 * @param string $title Bildirim Başlığı
 * @param string $message Bildirim İçeriği
 * @param string $link Tıklanınca gidilecek URL (opsiyonel)
 * @param string $icon Bootstrap ikon class'ı (opsiyonel)
 * @return bool Başarı durumu
 */
function siteBildirimGonder($user_id, $title, $message, $link = '#', $icon = 'bi-bell') {
    global $db; 

    if(!$db || empty($user_id)) return false;

    try {
        $sql = "INSERT INTO user_notifications (user_id, title, message, icon, link, is_read, created_at) 
                VALUES (:user_id, :title, :message, :icon, :link, 0, NOW())";
        $stmt = $db->prepare($sql);
        return $stmt->execute([
            ':user_id' => $user_id,
            ':title'   => $title,
            ':message' => $message,
            ':icon'    => $icon,
            ':link'    => $link
        ]);
    } catch (PDOException $e) {
        return false;
    }
}

/**
 * Kullanıcının okunmamış bildirim sayısını getirir
 * @param int $user_id Kullanıcı ID
 * @return int Okunmamış bildirim sayısı
 */
function okunmamisBildirimSayisi($user_id) {
    global $db;
    
    if(!$db || empty($user_id)) return 0;

    try {
        $stmt = $db->prepare("SELECT COUNT(id) FROM user_notifications WHERE user_id = ? AND is_read = 0");
        $stmt->execute([$user_id]);
        return $stmt->fetchColumn() ?: 0;
    } catch (PDOException $e) {
        return 0;
    }
}

// =========================================================================
// DİNAMİK KARGO LİNKİ MOTORU (YENİ EKLENDİ)
// =========================================================================

/**
 * Kargo Firması adına ve takip koduna göre tıklanabilir gerçek URL üretir
 * @param string $company_name Kargo Firması Adı (Örn: Yurtiçi Kargo)
 * @param string $tracking_code Takip Numarası
 * @return string Hazır link URL'si
 */
function getKargoTakipLink($company_name, $tracking_code) {
    global $db;
    
    // Eğer firma adı veya kod boşsa varsayılan linki döndür (veya sadece kod)
    if(empty($company_name) || empty($tracking_code)) {
        return "https://kargotakip.com/?kod=" . urlencode($tracking_code);
    }
    
    try {
        // Veritabanından firmanın link şablonunu çek
        $stmt = $db->prepare("SELECT tracking_url FROM shipping_companies WHERE name = ? AND status = 1 LIMIT 1");
        $stmt->execute([trim($company_name)]);
        $template = $stmt->fetchColumn();
        
        if($template) {
            // Şablondaki @KOD@ kısmını gerçek takip koduyla değiştir
            return str_replace('@KOD@', urlencode(trim($tracking_code)), $template);
        }
        
    } catch (PDOException $e) {
        // Sessizce hatayı yut ve aşağıdan varsayılanı döndür
    }
    
    // Eğer firma veritabanında yoksa veya bir hata olduysa Google'a yönlendirsin (Güvenlik ağı)
    return "https://www.google.com/search?q=" . urlencode($company_name . " kargo takip " . $tracking_code);
}

/**
 * Fiyat Alarmı Bildirim Motoru
 * Bir ürünün fiyatı düştüğünde, o ürünü takip eden kullanıcılara otomatik bildirim hazırlar.
 */
function checkAndNotifyPriceAlerts($product_id, $new_price) {
    global $db;

    try {
        // 1. Bu ürünü takip eden ve alarm fiyatı yeni fiyattan yüksek olan kullanıcıları bul
        $stmt = $db->prepare("
            SELECT pa.id as alert_id, pa.user_id, p.name, p.slug 
            FROM price_alerts pa
            JOIN products p ON pa.product_id = p.id
            WHERE pa.product_id = ? AND pa.status = 0 AND pa.alert_price > ?
        ");
        $stmt->execute([$product_id, (float)$new_price]);
        $alerts = $stmt->fetchAll(PDO::FETCH_ASSOC);

        foreach ($alerts as $alert) {
            $title = "İndirim Alarmı! 📉";
            $message = "Takip ettiğiniz '" . $alert['name'] . "' ürünü beklediğiniz fiyata düştü! Kaçırmadan inceleyin.";
            
            // Tam yol (Absolute Path) vererek dizin hatasını imkansız hale getiriyoruz
$link = "/magaza/urun-detay.php?slug=" . $alert['slug'];
            
            $icon = "bi-tags-fill";

            // 2. Mevcut bildirim fonksiyonunu kullanarak bildirim gönder
            $bildirimGonderildi = siteBildirimGonder($alert['user_id'], $title, $message, $link, $icon);

            // 3. Bildirim başarıyla gönderildiyse alarmın durumunu "1" (Bildirildi) yap
            if ($bildirimGonderildi) {
                $upd = $db->prepare("UPDATE price_alerts SET status = 1 WHERE id = ?");
                $upd->execute([$alert['alert_id']]);
            }
        }
        return true;
    } catch (PDOException $e) {
        error_log("Fiyat Alarm Motoru Hatası: " . $e->getMessage());
        return false;
    }
}

?>