<?php
/**
 * Ortak Fonksiyonlar
 */

/**
 * Güvenli çıktı (XSS koruması)
 */
function e($string)
{
    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

/**
 * Slug oluşturma (Türkçe karakter desteği ile)
 */
function createSlug($string)
{
    $turkish = ['ş', 'Ş', 'ı', 'İ', 'ğ', 'Ğ', 'ü', 'Ü', 'ö', 'Ö', 'ç', 'Ç'];
    $english = ['s', 's', 'i', 'i', 'g', 'g', 'u', 'u', 'o', 'o', 'c', 'c'];

    $string = str_replace($turkish, $english, $string);
    $string = strtolower($string);
    $string = preg_replace('/[^a-z0-9-]+/', '-', $string);
    $string = trim($string, '-');

    return $string;
}

/**
 * CSRF token oluşturma
 */
function generateCSRFToken()
{
    if (!isset($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

/**
 * CSRF token doğrulama
 */
function verifyCSRFToken($token)
{
    return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
}

/**
 * Şifre hash'leme
 */
function hashPassword($password)
{
    return password_hash($password, PASSWORD_DEFAULT);
}

/**
 * Şifre doğrulama
 */
function verifyPassword($password, $hash)
{
    return password_verify($password, $hash);
}

/**
 * Yönlendirme
 */
function redirect($url)
{
    header("Location: " . $url);
    exit();
}

/**
 * Flash mesaj ayarlama
 */
function setFlashMessage($type, $message)
{
    $_SESSION['flash_message'] = [
        'type' => $type,
        'message' => $message
    ];
}

/**
 * Flash mesaj alma ve temizleme
 */
function getFlashMessage()
{
    if (isset($_SESSION['flash_message'])) {
        $message = $_SESSION['flash_message'];
        unset($_SESSION['flash_message']);
        return $message;
    }
    return null;
}

/**
 * Resim yükleme
 */
function uploadImage($file, $folder = 'general')
{
    global $pdo;

    // Hata kontrolü
    if ($file['error'] !== UPLOAD_ERR_OK) {
        return ['success' => false, 'message' => 'Dosya yükleme hatası.'];
    }

    // Dosya boyutu kontrolü
    if ($file['size'] > MAX_FILE_SIZE) {
        return ['success' => false, 'message' => 'Dosya boyutu çok büyük. (Max: 5MB)'];
    }

    // Dosya tipi kontrolü
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mimeType = finfo_file($finfo, $file['tmp_name']);
    finfo_close($finfo);

    if (!in_array($mimeType, ALLOWED_IMAGE_TYPES)) {
        return ['success' => false, 'message' => 'Geçersiz dosya tipi.'];
    }

    // Klasör oluştur
    $uploadDir = UPLOAD_PATH . '/' . $folder;
    if (!is_dir($uploadDir)) {
        mkdir($uploadDir, 0755, true);
    }

    // Güvenli dosya adı oluştur
    $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
    $fileName = uniqid() . '_' . time() . '.' . $extension;
    $filePath = $uploadDir . '/' . $fileName;

    // Dosyayı yükle
    if (move_uploaded_file($file['tmp_name'], $filePath)) {
        return [
            'success' => true,
            'file_name' => $fileName,
            'file_path' => $filePath,
            'url' => UPLOAD_URL . '/' . $folder . '/' . $fileName
        ];
    }

    return ['success' => false, 'message' => 'Dosya yüklenemedi.'];
}

/**
 * Resim silme
 */
function deleteImage($filePath)
{
    if (file_exists($filePath)) {
        return unlink($filePath);
    }
    return false;
}

/**
 * Tarih formatlama
 */
function formatDate($date, $format = 'd.m.Y H:i')
{
    return date($format, strtotime($date));
}

/**
 * Kısa metin (özet)
 */
function excerpt($text, $length = 150)
{
    if (mb_strlen($text) <= $length) {
        return $text;
    }
    return mb_substr($text, 0, $length) . '...';
}

/**
 * Yıldız gösterimi
 */
function displayStars($rating)
{
    $html = '<div class="stars">';
    for ($i = 1; $i <= 5; $i++) {
        if ($i <= $rating) {
            $html .= '<i class="fas fa-star text-warning"></i>';
        } elseif ($i - 0.5 <= $rating) {
            $html .= '<i class="fas fa-star-half-alt text-warning"></i>';
        } else {
            $html .= '<i class="far fa-star text-secondary"></i>';
        }
    }
    $html .= '</div>';
    return $html;
}

/**
 * Ortalama puan hesaplama
 */
function calculateAverageRating($companyId)
{
    global $pdo;

    $stmt = $pdo->prepare("
        SELECT AVG(rating) as avg_rating, COUNT(*) as total_reviews 
        FROM reviews 
        WHERE company_id = ? AND status = 'approved'
    ");
    $stmt->execute([$companyId]);
    $result = $stmt->fetch();

    return [
        'average' => round($result['avg_rating'], 1),
        'total' => $result['total_reviews']
    ];
}

/**
 * Puanlama dağılımı
 */
function getRatingDistribution($companyId)
{
    global $pdo;

    $stmt = $pdo->prepare("
        SELECT rating, COUNT(*) as count 
        FROM reviews 
        WHERE company_id = ? AND status = 'approved'
        GROUP BY rating
        ORDER BY rating DESC
    ");
    $stmt->execute([$companyId]);

    $distribution = [5 => 0, 4 => 0, 3 => 0, 2 => 0, 1 => 0];
    while ($row = $stmt->fetch()) {
        $distribution[$row['rating']] = $row['count'];
    }

    return $distribution;
}

/**
 * Sayfalama
 */
function paginate($totalItems, $itemsPerPage, $currentPage)
{
    $totalPages = ceil($totalItems / $itemsPerPage);
    $currentPage = max(1, min($currentPage, $totalPages));

    return [
        'total_pages' => $totalPages,
        'current_page' => $currentPage,
        'items_per_page' => $itemsPerPage,
        'offset' => ($currentPage - 1) * $itemsPerPage
    ];
}

/**
 * Resim URL'sini düzelt (relative path ise SITE_URL ekle, localhost URL'lerini domain URL'ine çevir)
 */
function getImageUrl($path)
{
    if (empty($path) || trim($path) === '') {
        return '';
    }

    $path = trim($path);

    // Zaten tam URL ise ve mevcut domain'i içeriyorsa olduğu gibi döndür
    if (strpos($path, 'http://') === 0 || strpos($path, 'https://') === 0) {
        // Eğer URL zaten mevcut SITE_URL'yi içeriyorsa olduğu gibi döndür
        $currentHost = parse_url(SITE_URL, PHP_URL_HOST);
        $pathHost = parse_url($path, PHP_URL_HOST);

        if ($pathHost === $currentHost) {
            return $path;
        }

        // Localhost veya farklı domain içeriyorsa düzelt
        if (strpos($path, 'localhost') !== false || $pathHost !== $currentHost) {
            $urlParts = parse_url($path);
            $pathOnly = $urlParts['path'] ?? '';

            // Base path'i temizle (eğer varsa)
            $basePath = parse_url(SITE_URL, PHP_URL_PATH);
            if ($basePath && strpos($pathOnly, $basePath) === 0) {
                $pathOnly = substr($pathOnly, strlen($basePath));
            }

            // Eğer path /kayakfirmalari/ ile başlıyorsa, bu kısmı kaldır (hosting'de base path farklı olabilir)
            if (strpos($pathOnly, '/kayakfirmalari/') === 0) {
                $pathOnly = substr($pathOnly, strlen('/kayakfirmalari'));
            }

            // SITE_URL ile birleştir
            return SITE_URL . '/' . ltrim($pathOnly, '/');
        }

        return $path;
    }

    // Relative path ise SITE_URL ekle
    // Eğer /uploads ile başlıyorsa direkt ekle, değilse /uploads ekle
    if (strpos($path, '/uploads/') === 0 || strpos($path, 'uploads/') === 0) {
        return SITE_URL . '/' . ltrim($path, '/');
    }

    // Sadece dosya adı veya klasör adı varsa /uploads ekle
    return SITE_URL . '/uploads/' . ltrim($path, '/');
}

/**
 * Veritabanında kolonun varlığını kontrol et
 */
function columnExists($table, $column)
{
    global $pdo;
    try {
        $stmt = $pdo->query("SHOW COLUMNS FROM `$table` LIKE '$column'");
        return $stmt->fetch() !== false;
    } catch (PDOException $e) {
        return false;
    }
}

/**
 * Menü öğelerini getir (hiyerarşik)
 */
function getMenuItems($parentId = null)
{
    global $pdo;
    try {
        $stmt = $pdo->prepare("
            SELECT * FROM menu_items 
            WHERE parent_id " . ($parentId === null ? "IS NULL" : "= ?") . "
            AND status = 'active'
            ORDER BY sort_order ASC, id ASC
        ");
        if ($parentId === null) {
            $stmt->execute();
        } else {
            $stmt->execute([$parentId]);
        }
        return $stmt->fetchAll();
    } catch (PDOException $e) {
        return [];
    }
}

/**
 * Menü HTML'i oluştur
 */
function renderMenu($parentId = null, $level = 0)
{
    $items = getMenuItems($parentId);
    if (empty($items)) {
        return '';
    }

    $html = '';
    foreach ($items as $item) {
        $hasChildren = !empty(getMenuItems($item['id']));
        $icon = $item['icon'] ? '<i class="' . e($item['icon']) . ' me-1"></i>' : '';

        if ($hasChildren && $level === 0) {
            // Ana menüde alt menü varsa dropdown
            $html .= '<li class="nav-item dropdown">';
            $html .= '<a class="nav-link dropdown-toggle" href="' . e($item['url']) . '" id="menu' . $item['id'] . '" role="button" data-bs-toggle="dropdown" aria-expanded="false" target="' . e($item['target']) . '">';
            $html .= $icon . e($item['title']);
            $html .= '</a>';
            $html .= '<ul class="dropdown-menu" aria-labelledby="menu' . $item['id'] . '">';
            $html .= renderMenu($item['id'], $level + 1);
            $html .= '</ul>';
            $html .= '</li>';
        } else {
            // Normal menü öğesi
            if ($level > 0) {
                $html .= '<li><a class="dropdown-item" href="' . e($item['url']) . '" target="' . e($item['target']) . '">';
                $html .= $icon . e($item['title']);
                $html .= '</a></li>';
            } else {
                $html .= '<li class="nav-item">';
                $html .= '<a class="nav-link" href="' . e($item['url']) . '" target="' . e($item['target']) . '">';
                $html .= $icon . e($item['title']);
                $html .= '</a>';
                $html .= '</li>';
            }
        }
    }

    return $html;
}
/**
 * Gold üye kontrolü
 */
function isGoldMember($company)
{
    if (empty($company) || !is_array($company)) {
        return false;
    }

    $type = $company['membership_type'] ?? 'free';
    return in_array($type, ['gold', 'paid']);
}
