<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

$content = file_get_contents("php://input");
$update = json_decode($content, true);

include('class/bot.php');
include('class/db.php');

$botToken = '8829690343:AAE1F7b2R7ABJ7mvXOmqHcXPUPDEEs7e_sY';
$bot = new bot($botToken, $content);
$db = new db();

$userInfo = $db->getinfo($bot->chatid, $bot->username, $bot->firstname, $bot->lastname);
$userReq1 = isset($userInfo['req1']) ? $userInfo['req1'] : '';
$userReq2 = isset($userInfo['req2']) ? $userInfo['req2'] : '';

$sql = "select * from admin";
$stmt = $db->conn->prepare($sql);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$adminRow = $stmt->fetch();
$idList = array_filter(array_map('trim', explode(",", $adminRow['admin_list'])));
$blockList = array_filter(array_map('trim', explode(",", $adminRow['block_list'])));
$isAdmin = in_array((string)$bot->chatid, $idList, true);
$isBlocked = in_array((string)$bot->chatid, $blockList, true);

$BTN_BACK = '🔙 بازگشت';
$BTN_SEND_CONTENT = 'ارسال ویدیو و پیام';
$BTN_INSTAGRAM = 'آدرس اینستاگرام';
$BTN_BALE = 'آدرس کانال بله';
$BTN_PISH_AGAHI = 'آدرس کانال پیش آگاهی';
$BTN_DONATE = 'لینک حمایت مالی';
$BTN_ADS = 'ای دی تبلیغات';
$BTN_ADMIN_CONTACT = 'ارتباط با مدیر کانال';
$BTN_ADMIN_BROADCAST = '📢 ارسال پیام همگانی';
$BTN_ADMIN_SINGLE = '✉️ ارسال پیام تکی';
$BTN_ADMIN_STATS = '📊 آمار کاربران';
$BTN_ADMIN_LIST = '👥 لیست ادمین‌ها';
$BTN_ADMIN_BLOCK = '🚫 لیست بلاک‌ها';
$BTN_ADMIN_EDIT_LIST = '✏️ ویرایش لیست ادمین‌ها';
$BTN_BLOCK_ADD = '➕ بلاک کاربر جدید';

function buildBackKey()
{
    global $BTN_BACK;
    return buildReplyKeyboardJson(
        array(
            array(
                array("text" => $BTN_BACK)
            ),
        )
    );
}

function buildUserMenu()
{
    global $BTN_SEND_CONTENT, $BTN_INSTAGRAM, $BTN_BALE, $BTN_PISH_AGAHI, $BTN_DONATE, $BTN_ADS, $BTN_ADMIN_CONTACT;

    return buildReplyKeyboardJson(
        array(
            array(array("text" => $BTN_SEND_CONTENT)),
            array(array("text" => $BTN_INSTAGRAM)),
            array(array("text" => $BTN_BALE)),
            array(array("text" => $BTN_PISH_AGAHI)),
            array(array("text" => $BTN_DONATE)),
            array(array("text" => $BTN_ADS)),
            array(array("text" => $BTN_ADMIN_CONTACT)),
        )
    );
}

function buildAdminMenu()
{
    global $BTN_ADMIN_BROADCAST, $BTN_ADMIN_SINGLE, $BTN_ADMIN_STATS, $BTN_ADMIN_LIST, $BTN_ADMIN_BLOCK;

    return buildReplyKeyboardJson(
        array(
            array(array("text" => $BTN_ADMIN_BROADCAST)),
            array(array("text" => $BTN_ADMIN_SINGLE)),
            array(array("text" => $BTN_ADMIN_STATS)),
            array(array("text" => $BTN_ADMIN_LIST)),
            array(array("text" => $BTN_ADMIN_BLOCK)),
        )
    );
}

function buildAdminListKeyboard()
{
    global $BTN_ADMIN_EDIT_LIST, $BTN_BACK;

    return buildReplyKeyboardJson(
        array(
            array(array("text" => $BTN_ADMIN_EDIT_LIST)),
            array(array("text" => $BTN_BACK)),
        )
    );
}

function buildBlockMenuKeyboard($blockList)
{
    global $BTN_BLOCK_ADD, $BTN_BACK;

    $keyboard = array();

    if (!empty($blockList)) {
        foreach ($blockList as $blockedId) {
            $keyboard[] = array(
                array("text" => "✅ آنبلاک " . $blockedId)
            );
        }
    }

    $keyboard[] = array(array("text" => $BTN_BLOCK_ADD));
    $keyboard[] = array(array("text" => $BTN_BACK));

    return buildReplyKeyboardJson($keyboard);
}

function buildAdminReplyKeyboard($userChatId)
{
    return buildReplyKeyboardJson(
        array(
            array(
                array("text" => "پاسخ به کاربر " . $userChatId)
            ),
        )
    );
}

function isMenuButton($text, $isAdmin)
{
    global $BTN_BACK, $BTN_SEND_CONTENT, $BTN_INSTAGRAM, $BTN_BALE, $BTN_PISH_AGAHI;
    global $BTN_DONATE, $BTN_ADS, $BTN_ADMIN_CONTACT, $BTN_ADMIN_BROADCAST, $BTN_ADMIN_SINGLE;
    global $BTN_ADMIN_STATS, $BTN_ADMIN_LIST, $BTN_ADMIN_BLOCK, $BTN_ADMIN_EDIT_LIST, $BTN_BLOCK_ADD;

    $buttons = array(
        $BTN_BACK,
        $BTN_SEND_CONTENT,
        $BTN_INSTAGRAM,
        $BTN_BALE,
        $BTN_PISH_AGAHI,
        $BTN_DONATE,
        $BTN_ADS,
        $BTN_ADMIN_CONTACT,
        $BTN_ADMIN_EDIT_LIST,
        $BTN_BLOCK_ADD,
    );

    if ($isAdmin) {
        $buttons = array_merge($buttons, array(
            $BTN_ADMIN_BROADCAST,
            $BTN_ADMIN_SINGLE,
            $BTN_ADMIN_STATS,
            $BTN_ADMIN_LIST,
            $BTN_ADMIN_BLOCK,
        ));
    }

    if (in_array($text, $buttons, true)) {
        return true;
    }

    if (preg_match('/^✅ آنبلاک /', $text)) {
        return true;
    }

    if (preg_match('/^پاسخ به کاربر /', $text)) {
        return true;
    }

    return false;
}

function formatUserInfoForAdmin($chatId, $firstname, $lastname, $username)
{
    $name = trim($firstname . ' ' . $lastname);
    if ($name == '') {
        $name = 'نامشخص';
    }

    $usernameText = $username != '' ? '@' . $username : 'ندارد';

    return "👤 نام: $name\n🆔 chat id: $chatId\n📎 username: $usernameText";
}

function forwardToAdmins($bot, $idList, $userChatId, $messageId, $firstname = '', $lastname = '', $username = '')
{
    $userInfo = formatUserInfoForAdmin($userChatId, $firstname, $lastname, $username);
    $text = "پیام جدید از کاربر:\n$userInfo\n\nبرای پاسخ دکمه زیر را بزنید:";

    foreach ($idList as $adminChatId) {
        if ((string)$adminChatId === (string)$userChatId) {
            continue;
        }
        $bot->copyMessage($adminChatId, $userChatId, $messageId);
        $bot->sendmessage(
            urlencode($text),
            $adminChatId,
            buildAdminReplyKeyboard($userChatId)
        );
    }
}

function resetUserState($db, $chatid)
{
    $sql = "update users set req1='', req2='' where chatid='" . $chatid . "' ";
    $db->conn->exec($sql);
}

function showMainMenu($bot, $db, $isAdmin)
{
    if ($isAdmin) {
        $text = "🛠 پنل مدیریت ربات گیلان فورکا";
        $bot->sendmessage(urlencode($text), $bot->chatid, buildAdminMenu());
    } else {
        $text = "
🗣 سلام! به ربات هواشناسی گیلان فورکا خوش اومدی 😊
اینجا می‌تونی به‌صورت مستقیم عکس‌ها و فیلم‌هاتو داخل کانال ارسال کنی.
خوشحالیم که اینجایی
";
        $bot->sendmessage(urlencode($text), $bot->chatid, buildUserMenu());
    }
    resetUserState($db, $bot->chatid);
}

function saveAdminList($db, $list)
{
    $items = array_filter(array_map('trim', explode(',', $list)));
    $value = implode(',', $items);
    $sql = "update admin set admin_list = '" . $value . "' where id = 1";
    $db->conn->exec($sql);
    return $items;
}

function saveBlockList($db, $list)
{
    $items = array_filter(array_map('trim', $list));
    $value = implode(',', $items);
    $sql = "update admin set block_list = '" . $value . "' where id = 1";
    $db->conn->exec($sql);
    return $items;
}

if ($isBlocked && !$isAdmin) {
    $bot->sendmessage(urlencode("⛔️ شما از استفاده از این ربات محروم شده‌اید."), $bot->chatid, '');
    exit();
}

$channels = array(
    // '@mrpourrajabi',
);

$notJoinedChannels = array();
foreach ($channels as $channel) {
    if ($bot->inchannel($bot->chatid, $channel) != 'ok') {
        $notJoinedChannels[] = $channel;
    }
}

if (!empty($notJoinedChannels) && !$isAdmin) {
    $text = "
    درود $bot->firstname عزیز به ربات گیلان فورکا خوش اومدی💚
📈 ابتدا در کانال‌ زیر عضو شو👇🏻";

    $inline_keyboard = array();
    foreach ($notJoinedChannels as $channel) {
        $inline_keyboard[] = array(
            array("url" => "https://t.me/" . ltrim($channel, '@'), "text" => "کانال گیلان فورکا ")
        );
    }

    $inline_keyboard[] = array(
        array("callback_data" => "checkChannelSub", "text" => "✅ عضو شدم")
    );

    $key = buildInlineKeyboardJson($inline_keyboard);

    $bot->sendmessage(urlencode($text), $bot->chatid, $key);
    exit();
}

if ($bot->datamytext == 'checkChannelSub') {
    $bot->answerCallbackQuery();
    $bot->recmsg = '/start';
}

if ($bot->callbackQueryId != '') {
    $bot->answerCallbackQuery();
}

if ($bot->recmsg == "/start" || $bot->recmsg == $BTN_BACK) {
    showMainMenu($bot, $db, $isAdmin);
    exit();
}

// پاسخ به کاربر از دکمه reply keyboard
if ($isAdmin && preg_match('/^پاسخ به کاربر (.+)$/', $bot->recmsg, $matches)) {
    $targetChatId = trim($matches[1]);
    $text = "متن پاسخ خود را بنویسید و ارسال کنید.";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBackKey());
    $sql = "update users set req1='replyUser', req2='" . $targetChatId . "' where chatid='" . $bot->chatid . "' ";
    $db->conn->exec($sql);
    exit();
}

// آنبلاک کاربر
if ($isAdmin && preg_match('/^✅ آنبلاک (.+)$/', $bot->recmsg, $matches)) {
    $targetChatId = trim($matches[1]);
    $blockList = array_values(array_filter($blockList, function ($id) use ($targetChatId) {
        return (string)$id !== (string)$targetChatId;
    }));
    $blockList = saveBlockList($db, implode(',', $blockList));
    $text = "✅ کاربر $targetChatId از لیست بلاک خارج شد.";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBlockMenuKeyboard($blockList));
    exit();
}

// --- منوی ادمین ---

if ($isAdmin && $bot->recmsg == $BTN_ADMIN_BROADCAST) {
    $text = "پیام همگانی خود را ارسال کنید.\nاین پیام برای همه کاربران ربات ارسال خواهد شد.";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBackKey());
    $sql = "update users set req1='broadcast', req2='' where chatid='" . $bot->chatid . "' ";
    $db->conn->exec($sql);
    exit();
}

if ($isAdmin && $bot->recmsg == $BTN_ADMIN_SINGLE) {
    $text = "chat id کاربری که می‌خواهید به او پیام بدهید را ارسال کنید:";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBackKey());
    $sql = "update users set req1='singleMessage_id', req2='' where chatid='" . $bot->chatid . "' ";
    $db->conn->exec($sql);
    exit();
}

if ($isAdmin && $bot->recmsg == $BTN_ADMIN_STATS) {
    $sql = "select count(*) as total from users where chatid != ''";
    $stmt = $db->conn->prepare($sql);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stats = $stmt->fetch();
    $text = "📊 آمار کاربران ربات\n\nتعداد کل کاربران: " . $stats['total'];
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBackKey());
    exit();
}

if ($isAdmin && $bot->recmsg == $BTN_ADMIN_LIST) {
    $currentList = empty($idList) ? 'خالی' : implode("\n", $idList);
    $text = "👥 لیست ادمین‌های فعلی:\n$currentList\n\nبرای تغییر لیست، chat id ادمین‌ها را با کاما (,) جدا کرده و ارسال کنید.\nمثال: 5803067539,5625196705";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildAdminListKeyboard());
    exit();
}

if ($isAdmin && $bot->recmsg == $BTN_ADMIN_EDIT_LIST) {
    $text = "لیست جدید ادمین‌ها را ارسال کنید (با کاما جدا شود):";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBackKey());
    $sql = "update users set req1='editAdminList', req2='' where chatid='" . $bot->chatid . "' ";
    $db->conn->exec($sql);
    exit();
}

if ($isAdmin && $bot->recmsg == $BTN_ADMIN_BLOCK) {
    $currentList = empty($blockList) ? 'خالی' : implode("\n", $blockList);
    $text = "🚫 لیست کاربران بلاک‌شده:\n$currentList";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBlockMenuKeyboard($blockList));
    exit();
}

if ($isAdmin && $bot->recmsg == $BTN_BLOCK_ADD) {
    $text = "chat id کاربری که می‌خواهید بلاک کنید را ارسال کنید:";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBackKey());
    $sql = "update users set req1='blockUser', req2='' where chatid='" . $bot->chatid . "' ";
    $db->conn->exec($sql);
    exit();
}

// --- منوی کاربران عادی ---

if (!$isAdmin && $bot->recmsg == $BTN_SEND_CONTENT) {
    $text = "محتوای لحظه‌ای از وضعیت هوا رو برامون بفرست تا زود توی کانال بذاریمش 🌧️📸";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBackKey());
    $sql = "update users set req1='getContent', req2='' where chatid='" . $bot->chatid . "' ";
    $db->conn->exec($sql);
    exit();
}

$menuLinks = array(
    $BTN_INSTAGRAM => array(
        'title' => 'آدرس اینستاگرام',
        'url' => 'http://instagram.com/GuilanForeca'
    ),
    $BTN_BALE => array(
        'title' => 'آدرس کانال بله',
        'url' => 'http://ble.ir/guilanforeca_org'
    ),
    $BTN_PISH_AGAHI => array(
        'title' => 'آدرس کانال پیش آگاهی',
        'url' => 'https://t.me/P_Guilanforeca'
    ),
    $BTN_DONATE => array(
        'title' => 'لینک حمایت مالی',
        'url' => 'https://t.me/Guilan_Foreca/117609'
    ),
    $BTN_ADS => array(
        'title' => 'ای دی تبلیغات',
        'url' => 'https://t.me/TAbliQat_GF'
    ),
    $BTN_ADMIN_CONTACT => array(
        'title' => 'ارتباط با مدیر کانال',
        'url' => 'https://t.me/GUILANFORECA'
    ),
);

if (!$isAdmin && isset($menuLinks[$bot->recmsg])) {
    $item = $menuLinks[$bot->recmsg];
    $text = $item['title'] . ":\n" . $item['url'];
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBackKey());
    exit();
}

// --- state handlers ---

if ($isAdmin && $userReq1 == 'replyUser' && $userReq2 != '' && !isMenuButton($bot->recmsg, $isAdmin)) {
    $targetChatId = $userReq2;
    $bot->copyMessage($targetChatId, $bot->chatid, $bot->message_id);
    $bot->sendmessage(urlencode("✅ پاسخ شما برای کاربر ارسال شد."), $bot->chatid, buildAdminMenu());
    resetUserState($db, $bot->chatid);
    exit();
}

if ($isAdmin && $userReq1 == 'singleMessage_send' && $userReq2 != '' && !isMenuButton($bot->recmsg, $isAdmin)) {
    $targetChatId = $userReq2;
    $result = $bot->copyMessage($targetChatId, $bot->chatid, $bot->message_id);
    if (is_numeric($result)) {
        $text = "✅ پیام با موفقیت برای کاربر $targetChatId ارسال شد.";
    } else {
        $text = "❌ ارسال پیام ناموفق بود. لطفاً chat id را بررسی کنید.";
    }
    $bot->sendmessage(urlencode($text), $bot->chatid, buildAdminMenu());
    resetUserState($db, $bot->chatid);
    exit();
}

if ($isAdmin && $userReq1 == 'singleMessage_id' && !isMenuButton($bot->recmsg, $isAdmin)) {
    $targetChatId = trim($bot->recmsg);
    if (!preg_match('/^-?\d+$/', $targetChatId)) {
        $bot->sendmessage(urlencode("❌ chat id نامعتبر است. فقط عدد وارد کنید."), $bot->chatid, buildBackKey());
        exit();
    }
    $sql = "update users set req1='singleMessage_send', req2='" . $targetChatId . "' where chatid='" . $bot->chatid . "' ";
    $db->conn->exec($sql);
    $text = "chat id ثبت شد: $targetChatId\n\nاکنون پیام خود را ارسال کنید.";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBackKey());
    exit();
}

if ($isAdmin && $userReq1 == 'editAdminList' && !isMenuButton($bot->recmsg, $isAdmin)) {
    $newList = saveAdminList($db, $bot->recmsg);
    $text = "✅ لیست ادمین‌ها به‌روزرسانی شد:\n" . implode("\n", $newList);
    $bot->sendmessage(urlencode($text), $bot->chatid, buildAdminMenu());
    resetUserState($db, $bot->chatid);
    exit();
}

if ($isAdmin && $userReq1 == 'blockUser' && !isMenuButton($bot->recmsg, $isAdmin)) {
    $targetChatId = trim($bot->recmsg);
    if (!preg_match('/^-?\d+$/', $targetChatId)) {
        $bot->sendmessage(urlencode("❌ chat id نامعتبر است. فقط عدد وارد کنید."), $bot->chatid, buildBackKey());
        exit();
    }
    if (!in_array($targetChatId, $blockList, true)) {
        $blockList[] = $targetChatId;
        $blockList = saveBlockList($db, implode(',', $blockList));
    }
    $text = "✅ کاربر $targetChatId به لیست بلاک اضافه شد.";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBlockMenuKeyboard($blockList));
    resetUserState($db, $bot->chatid);
    exit();
}

if ($isAdmin && $userReq1 == 'broadcast' && !isMenuButton($bot->recmsg, $isAdmin)) {
    $sql = "select chatid from users where chatid != ''";
    $stmt = $db->conn->prepare($sql);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $allUsers = $stmt->fetchAll();
    $queued = 0;
    $now = time();

    foreach ($allUsers as $singleUser) {
        $targetChatId = trim($singleUser['chatid']);
        if ($targetChatId == '' || in_array($targetChatId, $idList, true) || in_array($targetChatId, $blockList, true)) {
            continue;
        }
        $insertSql = "insert into broadcast_queue (from_chat_id, message_id, target_chat_id, status, created_at)
            values ('" . $bot->chatid . "', '" . intval($bot->message_id) . "', '" . $targetChatId . "', 'pending', '" . $now . "')";
        $db->conn->exec($insertSql);
        $queued++;
    }

    $text = "📢 پیام همگانی در صف ارسال قرار گرفت.\nتعداد کاربران: $queued";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildAdminMenu());
    resetUserState($db, $bot->chatid);

    require_once('queue.php');
    processBroadcastQueue($bot, $db);
    exit();
}

if (!$isAdmin && $userReq1 == 'getContent' && !isMenuButton($bot->recmsg, $isAdmin)) {
    $text = "برای ادمین ارسال شد! 🚀
مرسی که همراهمون هستی و وضعیت هوا رو به بقیه خبر می‌دی 🌈";
    $bot->sendmessage(urlencode($text), $bot->chatid, buildBackKey());
    forwardToAdmins($bot, $idList, $bot->chatid, $bot->message_id, $bot->firstname, $bot->lastname, $bot->username);
    exit();
}

if (!$isAdmin && $bot->recmsg != '/start' && !isMenuButton($bot->recmsg, $isAdmin) && $userReq1 != 'getContent' && $bot->message_id != '') {
    forwardToAdmins($bot, $idList, $bot->chatid, $bot->message_id, $bot->firstname, $bot->lastname, $bot->username);
}