<?php
global $mainValues, $removeKeyboard, $buttonProps, $markup, $botState, $connection, $buttonValues, $botUrl, $admin, $userInfo,
 $from_id, $text, $data, $message_id, $cancelKey, $fullName, $fileid, $chat_id, $apiToken,$panelUrl, $limitip, $days, $volume, $inbound_id_raw,
 $serverType, $expire_date, $first_name, $rahgozar, $date, $directSubUrl, $permissions, $newRremark;
include_once 'config.php';
include 'payments.php';
// 1. دریافت ورودی به صورت آبجکت (استاندارد)
$input = file_get_contents("php://input");
$update = json_decode($input);

// 2. جلوگیری از ارور درخواست‌های خالی
if (is_null($update) || empty($update)) {
    die('Silent exit');
}

// 3. تعریف متغیرهای سراسری
$data = $text = $chat_id = $message_id = $from_id = $first_name = $username = $caption = $fileid = $filetype = $callbackId = null;

// 4. استخراج اطلاعات
if (isset($update->callback_query)) {
    $callbackId = $update->callback_query->id;
    $data = $update->callback_query->data;
    $chat_id = $update->callback_query->message->chat->id;
    $message_id = $update->callback_query->message->message_id;
    $from_id = $update->callback_query->from->id;
    $first_name = $update->callback_query->from->first_name ?? '';
    $username = $update->callback_query->from->username ?? '';
    if (isset($update->callback_query->message->reply_markup->inline_keyboard)) {
        $markup = json_decode(json_encode($update->callback_query->message->reply_markup->inline_keyboard), true);
    }
}
elseif (isset($update->message)) {
    $chat_id = $update->message->chat->id;
    $message_id = $update->message->message_id;
    $from_id = $update->message->from->id;
    $first_name = $update->message->from->first_name ?? '';
    $username = $update->message->from->username ?? '';
    $text = $update->message->text ?? '';
    $caption = $update->message->caption ?? '';

    // دریافت عکس یا فایل (رفع مشکل عدم تشخیص عکس)
    if (isset($update->message->photo)) {
        $photo = $update->message->photo;
        $fileid = end($photo)->file_id; // آخرین عکس باکیفیت‌ترین است
        $filetype = 'photo';
    }
    elseif (isset($update->message->document)) {
        $fileid = $update->message->document->file_id;
        $filetype = 'document';
    }
    elseif (isset($update->message->video)) {
        $fileid = $update->message->video->file_id;
        $filetype = 'video';
    }
    elseif (isset($update->message->voice)) {
        $fileid = $update->message->voice->file_id;
        $filetype = 'voice';
    }
    elseif (isset($update->message->audio)) {
        $fileid = $update->message->audio->file_id;
        $filetype = 'audio';
    }
}

// اگر chat_id نبود متوقف شو
if (!$chat_id)
    die();

// مقادیر پیش‌فرض برای جلوگیری از ارور
$data = $data ?? "";
$text = $text ?? "";

$robotState = $botState['botState'] ?? "on";

// فعال‌سازی لاگ در فایل debug.txt
ini_set('log_errors', 1);
$log_dir = __DIR__ . '/storage/logs';
if (!is_dir($log_dir)) {
    @mkdir($log_dir, 0775, true);
}
ini_set('error_log', $log_dir . '/debug.txt');
error_reporting(E_ALL);
ini_set('display_errors', 0); // نمایش خطا به کاربر خاموش باشد تا ربات خراب نشود

check();
if (isset($from_id)) {
    syncUserTraffic($from_id);
}
sendAction('typing', $chat_id);

//GOTOSTART:
if ($userInfo['step'] == "banned" && $from_id != $admin && $userInfo['isAdmin'] != true) {
    sendMessage($mainValues['banned']);
    exit();
}
$checkSpam = checkSpam();
if (is_numeric($checkSpam)) {
    $time = jdate("Y-m-d H:i:s", $checkSpam);
    sendMessage("اکانت شما به دلیل اسپم مسدود شده است\nزمان آزادسازی اکانت شما: \n$time");
    exit();
}

// $data is now safe to use here
if (preg_match("/^haveJoined(.*)/", (string)$data, $match)) {
    if ($joniedState == "kicked" || $joniedState == "left") {
        alert($mainValues['not_joine_yet']);
        exit();
    }
    else {
        delMessage();
        $text = $match[1];
    }
}
if (($joniedState == "kicked" || $joniedState == "left") && $from_id != $admin) {
    sendMessage(str_replace("CHANNEL-ID", $channelLock, $mainValues['join_channel_message']), json_encode(['inline_keyboard' => [
            [['text' => $buttonValues['join_channel'], 'url' => "https://t.me/" . str_replace("@", "", $botState['lockChannel'])]],
            [['text' => $buttonValues['have_joined'], 'callback_data' => 'haveJoined' . $text]],
        ]]), "HTML");
    exit;
}
if ($robotState == "off" && $from_id != $admin) {
    sendMessage($mainValues['bot_is_updating']);
    exit();
}


// Name confirmation callbacks & steps (Bot API 10.1+ Style Buttons)
if ($data === 'confirm_tg_name_yes') {
    setUser('done', 'first_start');
    setUser('none', 'step');
    sendMessage("نام کاربری شما تایید شد. خوش آمدید! 😊");
    
    // Notify admin
    sendNewMemberNotification($from_id, $first_name, $username);
    
    // Welcome/Promotional message to the user (check if referred)
    $stmt = $connection->prepare("SELECT refered_by FROM `users` WHERE `userid` = ?");
    $stmt->bind_param("i", $from_id);
    $stmt->execute();
    $uRowRef = $stmt->get_result()->fetch_assoc();
    $stmt->close();
    
    $welc = "خوش آمدید! 😍 از اینکه ما را انتخاب کردید سپاسگزاریم.\nاگر مایل هستید، می‌توانید اولین اشتراک آزمایشی خود را به صورت رایگان دریافت کنید یا نسبت به خرید اشتراک‌های پرسرعت اقدام کنید. 🚀";
    if (!empty($uRowRef['refered_by'])) {
        $welc = "سلام! شما با لینک دعوت وارد ربات شدید و هدیه ورودی به شما تعلق گرفت. 😍\n\n" . $welc;
    }
    sendMessage($welc);
    
    sendMessage($mainValues['start_message'], getMainKeys());
    exit();
}
if ($data === 'confirm_tg_name_no') {
    setUser('wait_custom_name', 'step');
    sendMessage("لطفاً نام دلخواه خود را برای نمایش در سیستم تایپ و ارسال کنید: ✍️", $cancelKey);
    exit();
}
if ($userInfo['step'] === 'wait_custom_name') {
    if ($text === $buttonValues['cancel']) {
        setUser('done', 'first_start');
        setUser('none', 'step');
        sendMessage("استفاده از نام تلگرام تایید شد. خوش آمدید! 😊");
        
        // Notify admin
        sendNewMemberNotification($from_id, $first_name, $username);
        
        // Welcome/Promotional message to the user (check if referred)
        $stmt = $connection->prepare("SELECT refered_by FROM `users` WHERE `userid` = ?");
        $stmt->bind_param("i", $from_id);
        $stmt->execute();
        $uRowRef = $stmt->get_result()->fetch_assoc();
        $stmt->close();
        
        $welc = "خوش آمدید! 😍 از اینکه ما را انتخاب کردید سپاسگزاریم.\nاگر مایل هستید، می‌توانید اولین اشتراک آزمایشی خود را به صورت رایگان دریافت کنید یا نسبت به خرید اشتراک‌های پرسرعت اقدام کنید. 🚀";
        if (!empty($uRowRef['refered_by'])) {
            $welc = "سلام! شما با لینک دعوت وارد ربات شدید و هدیه ورودی به شما تعلق گرفت. 😍\n\n" . $welc;
        }
        sendMessage($welc);
        
        sendMessage($mainValues['start_message'], getMainKeys());
        exit();
    } elseif (!empty($text) && strpos($text, '/') !== 0) {
        setUser($text, 'name');
        setUser('done', 'first_start');
        setUser('none', 'step');
        sendMessage("نام کاربری شما با موفقیت به <b>" . htmlspecialchars($text) . "</b> تغییر یافت. ✨", null, 'html');
        
        // Notify admin
        sendNewMemberNotification($from_id, $text, $username);
        
        // Welcome/Promotional message to the user (check if referred)
        $stmt = $connection->prepare("SELECT refered_by FROM `users` WHERE `userid` = ?");
        $stmt->bind_param("i", $from_id);
        $stmt->execute();
        $uRowRef = $stmt->get_result()->fetch_assoc();
        $stmt->close();
        
        $welc = "خوش آمدید! 😍 از اینکه ما را انتخاب کردید سپاسگزاریم.\nاگر مایل هستید، می‌توانید اولین اشتراک آزمایشی خود را به صورت رایگان دریافت کنید یا نسبت به خرید اشتراک‌های پرسرعت اقدام کنید. 🚀";
        if (!empty($uRowRef['refered_by'])) {
            $welc = "سلام! شما با لینک دعوت وارد ربات شدید و هدیه ورودی به شما تعلق گرفت. 😍\n\n" . $welc;
        }
        sendMessage($welc);
        
        sendMessage($mainValues['start_message'], getMainKeys());
        exit();
    }
}

// OTP verification chat listener
if (preg_match('/^\d{6}$/', (string)$text)) {
    $stmt = $connection->prepare("SELECT temp FROM `users` WHERE `userid` = ?");
    $stmt->bind_param("i", $from_id);
    $stmt->execute();
    $tempVal = $stmt->get_result()->fetch_assoc()['temp'] ?? '';
    $stmt->close();

    if (strpos($tempVal, 'otp:') === 0) {
        $parts = explode(':', $tempVal);
        $savedOtp = $parts[1] ?? '';
        $expiry = intval($parts[2] ?? 0);

        if ($savedOtp === $text && $expiry > time()) {
            $sessionToken = bin2hex(random_bytes(16));
            $newTemp = "otp_verified:$sessionToken:" . (time() + 300);

            $upStmt = $connection->prepare("UPDATE `users` SET `temp` = ? WHERE `userid` = ?");
            $upStmt->bind_param("si", $newTemp, $from_id);
            $upStmt->execute();
            $upStmt->close();

            sendMessage("✅ هویت شما با موفقیت تایید شد! می‌توانید به صفحه مرورگر خود بازگشته و دکمه ورود را لمس کنید.");
            exit();
        } else {
            sendMessage("❌ کد تأیید نامعتبر است یا زمان آن منقضی شده است. مجدداً در مرورگر تلاش کنید.");
            exit();
        }
    }
}

if ($text === '/login' || $text === '/admin_login' || $text === '/start login') {
    $sessionToken = bin2hex(random_bytes(16));
    $newTemp = "session:$sessionToken:" . (time() + 86400 * 30); // 30 days valid

    $sessionExpiry = time() + 86400 * 30;
    $upStmt = $connection->prepare("UPDATE `users` SET `temp` = ?, `session_token` = ?, `session_expiry` = ? WHERE `userid` = ?");
    $upStmt->bind_param("ssii", $newTemp, $sessionToken, $sessionExpiry, $from_id);
    $upStmt->execute();
    $upStmt->close();

    $webUrl = "https://wizwiz.villux.ir:8443/Netfreedom/mini-app/?token=" . $sessionToken . "&userid=" . $from_id;
    sendMessage("🔑 <b>توکن ورود اختصاصی شما:</b>\n\n<code>$sessionToken</code>\n\nجهت ورود بدون نیاز به تایید هویت روی دکمه زیر ضربه بزنید یا توکن بالا را کپی کرده و در تب توکن اختصاصی مینی‌اپ وارد کنید.", json_encode(['inline_keyboard' => [
        [['text' => 'ورود مستقیم به پنل 📱', 'url' => $webUrl, 'style' => 'primary', 'icon_custom_emoji_id' => '5409008750893734809']]
    ]]), "HTML", $from_id);
    exit();
}

// --- FIX 2: Strict check for /start at the BEGINNING of the message ---
if (strpos($text, "/start ") === 0) {
    $startParam = str_replace("/start ", "", $text);
    if (preg_match('/^otp_(\d{6})$/', $startParam, $otpMatch)) {
        $otpCode = $otpMatch[1];
        $stmt = $connection->prepare("SELECT temp FROM `users` WHERE `userid` = ?");
        $stmt->bind_param("i", $from_id);
        $stmt->execute();
        $tempVal = $stmt->get_result()->fetch_assoc()['temp'] ?? '';
        $stmt->close();

        if (strpos($tempVal, 'otp:') === 0) {
            $parts = explode(':', $tempVal);
            $savedOtp = $parts[1] ?? '';
            $expiry = intval($parts[2] ?? 0);

            if ($savedOtp === $otpCode && $expiry > time()) {
                $sessionToken = bin2hex(random_bytes(16));
                $newTemp = "otp_verified:$sessionToken:" . (time() + 300);

                $upStmt = $connection->prepare("UPDATE `users` SET `temp` = ? WHERE `userid` = ?");
                $upStmt->bind_param("si", $newTemp, $from_id);
                $upStmt->execute();
                $upStmt->close();

                sendMessage("✅ هویت شما با موفقیت تایید شد! می‌توانید به صفحه مرورگر خود بازگشته و دکمه ورود را لمس کنید.");
                exit();
            }
        }
        sendMessage("❌ این لینک تأیید نامعتبر یا منقضی شده است.");
        exit();
    }

    $inviter = $startParam;
    if ($inviter < 0)
        exit();
    if ($uinfo->num_rows == 0 && $inviter != $from_id) {
        $stmt = $connection->prepare("SELECT * FROM `users` WHERE `userid` = ?");
        $stmt->bind_param("i", $inviter);
        $stmt->execute();
        $inviterInfo = $stmt->get_result();
        $stmt->close();

        if ($inviterInfo->num_rows > 0) {
            $first_name = !empty($first_name) ? $first_name : " ";
            $username = !empty($username) ? $username : " ";
            if ($uinfo->num_rows == 0) {
                $sql = "INSERT INTO `users` (`userid`, `name`, `username`, `refcode`, `wallet`, `date`, `refered_by`)
                                    VALUES (?,?,?, 0,0,?,?)";
                $stmt = $connection->prepare($sql);
                $time = time();
                $stmt->bind_param("issii", $from_id, $first_name, $username, $time, $inviter);
                $stmt->execute();
                $stmt->close();
            }
            else {
                $refcode = time();
                $sql = "UPDATE `users` SET `refered_by` = ? WHERE `userid` = ?";
                $stmt = $connection->prepare($sql);
                $stmt->bind_param("si", $inviter, $from_id);
                $stmt->execute();
                $stmt->close();
            }
            $stmt = $connection->prepare("SELECT * FROM `users` WHERE `userid`=?");
            $stmt->bind_param("i", $from_id);
            $stmt->execute();
            $uinfo = $stmt->get_result();
            $userInfo = $uinfo->fetch_assoc();
            $stmt->close();

            setUser("referedBy" . $inviter);
            $userInfo['step'] = "referedBy" . $inviter;
            sendMessage($mainValues['invited_user_joined_message'], null, null, $inviter);
        }
    }

    $text = "/start";
}

if (empty($userInfo['phone']) && $from_id != $admin && empty($userInfo['isAdmin']) && ($botState['requirePhone'] ?? "") == "on") {
    if (isset($update['message']['contact'])) {
        $contact = $update['message']['contact'];
        $phone_number = $contact['phone_number'];
        $phone_id = $contact['user_id'];
        if ($phone_id != $from_id) {
            sendMessage($mainValues['please_select_from_below_buttons']);
            exit();
        }
        else {
            if (!preg_match('/^\+98(\d+)/', $phone_number) && !preg_match('/^98(\d+)/', $phone_number) && !preg_match('/^0098(\d+)/', $phone_number) && $botState['requireIranPhone'] == 'on') {
                sendMessage($mainValues['use_iranian_number_only']);
                exit();
            }
            setUser($phone_number, 'phone');

            sendMessage($mainValues['phone_confirmed'], $removeKeyboard);
            $text = "/start";

            $stmt = $connection->prepare("SELECT * FROM `users` WHERE `userid`=?");
            $stmt->bind_param("i", $from_id);
            $stmt->execute();
            $uinfo = $stmt->get_result();
            $userInfo = $uinfo->fetch_assoc();
            $stmt->close();
        }
    }
    else {
        sendMessage($mainValues['send_your_phone_number'], json_encode([
            'keyboard' => [[[
                        'text' => $buttonValues['send_phone_number'],
                        'request_contact' => true,
                    ]]],
            'resize_keyboard' => true
        ]));
        exit();
    }
}
if (preg_match('/^\/([Ss]tart)/', (string)$text) or $text == $buttonValues['back_to_main'] or $data == 'mainMenu') {
    setUser();
    setUser("", "temp");
    
    $adminsList = $admins ?? [];
    $isUserAdmin = ($from_id == $admin || in_array($from_id, $adminsList) || $userInfo['isAdmin'] == true);
    
    if (($userInfo['first_start'] ?? '') !== 'done' && !$isUserAdmin) {
        setUser('confirm_name', 'step');
        $keys = json_encode(['inline_keyboard' => [
            [
                ['text' => 'بله (تایید نام تلگرام)', 'callback_data' => 'confirm_tg_name_yes', 'style' => 'success', 'icon_custom_emoji_id' => '5208880351690112495'],
                ['text' => 'خیر (نام دیگر)', 'callback_data' => 'confirm_tg_name_no', 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']
            ]
        ]]);
        sendMessage("سلام! آیا تمایل دارید از نام پروفایل تلگرامی خود (<b>$first_name</b>) به عنوان نام در سیستم استفاده کنید؟", $keys, "html");
    } else {
        if (isset($data) and $data == "mainMenu") {
            $res = editText($message_id, $mainValues['start_message'], getMainKeys());
            if (!$res->ok) {
                sendMessage($mainValues['start_message'], getMainKeys());
            }
        }
        else {
            if ($from_id != $admin && empty($userInfo['first_start'])) {
                setUser('sent', 'first_start');
                sendNewMemberNotification($from_id, $first_name, $username);
            }
            sendMessage($mainValues['start_message'], getMainKeys());
        }
    }
}

// -------------------------------------------------------------
// Dynamic handlers routing
// -------------------------------------------------------------
$isAdmin = ($from_id == $admin || $userInfo['isAdmin'] == true);

if ($isAdmin) {
    include_once 'handlers/admin_settings.php';
    include_once 'handlers/admin_servers.php';
    include_once 'handlers/admin_tickets.php';
}

// User-side handlers
include_once 'handlers/user_account.php';
include_once 'handlers/user_buy.php';
include_once 'handlers/user_config.php';
include_once 'handlers/user_tickets.php';

// Downloads / Cancel / Helpers at the very end
if ($data == 'reciveApplications') {
    $stmt = $connection->prepare("SELECT * FROM `needed_sofwares` WHERE `status`=1");
    $stmt->execute();
    $respd = $stmt->get_result();
    $stmt->close();

    $keyboard = [];
    while ($file = $respd->fetch_assoc()) {
        $link = $file['link'];
        $title = $file['title'];
        $keyboard[] = ['text' => "$title", 'url' => $link];
    }
    $keyboard[] = ['text' => $buttonValues['back_to_main'], 'callback_data' => "mainMenu",'style' => 'danger', 'icon_custom_emoji_id' => '5352759161945867747'];
    $keyboard = array_chunk($keyboard, 1);
    editText($message_id, "
🔸می توانید به راحتی همه فایل ها را (به صورت رایگان) دریافت کنید
📌 شما میتوانید برای راهنمای اتصال به سرویس کانال رسمی مارا دنبال کنید و همچنین از دکمه های زیر میتوانید برنامه های مورد نیاز هر سیستم عامل را دانلود کنید

✅ پیشنهاد ما برنامه V2rayng است زیرا کار با آن ساده است و برای تمام سیستم عامل ها قابل اجرا است، میتوانید به بخش سیستم عامل مورد نظر مراجعه کنید و لینک دانلود را دریافت کنید
", json_encode(['inline_keyboard' => $keyboard]));
}

if ($text == $buttonValues['cancel']) {
    setUser();
    $stmt = $connection->prepare("DELETE FROM `server_plans` WHERE `active`=0");
    $stmt->execute();
    $stmt->close();

    @bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    @bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id - 1]);
    sendMessage($mainValues['reached_main_menu'], getMainKeys());
}

function getBtn($key, $callback_data = null, $url = null, $web_app_url = null) {
    global $buttonValues, $buttonProps;

    // گرفتن متن دکمه (اگر وجود نداشت خود نام کلید رو بذار)
    $btn = ['text' => $buttonValues[$key] ?? $key];

    // اختصاص کال‌بک یا لینک
    if ($callback_data !== null) $btn['callback_data'] = $callback_data;
    if ($url !== null) $btn['url'] = $url;
    if ($web_app_url !== null) {
        $btn['web_app'] = ['url' => $web_app_url];
    }

    // اعمال خودکار رنگ و ایموجی در صورت وجود
    if (isset($buttonProps[$key])) {
        if (isset($buttonProps[$key]['style'])) {
            $btn['style'] = $buttonProps[$key]['style'];
        }
        if (isset($buttonProps[$key]['icon_custom_emoji_id'])) {
            $btn['icon_custom_emoji_id'] = $buttonProps[$key]['icon_custom_emoji_id'];
        }
    }
    return $btn;
}
?>