<?php
// ========================================
// توابع کمکی
// پروژه فروشگاه کیف‌لند
// ========================================

// تمیز کردن ورودی‌ها
function sanitize($data) {
    if(is_array($data)) {
        return array_map('sanitize', $data);
    }
    return htmlspecialchars(strip_tags(trim($data)), ENT_QUOTES, 'UTF-8');
}

// تولید شماره سفارش
function generateOrderNumber() {
    return 'ORD-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -6));
}

// تولید توکن امن
function generateToken($length = 32) {
    return bin2hex(random_bytes($length));
}

// فرمت قیمت
function formatPrice($price) {
    return number_format($price, 0, ',', ',') . ' تومان';
}

// فرمت عدد
function formatNumber($number) {
    return number_format($number, 0, ',', ',');
}

// تبدیل تاریخ به شمسی (ساده)
function jdate($date, $format = 'Y/m/d H:i') {
    if($date === 'now' || $date === null) {
        return date($format);
    }
    return date($format, strtotime($date));
}

// فرمت تاریخ
function formatDate($date) {
    return date('Y/m/d', strtotime($date));
}

// فرمت تاریخ و زمان
function formatDateTime($date) {
    return date('Y/m/d H:i:s', strtotime($date));
}

// رنگ وضعیت
function getStatusColor($status) {
    $colors = [
        'pending' => 'warning',
        'processing' => 'info',
        'shipped' => 'primary',
        'delivered' => 'success',
        'cancelled' => 'danger',
        'refunded' => 'danger',
        'unpaid' => 'warning',
        'paid' => 'success'
    ];
    return $colors[$status] ?? 'secondary';
}

// متن وضعیت
function getStatusText($status) {
    $texts = [
        'pending' => 'در انتظار پرداخت',
        'processing' => 'در حال پردازش',
        'shipped' => 'ارسال شده',
        'delivered' => 'تحویل داده شده',
        'cancelled' => 'لغو شده',
        'refunded' => 'عودت داده شده',
        'unpaid' => 'پرداخت نشده',
        'paid' => 'پرداخت شده'
    ];
    return $texts[$status] ?? $status;
}

// تعداد محصولات
function getProductCount($categoryId = null) {
    try {
        $db = Database::getInstance()->getConnection();
        if($categoryId) {
            $stmt = $db->prepare("SELECT COUNT(*) FROM products WHERE category_id = ? AND is_active = 1");
            $stmt->execute([$categoryId]);
        } else {
            $stmt = $db->query("SELECT COUNT(*) FROM products WHERE is_active = 1");
        }
        return $stmt->fetchColumn();
    } catch(Exception $e) {
        return 0;
    }
}

// تعداد محصولات دسته‌بندی
function getCategoryCount($categoryId) {
    try {
        $db = Database::getInstance()->getConnection();
        $stmt = $db->prepare("SELECT COUNT(*) FROM products WHERE category_id = ? AND is_active = 1");
        $stmt->execute([$categoryId]);
        return $stmt->fetchColumn();
    } catch(Exception $e) {
        return 0;
    }
}

// تعداد سبد خرید
function getCartCount() {
    if(isset($_SESSION['user_id'])) {
        try {
            $db = Database::getInstance()->getConnection();
            $stmt = $db->prepare("SELECT SUM(quantity) FROM cart WHERE user_id = ?");
            $stmt->execute([$_SESSION['user_id']]);
            $result = $stmt->fetchColumn();
            return $result ?: 0;
        } catch(Exception $e) {
            return 0;
        }
    }
    return $_SESSION['cart_count'] ?? 0;
}

// جمع سبد خرید
function getCartTotal() {
    if(isset($_SESSION['user_id'])) {
        try {
            $db = Database::getInstance()->getConnection();
            $stmt = $db->prepare("SELECT SUM(p.price * c.quantity) FROM cart c JOIN products p ON c.product_id = p.id WHERE c.user_id = ?");
            $stmt->execute([$_SESSION['user_id']]);
            $result = $stmt->fetchColumn();
            return $result ?: 0;
        } catch(Exception $e) {
            return 0;
        }
    }
    return 0;
}

// آپلود فایل
function uploadFile($file, $directory, $allowedTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'], $maxSize = 5242880) {
    if(!isset($file) || $file['error'] !== UPLOAD_ERR_OK) {
        return ['success' => false, 'message' => 'خطا در آپلود فایل'];
    }

    if(!in_array($file['type'], $allowedTypes)) {
        return ['success' => false, 'message' => 'نوع فایل مجاز نیست. فقط فرمت‌های JPG, PNG, WEBP و GIF مجاز هستند'];
    }

    if($file['size'] > $maxSize) {
        return ['success' => false, 'message' => 'حجم فایل نباید بیشتر از ' . ($maxSize / 1024 / 1024) . ' مگابایت باشد'];
    }

    $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
    $filename = uniqid() . '_' . time() . '.' . $extension;
    $targetPath = $directory . $filename;

    if(!file_exists($directory)) {
        mkdir($directory, 0777, true);
    }

    if(move_uploaded_file($file['tmp_name'], $targetPath)) {
        return ['success' => true, 'filename' => $filename, 'path' => $targetPath, 'size' => $file['size']];
    }

    return ['success' => false, 'message' => 'خطا در ذخیره فایل'];
}

// حذف فایل
function deleteFile($filepath) {
    if(file_exists($filepath)) {
        return unlink($filepath);
    }
    return false;
}

// ایجاد تصویر بندانگشتی
function createThumbnail($source, $destination, $width = 300, $height = 300) {
    try {
        $imageInfo = getimagesize($source);
        if(!$imageInfo) return false;

        $imageType = $imageInfo[2];

        switch($imageType) {
            case IMAGETYPE_JPEG: $sourceImage = imagecreatefromjpeg($source); break;
            case IMAGETYPE_PNG:  $sourceImage = imagecreatefrompng($source);  break;
            case IMAGETYPE_WEBP: $sourceImage = imagecreatefromwebp($source); break;
            default: return false;
        }

        $thumbnail = imagecreatetruecolor($width, $height);

        if($imageType === IMAGETYPE_PNG) {
            imagealphablending($thumbnail, false);
            imagesavealpha($thumbnail, true);
        }

        imagecopyresampled($thumbnail, $sourceImage, 0, 0, 0, 0, $width, $height, $imageInfo[0], $imageInfo[1]);
        imagejpeg($thumbnail, $destination, 90);
        imagedestroy($sourceImage);
        imagedestroy($thumbnail);

        return true;
    } catch(Exception $e) {
        return false;
    }
}

// ریدایرکت
function redirect($url) {
    if(headers_sent()) {
        echo "<script>window.location.href = '$url';</script>";
    } else {
        header("Location: $url");
    }
    exit;
}

// ارسال ایمیل
function sendEmail($to, $subject, $message, $from = 'no-reply@bagshop.com') {
    $headers  = "From: $from\r\n";
    $headers .= "Reply-To: $from\r\n";
    $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
    $headers .= "X-Mailer: PHP/" . phpversion();

    return mail($to, $subject, $message, $headers);
}

// بررسی توکن CSRF
function verifyToken($token) {
    return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
}

// تولید توکن CSRF
function generateCSRFToken() {
    if(!isset($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = generateToken();
    }
    return $_SESSION['csrf_token'];
}

// دریافت IP بازدیدکننده
function getVisitorIP() {
    if(!empty($_SERVER['HTTP_CLIENT_IP'])) {
        return $_SERVER['HTTP_CLIENT_IP'];
    } elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    return $_SERVER['REMOTE_ADDR'];
}

// دریافت User Agent
function getUserAgent() {
    return $_SERVER['HTTP_USER_AGENT'] ?? 'Unknown';
}

// بررسی موبایل
function isMobile() {
    return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", getUserAgent());
}

// محاسبه تخفیف
function calculateDiscount($price, $discount) {
    return $price - ($price * $discount / 100);
}

// محاسبه مالیات
function calculateTax($amount, $taxRate = 9) {
    return $amount * $taxRate / 100;
}

// هزینه ارسال
function getShippingCost($totalAmount) {
    $settings = SiteSettings::getInstance();
    $threshold = $settings->get('free_shipping_threshold', 2000000);
    $shippingCost = $settings->get('shipping_cost', 50000);

    return $totalAmount >= $threshold ? 0 : $shippingCost;
}

// کوتاه کردن متن
function truncateText($text, $length = 100, $suffix = '...') {
    if(mb_strlen($text) <= $length) {
        return $text;
    }
    return mb_substr($text, 0, $length) . $suffix;
}

// ساخت Slug
function slugify($text) {
    $text = preg_replace('~[^\pL\d]+~u', '-', $text);
    $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
    $text = preg_replace('~[^-\w]+~', '', $text);
    $text = trim($text, '-');
    $text = preg_replace('~-+~', '-', $text);
    $text = strtolower($text);
    return empty($text) ? 'n-a' : $text;
}

// زمان گذشته
function timeAgo($datetime) {
    $timestamp = strtotime($datetime);
    $diff = time() - $timestamp;

    if($diff < 60)          return 'همین الان';
    elseif($diff < 3600)    return floor($diff / 60) . ' دقیقه پیش';
    elseif($diff < 86400)   return floor($diff / 3600) . ' ساعت پیش';
    elseif($diff < 604800)  return floor($diff / 86400) . ' روز پیش';
    elseif($diff < 2592000) return floor($diff / 604800) . ' هفته پیش';
    elseif($diff < 31536000)return floor($diff / 2592000) . ' ماه پیش';
    else                    return floor($diff / 31536000) . ' سال پیش';
}

// اعتبارسنجی ایمیل
function validateEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL);
}

// اعتبارسنجی تلفن
function validatePhone($phone) {
    return preg_match('/^09[0-9]{9}$/', str_replace('-', '', $phone));
}

// اعتبارسنجی URL
function validateURL($url) {
    return filter_var($url, FILTER_VALIDATE_URL);
}

// مقایسه امن
function secureCompare($a, $b) {
    return hash_equals($a, $b);
}

// خروجی امن
function escapeOutput($data) {
    return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
}

// صفحه‌بندی
function getPagination($totalItems, $itemsPerPage, $currentPage) {
    $totalPages = ceil($totalItems / $itemsPerPage);
    $startPage  = max(1, $currentPage - 2);
    $endPage    = min($totalPages, $currentPage + 2);

    return [
        'total_pages'  => $totalPages,
        'current_page' => $currentPage,
        'start_page'   => $startPage,
        'end_page'     => $endPage,
        'has_prev'     => $currentPage > 1,
        'has_next'     => $currentPage < $totalPages
    ];
}

// ثبت خطا
function logError($message, $context = []) {
    error_log("[" . date('Y-m-d H:i:s') . "] " . $message . " " . json_encode($context));
}

// دیباگ
function debug($data) {
    echo '<pre>';
    print_r($data);
    echo '</pre>';
}

// دیباگ و توقف
function dd($data) {
    debug($data);
    die();
}

// ========================================
// توابع جدید — اضافه شده
// ========================================

// لاگ پرداخت
function logPayment(PDO $db, int $orderId, string $action, string $status, array $data = []): void {
    try {
        $db->prepare("INSERT INTO payment_logs (order_id, action, status, authority, ref_id, amount, gateway_response, ip_address, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())")
           ->execute([
               $orderId,
               $action,
               $status,
               $data['authority'] ?? null,
               $data['ref_id']    ?? null,
               $data['amount']    ?? null,
               isset($data['response']) ? json_encode($data['response'], JSON_UNESCAPED_UNICODE) : null,
               $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0',
           ]);
    } catch(Exception $e) {
        logError("Payment Log Error: " . $e->getMessage());
    }
}

// اعتبارسنجی کوپن
function validateCoupon(PDO $db, string $code, float $total): array {
    if(empty($code)) return ['valid' => false, 'error' => 'کد تخفیف وارد نشده'];

    try {
        $stmt = $db->prepare("SELECT * FROM coupons WHERE code = ? AND is_active = 1 AND (expires_at IS NULL OR expires_at > NOW()) AND (max_uses = 0 OR used_count < max_uses) LIMIT 1");
        $stmt->execute([strtoupper(trim($code))]);
        $coupon = $stmt->fetch();

        if(!$coupon) return ['valid' => false, 'error' => 'کد تخفیف معتبر نیست یا منقضی شده'];

        if($coupon['min_amount'] > 0 && $total < $coupon['min_amount']) {
            return ['valid' => false, 'error' => 'حداقل مبلغ سفارش برای این کد ' . number_format($coupon['min_amount']) . ' تومان است'];
        }

        $discount = $coupon['type'] === 'percent'
            ? round($total * ($coupon['value'] / 100))
            : min((float)$coupon['value'], $total);

        if($coupon['max_discount'] > 0) {
            $discount = min($discount, $coupon['max_discount']);
        }

        return [
            'valid'    => true,
            'id'       => $coupon['id'],
            'code'     => $coupon['code'],
            'type'     => $coupon['type'],
            'value'    => $coupon['value'],
            'discount' => $discount,
            'label'    => $coupon['type'] === 'percent' ? $coupon['value'] . '٪ تخفیف' : number_format($coupon['value']) . ' تومان تخفیف',
        ];
    } catch(Exception $e) {
        logError("Coupon Error: " . $e->getMessage());
        return ['valid' => false, 'error' => 'خطا در بررسی کد تخفیف'];
    }
}

// استفاده از کوپن
function useCoupon(PDO $db, int $couponId): void {
    try {
        $db->prepare("UPDATE coupons SET used_count = used_count + 1 WHERE id = ?")->execute([$couponId]);
    } catch(Exception $e) {
        logError("Coupon Use Error: " . $e->getMessage());
    }
}

// ایمیل به ادمین: سفارش جدید
function emailAdminNewOrder(array $order, array $items): bool {
    try {
        $settings   = SiteSettings::getInstance();
        $adminEmail = $settings->get('site_email', 'admin@bagshop.com');
    } catch(Exception $e) {
        $adminEmail = 'admin@bagshop.com';
    }

    $itemsHtml = '';
    foreach($items as $it) {
        $itemsHtml .= '<li>' . htmlspecialchars($it['product_name'] ?? $it['name']) . ' × ' . $it['quantity'] . ' — ' . number_format($it['subtotal']) . ' تومان</li>';
    }

    $body = '
    <p>سلام،</p>
    <p>یک سفارش جدید در سایت کیف‌لند ثبت شد.</p>
    <table border="0" cellpadding="8" style="width:100%;border-collapse:collapse;">
        <tr><td style="color:#666;">شماره سفارش:</td><td><strong>' . htmlspecialchars($order['order_number']) . '</strong></td></tr>
        <tr><td style="color:#666;">مبلغ کل:</td><td><strong>' . number_format($order['final_amount']) . ' تومان</strong></td></tr>
        <tr><td style="color:#666;">روش پرداخت:</td><td>' . ($order['payment_method'] === 'online' ? 'آنلاین (زرین‌پال)' : 'کارت‌به‌کارت') . '</td></tr>
        <tr><td style="color:#666;">شهر:</td><td>' . htmlspecialchars($order['shipping_city'] ?? '') . '</td></tr>
    </table>
    <p><strong>محصولات:</strong></p>
    <ul>' . $itemsHtml . '</ul>
    <p>برای مشاهده جزئیات وارد پنل ادمین شوید.</p>';

    return sendEmail($adminEmail, 'سفارش جدید: ' . $order['order_number'], $body);
}

// ایمیل به کاربر: تأیید سفارش
function emailUserOrderConfirm(string $userEmail, string $userName, array $order): bool {
    $body = '
    <p>سلام <strong>' . htmlspecialchars($userName) . '</strong> عزیز،</p>
    <p>سفارش شما با موفقیت ثبت شد.</p>
    <table border="0" cellpadding="8" style="width:100%;border-collapse:collapse;">
        <tr><td style="color:#666;">شماره سفارش:</td><td><strong>' . htmlspecialchars($order['order_number']) . '</strong></td></tr>
        <tr><td style="color:#666;">مبلغ:</td><td><strong>' . number_format($order['final_amount']) . ' تومان</strong></td></tr>
        <tr><td style="color:#666;">روش پرداخت:</td><td>' . ($order['payment_method'] === 'online' ? 'آنلاین' : 'کارت‌به‌کارت') . '</td></tr>
    </table>
    <p>برای پیگیری سفارش وارد حساب کاربری شوید.</p>';

    return sendEmail($userEmail, 'تأیید سفارش ' . $order['order_number'], $body);
}

// ایمیل به کاربر: پرداخت موفق
function emailUserPaymentSuccess(string $userEmail, string $userName, array $order, string $refId): bool {
    $body = '
    <p>سلام <strong>' . htmlspecialchars($userName) . '</strong> عزیز،</p>
    <p>پرداخت شما با موفقیت انجام شد.</p>
    <table border="0" cellpadding="8" style="width:100%;border-collapse:collapse;">
        <tr><td style="color:#666;">شماره سفارش:</td><td><strong>' . htmlspecialchars($order['order_number']) . '</strong></td></tr>
        <tr><td style="color:#666;">کد پیگیری:</td><td><strong>' . htmlspecialchars($refId) . '</strong></td></tr>
        <tr><td style="color:#666;">مبلغ:</td><td><strong>' . number_format($order['final_amount']) . ' تومان</strong></td></tr>
    </table>
    <p>سفارش شما در اسرع وقت ارسال خواهد شد.</p>';

    return sendEmail($userEmail, 'پرداخت موفق — ' . $order['order_number'], $body);
}

// ایمیل به ادمین: پیام جدید
function emailAdminNewMessage(array $msg): bool {
    try {
        $settings   = SiteSettings::getInstance();
        $adminEmail = $settings->get('site_email', 'admin@bagshop.com');
    } catch(Exception $e) {
        $adminEmail = 'admin@bagshop.com';
    }

    $body = '
    <p>یک پیام جدید از کاربر دریافت شد.</p>
    <table border="0" cellpadding="8" style="width:100%;border-collapse:collapse;">
        <tr><td style="color:#666;">فرستنده:</td><td>' . htmlspecialchars($msg['name']) . '</td></tr>
        <tr><td style="color:#666;">ایمیل:</td><td>' . htmlspecialchars($msg['email']) . '</td></tr>
        <tr><td style="color:#666;">موضوع:</td><td>' . htmlspecialchars($msg['subject']) . '</td></tr>
    </table>
    <p><strong>متن پیام:</strong></p>
    <p>' . nl2br(htmlspecialchars($msg['message'])) . '</p>';

    return sendEmail($adminEmail, 'پیام جدید: ' . $msg['subject'], $body);
}

// ایمیل به کاربر: پاسخ پشتیبانی
function emailUserMessageReply(string $userEmail, string $userName, string $subject, string $reply): bool {
    $body = '
    <p>سلام <strong>' . htmlspecialchars($userName) . '</strong> عزیز،</p>
    <p>پشتیبانی کیف‌لند به پیام شما پاسخ داد.</p>
    <p><strong>موضوع:</strong> ' . htmlspecialchars($subject) . '</p>
    <p><strong>پاسخ:</strong></p>
    <p>' . nl2br(htmlspecialchars($reply)) . '</p>
    <p>برای ادامه مکالمه وارد حساب کاربری شوید.</p>';

    return sendEmail($userEmail, 'پاسخ پشتیبانی — ' . $subject, $body);
}
?>
