<?php
global $connection, $data, $text, $from_id, $admin, $userInfo, $message_id, $mainValues, $buttonValues, $cancelKey, $removeKeyboard, $fileid, $caption, $botState, $first_name, $username, $newRremark, $days, $volume, $marzbanText, $configLocation, $configReality, $type, $ticketList, $chat_id, $filetype;

// لود توابع کمکی تیکت
include_once __DIR__ . '/ticket_helpers.php';

// مایگریشن اتوماتیک - اضافه شدن ستون‌های ذخیره message_id مکالمات
$migCheck = $connection->query("SELECT * FROM `setting` WHERE `type` = 'MIGRATION_TICKET_MSGID'");
if ($migCheck && $migCheck->num_rows == 0) {
    @$connection->query("ALTER TABLE `chats` ADD COLUMN `admin_msg_id` BIGINT DEFAULT NULL");
    @$connection->query("ALTER TABLE `chats` ADD COLUMN `user_msg_id` BIGINT DEFAULT NULL");
    $connection->query("INSERT INTO `setting` (`type`, `value`) VALUES ('MIGRATION_TICKET_MSGID', '1')");
}

// بسته شدن خودکار تیکت‌های بدون فعالیت بیش از ۳ روز
$autoCloseTime = time() - (3 * 24 * 60 * 60);
@$connection->query("
    UPDATE `chats` c 
    LEFT JOIN (SELECT `chat_id`, MAX(`sent_date`) as `last_msg` FROM `chats_info` GROUP BY `chat_id`) ci 
    ON c.`id` = ci.`chat_id` 
    SET c.`state` = 2 
    WHERE c.`state` != 2 
    AND COALESCE(ci.`last_msg`, c.`create_date`) < {$autoCloseTime}
");

// لغو ثبت تیکت با متن انصراف
if (isset($text) && $text == ($buttonValues['cancel'] ?? '') && preg_match('/^(getTicketTitle_|sendTicket_)/', (string)($userInfo['step'] ?? ''))) {
    setUser("none");
    setUser(NULL, 'temp');
    sendMessage("عملیات لغو شد ❌", $removeKeyboard, "HTML");
    sendMessage("لطفا یکی از کلید های زیر را انتخاب کنید", getMainKeys());
    exit();
}

// لغو ثبت تیکت (دکمه اینلاین انصراف)
if ($data == "cancelTicketCreation") {
    setUser("none");
    setUser(NULL, 'temp');
    $data = "supportSection"; // ریدایرکت به منوی پشتیبانی
}

// --- منوی اصلی پشتیبانی ---
if ($data == "supportSection") {
    editText(
        $message_id,
        "به بخش پشتیبانی خوش اومدی🛂\nلطفا، یکی از دکمه های زیر را انتخاب نمایید.",
        json_encode(['inline_keyboard' => [
            [['text' => "✉️ ثبت تیکت", 'callback_data' => "usersNewTicket"]],
            [['text' => "📮 لیست تیکت ها", 'callback_data' => "userAllTickets"], ['text' => "تیکت های باز 📨", 'callback_data' => "usersOpenTickets"]],
            [getMiniAppBtn("مشاهده تیکت‌ها در مینی‌اپ 📱", "tickets")],
            [getBtn('back_button', 'mainMenu')]
        ]])
    );
}

// --- انتخاب دسته‌بندی تیکت ---
if ($data == "usersNewTicket") {
    $stmt = $connection->prepare("SELECT * FROM `setting` WHERE `type` = 'TICKETS_CATEGORY'");
    $stmt->execute();
    $ticketCategory = $stmt->get_result();
    $stmt->close();
    $keys = array();
    $temp = array();
    if ($ticketCategory->num_rows > 0) {
        while ($row = $ticketCategory->fetch_assoc()) {
            $ticketName = $row['value'];
            $temp[] = ['text' => $ticketName, 'callback_data' => "supportCat$ticketName"];

            // هر ردیف ۲ دکمه
            if (count($temp) == 2) {
                array_push($keys, $temp);
                $temp = array();
            }
        }

        // دکمه‌های باقی‌مانده
        if (!empty($temp)) {
            array_push($keys, $temp);
        }
        // دکمه مینی‌اپ
        $keys[] = [getMiniAppBtn("مشاهده تیکت‌ها در مینی‌اپ 📱", "tickets")];
        // دکمه برگشت به بخش پشتیبانی
        $keys[] = [getBtn('back_button', 'supportSection')];
        editText($message_id, "💠لطفا واحد مورد نظر خود را انتخاب نمایید!", json_encode(['inline_keyboard' => $keys]));
    } else {
        alert("ای وای، ببخشید الان نیستم");
    }
}

// --- مرحله ۱: انتخاب دسته و شروع دریافت عنوان ---
if (preg_match('/^supportCat(.*)/', (string)$data, $match)) {
    $ticketCat = $match[1];
    setUser("getTicketTitle_" . $ticketCat);
    // ذخیره message_id پیام فعلی برای edit بعدی
    setUser(json_encode(['msg_id' => $message_id]), 'temp');
    // ویرایش همان پیام به درخواست عنوان
    editText(
        $message_id,
        "📝 <b>مرحله ۱ - دسته‌بندی:</b> ✅ {$ticketCat}\n\n" .
        "📝 <b>مرحله ۲ - عنوان:</b>\n" .
        "لطفا عنوان تیکت را ارسال نمایید.\n" .
        "عنوان تیکت نمیتواند خالی باشد. لطفا یک عنوان مناسب ارسال کنید.\n" .
        "مثلا: <i>بررسی خریدهای من</i>",
        json_encode(['inline_keyboard' => [
            [getMiniAppBtn("مشاهده تیکت‌ها در مینی‌اپ 📱", "tickets")],
            [TelegramButton::cancelBtn('fa', 'انصراف ❌', 'Cancel', 'cancelTicketCreation')]
        ]]),
        "HTML"
    );
}

// --- مرحله ۲: دریافت عنوان تیکت ---
if (preg_match('/^getTicketTitle_(.*)/', (string)($userInfo['step'] ?? ''), $match) && ($text ?? '') != ($buttonValues['cancel'] ?? '')) {
    $ticketCat = $match[1];

    // اعتبارسنجی عنوان
    if (trim($text ?? '') == "") {
        $tempData = json_decode($userInfo['temp'] ?? '{}', true);
        $promptMsgId = $tempData['msg_id'] ?? null;
        delMessage($message_id, $from_id);
        if ($promptMsgId) {
            editText(
                $promptMsgId,
                "⚠️ <b>عنوان تیکت نمی‌تواند خالی باشد. لطفا یک عنوان مناسب ارسال کنید:</b>\n\n" .
                "📝 <b>مرحله ۱ - دسته‌بندی:</b> ✅ {$ticketCat}\n" .
                "مثلا: <i>بررسی خریدهای من</i>",
                json_encode(['inline_keyboard' => [
                    [getMiniAppBtn("مشاهده تیکت‌ها در مینی‌اپ 📱", "tickets")],
                    [TelegramButton::cancelBtn('fa', 'انصراف ❌', 'Cancel', 'cancelTicketCreation')]
                ]]),
                "HTML"
            );
        } else {
            sendMessage("⚠️ عنوان تیکت نمی‌تواند خالی باشد. لطفا یک عنوان مناسب ارسال کنید:");
        }
        exit();
    }

    // خواندن message_id پیام prompt از temp
    $tempData = json_decode($userInfo['temp'] ?? '{}', true);
    $promptMsgId = $tempData['msg_id'] ?? null;

    // حذف پیام متنی کاربر
    delMessage($message_id, $from_id);

    // ذخیره عنوان و message_id در temp
    setUser("sendTicket_" . $ticketCat);
    setUser(json_encode(['msg_id' => $promptMsgId, 'title' => $text]), 'temp');

    // ویرایش پیام prompt به مرحله ۳ (توضیحات)
    if ($promptMsgId) {
        editText(
            $promptMsgId,
            "📝 <b>مرحله ۱ - دسته‌بندی:</b> ✅ {$ticketCat}\n" .
            "📝 <b>مرحله ۲ - عنوان:</b> ✅ {$text}\n\n" .
            "📝 <b>مرحله ۳ - توضیحات:</b>\n" .
            "لطفا توضیحات خود را ارسال کنید.\n" .
            "می‌توانید متن - عکس - وویس - ویدیو به همراه کپشن مناسب و توضیحات ارسال کنید.",
            json_encode(['inline_keyboard' => [
                [getMiniAppBtn("مشاهده تیکت‌ها در مینی‌اپ 📱", "tickets")],
                [TelegramButton::cancelBtn('fa', 'انصراف ❌', 'Cancel', 'cancelTicketCreation')]
            ]]),
            "HTML"
        );
    }
    exit();
}

// --- مرحله ۳: دریافت توضیحات و ثبت تیکت ---
if (preg_match('/^sendTicket_(.*)/', (string)($userInfo['step'] ?? ''), $match) && ($text ?? '') != ($buttonValues['cancel'] ?? '')) {
    if (trim($text ?? '') == "" && $fileid === null) {
        sendMessage("⚠️ توضیحات تیکت نمی‌تواند خالی باشد. لطفا توضیحات یا فایل خود را ارسال کنید:");
        exit();
    }
    // بررسی می‌کنیم که یا متن باشد یا فایل
    if (($text ?? '') != "" || $fileid !== null) {
        $ticketCat = $match[1];
        $tempData = json_decode($userInfo['temp'] ?? '{}', true);
        $promptMsgId = $tempData['msg_id'] ?? null;
        $ticketTitle = mb_substr($tempData['title'] ?? '', 0, 100);
        $time = time();

        // حذف پیام کاربر (عکس/ویدیو/متن)
        delMessage($message_id, $from_id);

        // ایجاد تیکت در دیتابیس
        $stmt = $connection->prepare("INSERT INTO `chats` (`user_id`,`create_date`, `title`,`category`,`state`,`rate`) VALUES 
                            (?,?,?,?,'0','0')");
        $stmt->bind_param("iiss", $from_id, $time, $ticketTitle, $ticketCat);
        $stmt->execute();
        $chatRowId = $stmt->insert_id;
        $stmt->close();

        $user_tag = "<a href='tg://user?id=$from_id'>$first_name</a>" . (!empty($username) ? " (@$username)" : "");

        // ذخیره محتوا در chats_info
        if ($fileid !== null) {
            $file_json = json_encode(['file_id' => $fileid, 'caption' => $caption, 'file_type' => $filetype], JSON_UNESCAPED_UNICODE);
            $stmt = $connection->prepare("INSERT INTO `chats_info` (`chat_id`,`sent_date`,`msg_type`,`text`) VALUES
                        (?,?,'USER',?)");
            $stmt->bind_param("iis", $chatRowId, $time, $file_json);
            $stmt->execute();
            $stmt->close();

            $captionText = !empty($caption) ? "\n📝 متن: $caption" : "";
            $adminTxt = "🎫 <b>تیکت جدید:</b>\n\nکاربر: $user_tag\nآیدی عددی: <code>$from_id</code>\n\nموضوع: $ticketCat\nعنوان: " . htmlspecialchars($ticketTitle) . $captionText;

            // دکمه‌های ادمین
            $adminKeys = json_encode(['inline_keyboard' => [
                [
                    ['text' => "پاسخ در ربات ✍️", 'callback_data' => "reply_{$chatRowId}"],
                    getMiniAppBtn('مشاهده در مینی‌اپ 📱', "tickets-{$chatRowId}")
                ]
            ]]);

            // ارسال فایل برای ادمین
            if ($filetype == 'photo') {
                $adminRes = sendPhoto($fileid, $adminTxt, $adminKeys, "HTML", $admin);
            } elseif ($filetype == 'video') {
                $adminRes = bot('sendVideo', ['chat_id' => $admin, 'video' => $fileid, 'caption' => $adminTxt, 'reply_markup' => $adminKeys, 'parse_mode' => 'HTML']);
            } elseif ($filetype == 'voice') {
                $adminRes = bot('sendVoice', ['chat_id' => $admin, 'voice' => $fileid, 'caption' => $adminTxt, 'reply_markup' => $adminKeys, 'parse_mode' => 'HTML']);
            } else {
                $adminRes = bot('sendDocument', ['chat_id' => $admin, 'document' => $fileid, 'caption' => $adminTxt, 'reply_markup' => $adminKeys, 'parse_mode' => 'HTML']);
            }
            $adminMsgId = $adminRes->result->message_id ?? null;
        } else {
            // ذخیره متن
            $text_safe = $text;
            $stmt = $connection->prepare("INSERT INTO `chats_info` (`chat_id`,`sent_date`,`msg_type`,`text`) VALUES
                        (?,?,'USER',?)");
            $stmt->bind_param("iis", $chatRowId, $time, $text_safe);
            $stmt->execute();
            $stmt->close();

            $adminTxt = "🎫 <b>تیکت جدید:</b>\n\nکاربر: $user_tag\nآیدی عددی: <code>$from_id</code>\n\nموضوع: $ticketCat\nعنوان: " . htmlspecialchars($ticketTitle) . "\n\n📝 متن تیکت:\n$text";

            // دکمه‌های ادمین
            $adminKeys = json_encode(['inline_keyboard' => [
                [
                    ['text' => "پاسخ در ربات ✍️", 'callback_data' => "reply_{$chatRowId}"],
                    getMiniAppBtn('مشاهده در مینی‌اپ 📱', "tickets-{$chatRowId}")
                ]
            ]]);

            // ارسال برای ادمین
            $adminRes = sendMessage($adminTxt, $adminKeys, "html", $admin);
            $adminMsgId = $adminRes->result->message_id ?? null;
        }

        // ویرایش پیام prompt برای کاربر به تأییدیه
        $confirmText = "✅ تیکت شما ثبت شد.\nمنتظر پاسخ ادمین بمانید و نوتیف ربات را روشن نمایید.";
        $confirmKeys = json_encode(['inline_keyboard' => [
            [getMiniAppBtn("مشاهده تیکت‌ها در مینی‌اپ 📱", "tickets-{$chatRowId}")],
            [getBtn('back_button', 'mainMenu')]
        ]]);

        $userMsgId = null;
        if ($promptMsgId) {
            $editResult = editText($promptMsgId, $confirmText, $confirmKeys, "HTML");
            if ($editResult && isset($editResult->ok) && $editResult->ok) {
                $userMsgId = $promptMsgId;
            } else {
                // ارسال پیام جدید در صورت عدم موفقیت edit
                $userRes = sendMessage($confirmText, $confirmKeys, "HTML");
                $userMsgId = $userRes->result->message_id ?? null;
            }
        } else {
            $userRes = sendMessage($confirmText, $confirmKeys, "HTML");
            $userMsgId = $userRes->result->message_id ?? null;
        }

        // ذخیره message_id ها در دیتابیس
        $stmt = $connection->prepare("UPDATE `chats` SET `admin_msg_id` = ?, `user_msg_id` = ? WHERE `id` = ?");
        $stmt->bind_param("iii", $adminMsgId, $userMsgId, $chatRowId);
        $stmt->execute();
        $stmt->close();

        setUser(NULL, 'temp');
        setUser("none");
    } else {
        sendMessage("لطفا فقط متن یا عکس ارسال کنید.");
    }
}

// --- لیست تیکت‌ها (باز / همه) ---
if ($data == "usersOpenTickets" || $data == "userAllTickets") {
    if ($data == "usersOpenTickets") {
        $stmt = $connection->prepare("SELECT * FROM `chats` WHERE `state` != 2 AND `user_id` = ? ORDER BY `state` ASC, `create_date` DESC");
        $stmt->bind_param("i", $from_id);
        $stmt->execute();
        $ticketList = $stmt->get_result();
        $stmt->close();
        $type = 2;
    } elseif ($data == "userAllTickets") {
        $stmt = $connection->prepare("SELECT * FROM `chats` WHERE `user_id` = ? ORDER BY `state` ASC, `create_date` DESC");
        $stmt->bind_param("i", $from_id);
        $stmt->execute();
        $ticketList = $stmt->get_result();
        $stmt->close();
        $type = "all";
    }
    $allList = $ticketList->num_rows;
    $cont = 5;
    $current = 0;
    $keys = array();
    setUser("none");


    if ($allList > 0) {
        while ($row = $ticketList->fetch_assoc()) {
            $current++;

            $rowId = $row['id'];
            $title = $row['title'];
            $category = $row['category'];
            $state = $row['state'];

            $stmt = $connection->prepare("SELECT * FROM `chats_info` WHERE `chat_id` = ? ORDER BY `sent_date` DESC");
            $stmt->bind_param("i", $rowId);
            $stmt->execute();
            $ticketInfo = $stmt->get_result()->fetch_assoc();
            $stmt->close();

            $lastmsg = $ticketInfo['text'];
            $sentType = $ticketInfo['msg_type'] == "ADMIN" ? "ادمین" : "کاربر";
            if ($state != 2) {
                $keys = [
                    [['text' => "بستن تیکت 🗳", 'callback_data' => "closeTicket_$rowId"], ['text' => "ادامه 📝", 'callback_data' => "replySupport_{$rowId}"]],
                    [['text' => "آخرین پیام ها 📩", 'callback_data' => "latestMsg_$rowId"]],
                    [getMiniAppBtn("مشاهده در مینی‌اپ 📱", "tickets-{$rowId}")]
                ];
            } else {
                $keys = [
                    [['text' => "آخرین پیام ها 📩", 'callback_data' => "latestMsg_$rowId"]],
                    [getMiniAppBtn("مشاهده در مینی‌اپ 📱", "tickets-{$rowId}")]
                ];
            }

            if (isset(json_decode($lastmsg, true)['file_id'])) {
                $info = json_decode($lastmsg, true);
                $fileid = $info['file_id'];
                $caption = $info['caption'] ?? '';
                $ftype = $info['file_type'] ?? 'photo';
                $txt = "🔘 موضوع: $title
            		💭 دسته بندی:  {$category}
            		\n
            		$sentType : $caption";
                
                if ($ftype == 'photo') {
                    sendPhoto($fileid, $txt, json_encode(['inline_keyboard' => $keys]), "HTML");
                } elseif ($ftype == 'video') {
                    bot('sendVideo', ['chat_id' => $from_id, 'video' => $fileid, 'caption' => $txt, 'reply_markup' => json_encode(['inline_keyboard' => $keys]), 'parse_mode' => 'HTML']);
                } elseif ($ftype == 'voice') {
                    bot('sendVoice', ['chat_id' => $from_id, 'voice' => $fileid, 'caption' => $txt, 'reply_markup' => json_encode(['inline_keyboard' => $keys]), 'parse_mode' => 'HTML']);
                } else {
                    bot('sendDocument', ['chat_id' => $from_id, 'document' => $fileid, 'caption' => $txt, 'reply_markup' => json_encode(['inline_keyboard' => $keys]), 'parse_mode' => 'HTML']);
                }
            } else {
                sendMessage(" 🔘 موضوع: $title
            		💭 دسته بندی:  {$category}
            		\n
            		$sentType : $lastmsg", json_encode(['inline_keyboard' => $keys]), "HTML");
            }

            if ($current >= $cont) {
                break;
            }
        }

        if ($allList > $cont) {
            sendmessage("موارد بیشتر", json_encode(['inline_keyboard' => [
                [['text' => "دریافت", 'callback_data' => "moreTicket_{$type}_{$cont}"]]
            ]]), "HTML");
        }
    } else {
        alert("تیکتی یافت نشد");
        exit();
    }
}

// --- بستن تیکت توسط کاربر ---
if (preg_match('/^closeTicket_(\d+)/', (string)$data, $match) and $from_id != $admin) {
    $chatRowId = $match[1];
    $stmt = $connection->prepare("SELECT * FROM `chats` WHERE `id` = ?");
    $stmt->bind_param("i", $chatRowId);
    $stmt->execute();
    $ticketInfo = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    $from_id = $ticketInfo['user_id'];
    $title = $ticketInfo['title'];
    $category = $ticketInfo['category'];


    $stmt = $connection->prepare("UPDATE `chats` SET `state` = 2 WHERE `id` = ?");
    $stmt->bind_param("i", $chatRowId);
    $stmt->execute();
    $stmt->close();

    editKeys();

    $ticketClosed = " $title : $category \n\n" . "این تیکت بسته شد\n به این تیکت رأی بدهید";;

    $keys = json_encode(['inline_keyboard' => [
        [['text' => "بسیار بد 😠", 'callback_data' => "rate_{$chatRowId}_1"]],
        [['text' => "بد 🙁", 'callback_data' => "rate_{$chatRowId}_2"]],
        [['text' => "خوب 😐", 'callback_data' => "rate_{$chatRowId}_3"]],
        [['text' => "بسیار خوب 😃", 'callback_data' => "rate_{$chatRowId}_4"]],
        [['text' => "عالی 🤩", 'callback_data' => "rate_{$chatRowId}_5"]]
    ]]);
    sendMessage($ticketClosed, $keys, 'html');

    $keys = json_encode(['inline_keyboard' => [
        [
            ['text' => "$from_id", 'callback_data' => "NetFreedomVPN"],
            ['text' => "آیدی کاربر", 'callback_data' => 'NetFreedomVPN']
        ],
        [
            ['text' => $first_name ?? " ", 'callback_data' => "NetFreedomVPN"],
            ['text' => "اسم کاربر", 'callback_data' => 'NetFreedomVPN']
        ],
        [
            ['text' => "$title", 'callback_data' => 'NetFreedomVPN'],
            ['text' => "عنوان", 'callback_data' => 'NetFreedomVPN']
        ],
        [
            ['text' => "$category", 'callback_data' => 'NetFreedomVPN'],
            ['text' => "دسته بندی", 'callback_data' => 'NetFreedomVPN']
        ],
    ]]);
    sendMessage("☑️| تیکت توسط کاربر بسته شد", $keys, "HTML", $admin);
}

// --- ادامه مکالمه تیکت (پاسخ کاربر) ---
if (preg_match('/^replySupport_(.*)/', (string)$data, $match)) {
    $chatRowId = intval($match[1]);
    delMessage();

    $stmt = $connection->prepare("SELECT * FROM `chats` WHERE `id` = ?");
    $stmt->bind_param("i", $chatRowId);
    $stmt->execute();
    $ticketInfo = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    $historyText = "";
    if ($ticketInfo) {
        $ticketTitle = $ticketInfo['title'];
        $ticketCat = $ticketInfo['category'];

        // نمایش آخرین ۵ پیام
        $hStmt = $connection->prepare("SELECT * FROM `chats_info` WHERE `chat_id` = ? ORDER BY `id` DESC LIMIT 5");
        $hStmt->bind_param("i", $chatRowId);
        $hStmt->execute();
        $historyRows = $hStmt->get_result()->fetch_all(MYSQLI_ASSOC);
        $hStmt->close();

        $historyRows = array_reverse($historyRows);

        $historyText = "💬 <b>موضوع تیکت:</b> " . htmlspecialchars($ticketTitle) . "\n" .
                       "📂 <b>دسته‌بندی:</b> " . htmlspecialchars($ticketCat) . "\n\n";

        if (!empty($historyRows)) {
            $historyText .= "📜 <b>آخرین پیام‌های گفتگو:</b>\n";
            foreach ($historyRows as $hRow) {
                $sender = ($hRow['msg_type'] == 'admin' || $hRow['msg_type'] == 'ADMIN') ? "👤 <b>پشتیبانی:</b>" : "👤 <b>شما:</b>";
                $textVal = $hRow['text'];
                $fileData = json_decode($textVal, true);
                if (is_array($fileData) && isset($fileData['file_id'])) {
                    $fileType = $fileData['file_type'] ?? 'فایل';
                    $caption = !empty($fileData['caption']) ? " - " . $fileData['caption'] : "";
                    $textVal = "📎 [فایل ارسالی: " . ($fileType == 'voice' ? 'وویس' : $fileType) . $caption . "]";
                }
                $historyText .= "{$sender} <i>" . htmlspecialchars($textVal) . "</i>\n";
            }
            $historyText .= "\n";
        }
    }

    $historyText .= "✍️ <b>لطفا پیام خود را بنویسید یا فایل خود را ارسال کنید:</b>";

    $keys = json_encode(['inline_keyboard' => [
        [getMiniAppBtn('ادامه در مینی‌اپ 📱', "tickets-{$chatRowId}")],
        [TelegramButton::cancelBtn('fa', 'انصراف ❌', 'Cancel', 'mainMenu')]
    ]]);

    $res = sendMessage($historyText, $keys, "HTML");
    $prompt_msg_id = $res->result->message_id ?? null;
    setUser("sendMsg_" . $chatRowId . "_" . $prompt_msg_id);
}

// --- ارسال پیام کاربر در مکالمه تیکت موجود ---
if (preg_match('/^sendMsg_(?P<id>\d+)(?:_(?P<prompt_id>\d+))?/', (string)($userInfo['step'] ?? ''), $match) && ($text ?? '') != ($buttonValues['cancel'] ?? '')) {
    if (trim($text ?? '') == "" && $fileid === null) {
        sendMessage("⚠️ متن پیام نمی‌تواند خالی باشد. لطفا پاسخ خود را بنویسید یا فایل ارسال کنید:");
        exit();
    }
    $ticketRowId = $match['id'];
    $prompt_id = $match['prompt_id'] ?? null;

    // حذف پیام prompt
    if ($prompt_id) {
        delMessage($prompt_id, $from_id);
    }
    // حذف پیام کاربر
    delMessage($message_id, $from_id);

    $stmt = $connection->prepare("SELECT * FROM `chats` WHERE `id` = ?");
    $stmt->bind_param("i", $ticketRowId);
    $stmt->execute();
    $ticketInfo = $stmt->get_result()->fetch_assoc();
    $stmt->close();
    $ticketTitle = $ticketInfo['title'];
    $ticketCat = $ticketInfo['category'];

    $time = time();
    if ($fileid === null) {
        $text_safe = $text;
        $stmt = $connection->prepare("INSERT INTO `chats_info` (`chat_id`,`sent_date`,`msg_type`,`text`) VALUES
                    (?,?,'USER',?)");
        $stmt->bind_param("iis", $ticketRowId, $time, $text_safe);
        $stmt->execute();
        $stmt->close();
    } else {
        $file_json = json_encode(['file_id' => $fileid, 'caption' => $caption, 'file_type' => $filetype], JSON_UNESCAPED_UNICODE);
        $stmt = $connection->prepare("INSERT INTO `chats_info` (`chat_id`,`sent_date`,`msg_type`,`text`) VALUES
                    (?,?,'USER',?)");
        $stmt->bind_param("iis", $ticketRowId, $time, $file_json);
        $stmt->execute();
        $stmt->close();
    }

    // ویرایش مکالمه هر دو طرف
    updateConversationMessages($connection, $ticketRowId, $admin);

    // پیام تأییدیه به کاربر
    sendMessage("✅ کاربر عزیز پیام شما ارسال شد. منتظر پاسخ ادمین باشید.", getMainKeys(), "HTML");
    setUser("none");
}

// --- رأی دادن به تیکت ---
if (preg_match("/^rate_+([0-9])+_+([0-9])/", (string)$data, $match)) {
    $rowChatId = $match[1];
    $rate = $match[2];

    $stmt = $connection->prepare("SELECT * FROM `chats` WHERE `id` = ?");
    $stmt->bind_param("i", $rowChatId);
    $stmt->execute();
    $ticketInfo = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    // جلوگیری از ارور دستیابی به آفست روی مقدار null
    $title = $ticketInfo['title'] ?? 'بدون عنوان';
    $category = $ticketInfo['category'] ?? 'عمومی';


    $stmt = $connection->prepare("UPDATE `chats` SET `rate` = $rate WHERE `id` = ?");
    $stmt->bind_param("i", $rowChatId);
    $stmt->execute();
    $stmt->close();
    editText($message_id, "✅");

    $keys = json_encode(['inline_keyboard' => [
        [
            ['text' => "رای تیکت", 'callback_data' => "NetFreedomVPN"]
        ],
    ]]);

    sendMessage("
📨|رأی به تیکت 

👤 آیدی عددی: $from_id
❕نام کاربر: $first_name
❗️نام کاربری: $username
〽️ عنوان: $title
⚜️ دسته بندی: $category
❤️ رای: $rate
 ⁮⁮
    ", $keys, "HTML", $admin);
}

// --- آخرین پیام‌های تیکت ---
if (preg_match('/^latestMsg_(.*)/', (string)$data, $match)) {
    $stmt = $connection->prepare("SELECT * FROM `chats_info` WHERE `chat_id` = ? ORDER BY `sent_date` DESC LIMIT 10");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $chatList = $stmt->get_result();
    $stmt->close();
    $output = "";
    while ($row = $chatList->fetch_assoc()) {
        $rowId = $row['id'];
        $type = $row['msg_type'] == "USER" ? "کاربر" : "ادمین";
        $text = $row['text'];
        if (isset(json_decode($text, true)['file_id'])) {
            $dec = json_decode($text, true);
            $ftype = $dec['file_type'] ?? 'photo';
            $typeName = "فایل";
            if ($ftype == 'photo') $typeName = "تصویر";
            elseif ($ftype == 'video') $typeName = "ویدیو";
            elseif ($ftype == 'voice') $typeName = "صدا/وویس";
            $text = "$typeName /dlPic" . $rowId;
        }

        $output .= "<i>[$type]</i>\n$text\n\n";
    }
    sendMessage($output, null, "html");
}

// --- دانلود فایل تیکت ---
if (preg_match('/^\/dlPic(\d+)/', (string)($text ?? ''), $match)) {
    $stmt = $connection->prepare("SELECT * FROM `chats_info` WHERE `id` = ?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $chatList = $stmt->get_result();
    $stmt->close();
    $output = "";
    while ($row = $chatList->fetch_assoc()) {
        $text = json_decode($row['text'], true);
        $fileid = $text['file_id'];
        $caption = $text['caption'] ?? '';
        $chatInfoId = $row['chat_id'];
        $stmt = $connection->prepare("SELECT * FROM `chats` WHERE `id` = ?");
        $stmt->bind_param("i", $chatInfoId);
        $stmt->execute();
        $info = $stmt->get_result()->fetch_assoc();
        $stmt->close();

        $userid = $info['user_id'];

        if ($userid == $from_id || $from_id == $admin || $userInfo['isAdmin'] == true) {
            $ftype = $text['file_type'] ?? 'photo';

            // لود اطلاعات کامل فرستنده جهت الحاق به کپشن عکس/فایل
            if (strtoupper($row['msg_type'] ?? '') == "USER") {
                $stmtUser = $connection->prepare("SELECT `name`, `username` FROM `users` WHERE `userid` = ?");
                $stmtUser->bind_param("i", $userid);
                $stmtUser->execute();
                $uRow = $stmtUser->get_result()->fetch_assoc();
                $stmtUser->close();

                $uName = $uRow['name'] ?? "کاربر بی‌نام";
                $uUsername = (!empty($uRow['username']) && $uRow['username'] != "ندارد") ? " (@" . $uRow['username'] . ")" : "";
                $senderInfo = "👤 <b>فرستنده:</b> {$uName} {$uUsername} (<code>{$userid}</code>)\n";
            } else {
                $senderInfo = "👮‍♂️ <b>فرستنده:</b> پشتیبانی\n";
            }

            $captionText = $senderInfo . "🎫 <b>تیکت:</b> #{$chatInfoId}\n━━━━━━━━━━━━━━\n" . (!empty($caption) ? "📝 <b>کپشن:</b> " . htmlspecialchars($caption) : "");

            if ($ftype == 'photo') {
                sendPhoto($fileid, $captionText, null, "HTML");
            } elseif ($ftype == 'video') {
                bot('sendVideo', ['chat_id' => $chat_id, 'video' => $fileid, 'caption' => $captionText, 'parse_mode' => 'HTML']);
            } elseif ($ftype == 'voice') {
                bot('sendVoice', ['chat_id' => $chat_id, 'voice' => $fileid, 'caption' => $captionText, 'parse_mode' => 'HTML']);
            } else {
                bot('sendDocument', ['chat_id' => $chat_id, 'document' => $fileid, 'caption' => $captionText, 'parse_mode' => 'HTML']);
            }
        }
    }
}
