<?php

namespace App\Http\Controllers;

use App\Buttons;
use App\Messages;
use App\Models\User;
use App\Models\UserState;
use App\Telegram\Commands\StartCommand;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Telegram\Bot\Api;
use Telegram\Bot\Keyboard\Keyboard;
use Telegram\Bot\Laravel\Facades\Telegram;

class BotController extends Controller
{
    protected $telegram;
    protected $user;
    protected $updates;


    public function __construct()
    {
        $this->telegram = new Api(env('TELEGRAM_BOT_TOKEN'));
    }

    public function getBotUpdate()
    {
        try {

//            Telegram::addCommands([
//                StartCommand::class,
//            ]);
//            return response()->json([]);
//            $this->updates = Telegram::commandsHandler(true);
            $this->updates = Telegram::getWebhookUpdate();

            $chatId = $this->updates['message']['chat']['id'] ?? $this->updates['callback_query']['message']['chat']['id'];
            //$username = $this->updates['message']['from']['username'];
            // $messageId = $this->updates['message']['message']['message_id'];
            $text = $this->updates['message']['text'] ?? null;


            if (isset($this->updates['callback_query'])) {
                $callbackSelected = $this->updates['callback_query']['data'];
                $callbackId = $this->updates['callback_query']['id'];
                $chatId = $this->updates['callback_query']['message']['chat']['id'];
                $messageId = $this->updates['callback_query']['message']['message_id'];


                if (strpos($callbackSelected, 'search_page_') === 0) {
                    $page = intval(str_replace('search_page_', '', $callbackSelected));
                    return $this->searchForPartnerPages($chatId, $messageId, $callbackSelected, $page);
                }
                match ($callbackSelected) {
                    'show_edit_profile_menu' => $this->showChangeProfileMenu($chatId, $messageId),
                    'ask_for_change_gender_profile' => $this->showAskForChangeGenderProfile($chatId, $messageId),
                    'ask_for_change_level_profile' => $this->showAskForChangeLevelProfile($chatId, $messageId),
                    'ask_for_change_practice_time' => $this->showAskForChangePracticeTime($chatId, $messageId),
                    'find_partner' => $this->searchForPartner($chatId, $messageId, $callbackSelected, 1),
                    'change_goal' => $this->showAskForChangeGoal($chatId, $messageId, $callbackSelected),
                    'invite_user' => $this->showInviteUser($chatId, $messageId, $callbackSelected),
                    'back' => $this->handleBackInCallbackQuery($chatId, $messageId),
                    default => $this->handleCallbackQueryState($chatId, $messageId, $callbackSelected, $callbackId),
                };

            } else if ($text != null) {
                match ($text) {
                    Buttons::FIND_PARTNER->value => $this->showFindPartnerMenu($chatId),
                    Buttons::PROFILE->value => $this->showEditProfileMenu($chatId),
                    Buttons::FEMALE_PROFILE->value => $this->editGenderMenu($chatId, $text),
                    Buttons::MALE_PROFILE->value => $this->editGenderMenu($chatId, $text),
                    Buttons::TEACHER->value => $this->showTeacherMenu($chatId, $text),
                    Buttons::JOB_LINKS->value => $this->showJobLinkMenu($chatId, $text),
                    default => $this->handleUserState($chatId, $text)

                };
            } else {
                $this->sendStartMenu($chatId, null, $text);
            }


        } catch (\Exception $exception) {
            return response()->json($exception->getMessage() . '- ---' . $exception->getLine());
        }

    }


    private function sendStartMenu($chatId, $message = null, $command = null)
    {
        $reply_markup = Keyboard::make()
            ->setResizeKeyboard(true)
            ->setOneTimeKeyboard(true)
            ->row([
                Keyboard::button(Buttons::FIND_PARTNER->value),
            ])
            ->row([
                Keyboard::button(Buttons::JOB_LINKS->value),
                Keyboard::button(Buttons::TEACHER->value),
            ])
            ->row([
                Keyboard::button(Buttons::PROFILE->value),
            ]);


        $firstName = $this->updates['message']['chat']['first_name'] ?? null;
        $username = $this->updates['message']['chat']['username'] ?? null;


        $user = User::firstOrCreate(
            ['chat_id' => $chatId],
            ['name' => $firstName, 'username' => $username, 'ref_code' => User::generateReferralCode()],
        );


        $userState = UserState::firstOrCreate(
            ['chat_id' => $chatId],
            ['state' => 'start']
        );

        if ($userState) {
            $userState->update(['state' => 'start']);
        }


        if (!empty($command) && Str::startsWith($command, '/start ref_')) {

            $referralCode = Str::replaceFirst('/start ref_', '', $command);
            $referrer = User::where('ref_code', $referralCode)->first();

            if ($referrer && $referrer->id != $user->id) {
                $user->ref_by = $referrer->id;
                $user->save();
            }


        }

//        $user = User::where('chat_id', $chatId)->first();

//        if($user->username == null &&  $username != null ){
//            $user->update(['username' => $username]);
//        }


        $this->telegram->sendMessage([
            'chat_id' => $chatId,
            'text' => $message != null ? $message : Messages::WELCOME_MESSAGE->getText(),

            'reply_markup' => $reply_markup
        ]);
    }


    private function showEditProfileMenu($chatId, $messageId = null)
    {
        $keyboard = [
            'inline_keyboard' => [
                [
                    [
                        'text' => '✍🏻 ویرایش اطلاعات پروفایل',
                        'callback_data' => 'show_edit_profile_menu'
                    ],
                    [
                        'text' => '🎉 معرفی به دوستان ',
                        'callback_data' => 'invite_user'
                    ],

                ]
            ]
        ];
//        $firstName = $this->updates['message']['chat']['first_name'] ?? null;
        $username = $this->updates['message']['chat']['username'] ?? null;
//
//        User::firstOrCreate(
//            ['chat_id' => $chatId],
//            ['name' => $firstName, 'username' => $username , ''],
//        );
        $user = User::where('chat_id', $chatId)->first();

        if ($user->username == null && $username != null) {
            $user->update(['username' => $username]);
        }

        $userState = UserState::where('chat_id', $chatId)->first();
        $userState->update(['state' => 'show_edit_profile_menu']);

        $placeholders = [
            '{name}' => $user->name,
            '{gender}' => $user->gender,
            '{level}' => $user->level,
            '{practice_time}' => $user->practice_time,
            '{username}' => $user->username != null ? 'داری ✅' : 'نداری ❌',
            '{goal}' => $user->goal,

        ];

        if ($messageId != null) {
            return $this->telegram->editMessageText([
                'chat_id' => $chatId,
                'text' => Messages::PROFILE_MESSAGE->getProfileMessage($placeholders),
                'message_id' => $messageId,
                'reply_markup' => json_encode($keyboard)
            ]);
        } else {
            $this->telegram->sendMessage([
                'chat_id' => $chatId,
                'text' => Messages::PROFILE_MESSAGE->getProfileMessage($placeholders),
                'reply_markup' => json_encode($keyboard)
            ]);
        }
    }

    private function showChangeProfileMenu($chatId, $messageId)
    {
        $keyboard = [
            'inline_keyboard' => [
                [
                    [
                        'text' => '✏️ تغییر جنسیت ',
                        'callback_data' => 'ask_for_change_gender_profile'
                    ],
                    [
                        'text' => '✏️ تغییر سطح',
                        'callback_data' => 'ask_for_change_level_profile'
                    ],
                ],
                [
                    [
                        'text' => '✏️ تغییر هدف',
                        'callback_data' => 'change_goal'
                    ],
                    [
                        'text' => '✏️ تغییر ساعات تمرین',
                        'callback_data' => 'ask_for_change_practice_time'
                    ],
                ],
                [
                    [
                        'text' => 'برگشت',
                        'callback_data' => 'back'
                    ],
                ]

            ]
        ];

        $user = User::where('chat_id', $chatId)->first();

        $userState = UserState::where('chat_id', $chatId)->first();
        $userState->update(['state' => 'show_change_profile_menu']);

        $placeholders = [
            '{name}' => $user->name,
            '{gender}' => $user->gender,
            '{level}' => $user->level,
            '{goal}' => $user->goal,
            '{practice_time}' => $user->practice_time,

        ];


        $this->telegram->editMessageText([
            'chat_id' => $chatId,
            'text' => Messages::PROFILE_CHANGE_MESSAGE->getProfileMessage($placeholders),
            'message_id' => $messageId,
            'reply_markup' => json_encode($keyboard)
        ]);
    }


    private function showAskForChangeGenderProfile($chatId, $messageId)
    {

        $reply_markup = Keyboard::make()
            ->setResizeKeyboard(true)
            ->setOneTimeKeyboard(true)
            ->row([
                Keyboard::button('🙍‍♂️ آقا'),
                Keyboard::button('🙎‍♀️ خانم'),
            ]);


        $userState = UserState::where('chat_id', $chatId)->first();
        $userState->update(['state' => 'ask_for_change_gender_profile']);

        $this->telegram->sendMessage([
            'chat_id' => $chatId,
            'text' => 'لطفا جنسیت خود را انتخاب کنید👇🏻',

            'reply_markup' => $reply_markup
        ]);


    }

    private function editGenderMenu($chatId, $text)
    {
        if ($text == '🙍‍♂️ آقا' || $text == 'آقا') {
            $gender = 'male';
        } elseif ($text === '🙎‍♀️ خانم' || $text === 'خانم') {
            $gender = 'female';
        } else {
            $this->telegram->sendMessage([
                'chat_id' => $chatId,
                'text' => 'لطفاً جنسیت خود را به درستی انتخاب کنید (آقا یا خانم).',
            ]);
        }

        User::where('chat_id', $chatId)->update(['gender' => $gender]);
        $this->sendStartMenu($chatId, '✏️ جنسیت شما با موفقیت ثبت شد ✅');

    }

    private function editLevelMenu($chatId, $level)
    {

        User::where('chat_id', $chatId)->update(['level' => $level]);
        $this->sendStartMenu($chatId, '✏️ سطح شما با موفقیت ثبت شد ✅');

    }


    private function showAskForChangeLevelProfile($chatId)
    {

        $reply_markup = Keyboard::make()
            ->setResizeKeyboard(true)
            ->setOneTimeKeyboard(true)
            ->row([
                Keyboard::button('A1'),
                Keyboard::button('A2'),
            ])
            ->row([
                Keyboard::button('B1'),
                Keyboard::button('B2'),
            ])
            ->row([
                Keyboard::button('C1'),
                Keyboard::button('C2'),
            ]);


        $userState = UserState::where('chat_id', $chatId)->first();
        $userState->update(['state' => 'ask_for_change_level_profile']);

        $this->telegram->sendMessage([
            'chat_id' => $chatId,
            'text' => 'بگو توی چه سطحی هستی 👇🏻',

            'reply_markup' => $reply_markup
        ]);

    }


    private function showAskForChangePracticeTime($chatId, $messageId)
    {

        $reply_markup = Keyboard::make()
            ->setResizeKeyboard(true)
            ->setOneTimeKeyboard(true)
            ->row([
                Keyboard::button('ظهر 🌅'),
                Keyboard::button('صبح 🌄'),
            ])
            ->row([
                Keyboard::button('شب 🌃'),
                Keyboard::button('عصر 🌇'),
            ])
            ->row([
                Keyboard::button('توافقی 🤝'),
            ]);


        $userState = UserState::where('chat_id', $chatId)->first();
        $userState->update(['state' => 'ask_for_change_practice_time']);

        $this->telegram->sendMessage([
            'chat_id' => $chatId,
            'text' => 'زمانی که میخوای تمرین کنی رو انتخاب کن  👇🏻',

            'reply_markup' => $reply_markup
        ]);

    }


    private function showAskFilterLevel($chatId, $messageId, $callbackSelected)
    {

        $gender = null;
        $genderText = '';
        if ($callbackSelected == 'filter_gender_male') {
            $gender = 'male';
            $genderText = '👨 مرد';
        }
        if ($callbackSelected == 'filter_gender_female') {
            $gender = 'female';
            $genderText = '👩 زن';
        }

        if ($callbackSelected == 'filter_gender_any') {
            $gender = 'any';
            $genderText = 'همه';
        }

        $this->updateUserFilter($chatId, 'gender', $gender);


        $keyboard = Keyboard::make()->inline()
            ->row(
                [
                    Keyboard::inlineButton(['text' => '🟢 A1', 'callback_data' => 'filter_level_A1']),
                    Keyboard::inlineButton(['text' => '🟢 A2', 'callback_data' => 'filter_level_A2'])
                ]

            )
            ->row(
                [
                    Keyboard::inlineButton(['text' => '🔵 B1', 'callback_data' => 'filter_level_B1']),
                    Keyboard::inlineButton(['text' => '🔵 B2', 'callback_data' => 'filter_level_B2'])
                ]
            )
            ->row(
                [
                    Keyboard::inlineButton(['text' => '🟣 C1', 'callback_data' => 'filter_level_C1']),
                    Keyboard::inlineButton(['text' => '🟣 C2', 'callback_data' => 'filter_level_C2'])
                ]
            );


        $userState = UserState::where('chat_id', $chatId)->first();
        $userState->update(['state' => 'filter_level']);

        $text = <<<EOT
<blockquote>هر سطحی رو که انتخاب می‌کنی، یعنی آماده‌ای که یه پارتنر هم‌سطح خودت پیدا کنی! 😉</blockquote>

🔹 جنسیتی که انتخاب کردی: {$genderText}

حالا افرادی که با این سطح سازگار هستن رو نشونت بدم؟ انتخاب کن👇
EOT;


        $this->telegram->editMessageText([
            'chat_id' => $chatId,
            'text' => $text,
            'message_id' => $messageId,
            'parse_mode' => 'HTML',
            'reply_markup' => json_encode($keyboard)
        ]);


    }


    private function showAskFilterPracticeTime($chatId, $messageId, $callbackSelected)
    {


        $level = null;
        if ($callbackSelected == 'filter_level_A1') {
            $level = 'A1';
        }
        if ($callbackSelected == 'filter_level_A2') {
            $level = 'A2';

        }
        if ($callbackSelected == 'filter_level_B1') {
            $level = 'B1';

        }

        if ($callbackSelected == 'filter_level_B2') {
            $level = 'B2';

        }

        if ($callbackSelected == 'filter_level_C1') {
            $level = 'C1';

        }

        if ($callbackSelected == 'filter_level_C2') {
            $level = 'C2';
        }

        $this->updateUserFilter($chatId, 'level', $level);


        $keyboard = Keyboard::make()->inline()
            ->row(
                [
                    Keyboard::inlineButton(['text' => 'صبح', 'callback_data' => 'morning']),
                    Keyboard::inlineButton(['text' => 'ظهر', 'callback_data' => 'noon'])
                ]

            )
            ->row(
                [
                    Keyboard::inlineButton(['text' => 'عصر', 'callback_data' => 'afternoon']),
                    Keyboard::inlineButton(['text' => 'شب', 'callback_data' => 'night'])
                ]
            )
            ->row(
                [
                    Keyboard::inlineButton(['text' => 'توافقی', 'callback_data' => 'deal']),
                ]
            );


        $userState = UserState::where('chat_id', $chatId)->first();
        $userState->update(['state' => 'filter_practice_time']);

        $user = User::where('chat_id', $chatId)->first();
        $filters = $user->filters ? json_decode($user->filters, true) : [];


        $genderText = '';
        if ($filters['gender'] == 'male') {
            $genderText = '👨 مرد';
        }
        if ($filters['gender'] == 'female') {
            $genderText = '👩 زن';
        }

        if ($filters['gender'] == 'any') {
            $genderText = 'همه';
        }


        $text = <<<EOT
            <blockquote>تمرین توی تایم مناسب، بهره‌وری رو بالا می‌بره! ببین چه ساعتی برات راحت‌تره. ⏰</blockquote>

        🔹 جنسیتی که انتخاب کردی : {$genderText}
        🔹 سطح زبانی که انتخاب کردی : {$level}

        EOT;


        $this->telegram->editMessageText([
            'chat_id' => $chatId,
            'text' => $text,
            'message_id' => $messageId,
            'parse_mode' => 'HTML',
            'reply_markup' => json_encode($keyboard)
        ]);


    }


    private function showSearchForPartner($chatId, $messageId, $callbackSelected)
    {

        $practiceTime = null;
        if ($callbackSelected == 'morning') {
            $practiceTime = 'صبح';
        }
        if ($callbackSelected == 'noon') {
            $practiceTime = 'ظهر';

        }
        if ($callbackSelected == 'afternoon') {
            $practiceTime = 'عصر';

        }

        if ($callbackSelected == 'night') {
            $practiceTime = 'شب';

        }

        if ($callbackSelected == 'deal') {
            $practiceTime = 'توافقی';

        }


        $this->updateUserFilter($chatId, 'practice_time', $callbackSelected);


        $keyboard = Keyboard::make()->inline()
            ->row(
                [
                    Keyboard::inlineButton(['text' => '🔍 جستجو کن', 'callback_data' => 'find_partner']),

                ]

            );


        $userState = UserState::where('chat_id', $chatId)->first();
        $userState->update(['state' => 'start_search_for_partner']);

        $user = User::where('chat_id', $chatId)->first();

        $filters = $user->filters ? json_decode($user->filters, true) : [];


        $genderText = '';
        if ($filters['gender'] == 'male') {
            $genderText = '👨 مرد';
        }
        if ($filters['gender'] == 'female') {
            $genderText = '👩 زن';
        }

        if ($filters['gender'] == 'any') {
            $genderText = 'همه';
        }


        $text = <<<EOT
            <blockquote>این فیلترهایی هست که انتخاب کردی:</blockquote>

        🔹 جنسیتی که انتخاب کردی : {$genderText}
        🔹 سطح زبانی که انتخاب کردی : {$filters['level']}
        🔹 زمان تمرینی که انتخاب کردی : {$practiceTime}

         اگر همه چیز درسته، دکمه "🔍 جستجو کن" رو بزن تا پارتنر مناسب پیدا بشه!

        EOT;


        $this->telegram->editMessageText([
            'chat_id' => $chatId,
            'text' => $text,
            'message_id' => $messageId,
            'parse_mode' => 'HTML',
            'reply_markup' => $keyboard
        ]);

    }

    private function editPracticeTimeMenu($chatId, mixed $text)
    {

        if ($text == 'صبح 🌄') {
            $time = 'morning';
        }
        if ($text == 'ظهر 🌅') {
            $time = 'noon';
        }
        if ($text == 'عصر 🌇') {
            $time = 'afternoon';
        }

        if ($text == 'شب 🌃') {
            $time = 'night';
        }
        if ($text == 'توافقی 🤝') {
            $time = 'deal';
        } else {
            $this->telegram->sendMessage([
                'chat_id' => $chatId,
                'text' => 'لطفا زمان تمرین خود را به درستی انتخاب کنید.',
            ]);
        }


        User::where('chat_id', $chatId)->update(['practice_time' => $time]);


        $this->sendStartMenu($chatId, '✏️ زمان تمرین شما با موفقیت ثبت شد ✅');

    }

    private function showFindPartnerMenu($chatId)
    {

        $user = User::where('chat_id', $chatId)->first();

        $refCount = User::where('ref_by' , '=', $user->id)->count();

        if (!$user || !$user->gender || !$user->level || !$user->getRawOriginal('practice_time') || $refCount < 1 || empty($user->username) ) {

          $message =  <<<EOT
😊 برای جستجو، اول پروفایلت رو تکمیل کنی و یک نفر رو با لینک دعوتت به ربات اضافه کنی.  به منوی پروفایل برو و اطلاعات خودت رو کامل کن  🚀

EOT;

            return $this->telegram->sendMessage([
                'chat_id' => $chatId,
                'text' => $message,
            ]);


        } else {
            $userState = UserState::where('chat_id', $chatId)->first();
            $userState->update(['state' => 'filter_gender']);

            $keyboard = Keyboard::make()->inline()->row(
                [
                    Keyboard::inlineButton(['text' => '👨 مرد', 'callback_data' => 'filter_gender_male']),
                    Keyboard::inlineButton(['text' => '👩 زن', 'callback_data' => 'filter_gender_female'])
                ]
            )
                ->row(
                    [Keyboard::inlineButton(['text' => 'همه رو نشون بده', 'callback_data' => 'filter_gender_any'])]
                );

            $text = <<<EOT
<blockquote>انتخاب جنسیت مهمه! با یه پارتنر که حس راحتی بیشتری باهاش داری، تمرین جذاب‌تر میشه. 😉</blockquote>

چه کسایی رو نشونت بدم؟ انتخاب کن👇
EOT;

            $this->telegram->sendMessage([
                'chat_id' => $chatId,
                'text' => $text,
                'parse_mode' => 'HTML',
                'reply_markup' => $keyboard
            ]);
        }
    }


    private function handleUserState($chatId, $text = null, $callbackData = null)
    {
        $userState = UserState::where('chat_id', $chatId)->first()->state ?? 'start';

        match ($userState) {
            'start' => $this->sendStartMenu($chatId, null, $text),
            'ask_for_change_level_profile' => $this->editLevelMenu($chatId, $text),
            'ask_for_change_practice_time' => $this->editPracticeTimeMenu($chatId, $text),
            'ask_for_change_goal' => $this->editGoal($chatId, $text),

            default => $this->sendStartMenu($chatId, null, $text),

        };

    }

    private function handleBackInCallbackQuery($chatId, $messageId)
    {

        $userState = UserState::where('chat_id', $chatId)->first();


        $previousState = match ($userState->state) {
            'show_change_profile_menu' => 'show_edit_profile_menu',
            default => 'start',
        };

        $userState->update(['state' => $previousState]);

        return match ($userState->state) {
            'show_edit_profile_menu' => $this->showEditProfileMenu($chatId, $messageId),
            default => $this->sendStartMenu($chatId),
        };

    }

    private function handleCallbackQueryState($chatId, $messageId, $callbackSelected, $callbackId)
    {

        $userState = UserState::where('chat_id', $chatId)->first();


        match ($userState->state) {
            'filter_gender' => $this->showAskFilterLevel($chatId, $messageId, $callbackSelected),
            'filter_level' => $this->showAskFilterPracticeTime($chatId, $messageId, $callbackSelected),
            'filter_practice_time' => $this->showSearchForPartner($chatId, $messageId, $callbackSelected),


            default => $this->telegram->answerCallbackQuery([
                'callback_query_id' => $callbackId,
                'text' => 'دستور نامعتبر است.',
                'show_alert' => true,
            ]),
        };

    }

    private function updateUserFilter($chatId, $key, $value)
    {

        $user = User::where('chat_id', $chatId)->first();
        $filters = $user->filters ? json_decode($user->filters, true) : [];
        $filters[$key] = $value;
        $user->filters = json_encode($filters);
        $user->save();
    }

    private function searchForPartner($chatId, $messageId, $callbackSelected, $page = 1)
    {

        $user = User::where('chat_id', $chatId)->first();
        $filters = $user->filters ? json_decode($user->filters, true) : [];

        $partners = User::where('level', '=', $filters['level'])
            ->where('practice_time', '=', $filters['practice_time']);


        if ($filters['gender'] !== 'any') {
            $partners->where('gender', '=', $filters['gender']);
        }

        $partners = $partners->paginate(5, ['*'], 'page', $page);


        if ($partners->isEmpty()) {


            return $this->telegram->editMessageText([
                'chat_id' => $chatId,
                'message_id' => $messageId,
                'text' => 'هیچ پارتنری با این شرایط که سرچ کردی پیدا نشد اما نگران نباش  اگه کسی اضافه بشه من بهت پیام میدم 😉',
            ]);

        }

        $text = "🔍 *نتایج جستجو:*\n\n";
        foreach ($partners as $partner) {
            $text .= "✨ *نام :* {$partner->name}\n";
            $text .= "👤 *جنسیت :* {$partner->gender}\n";
            $text .= "🗣 *سطح زبان :* {$partner->level}\n";
            $text .= "⏰ *زمان تمرین :* {$partner->practice_time}\n";
            $text .= "🎯 *هدف :* {$partner->goal}\n";
            $text .= "🔗 [نمایش پروفایل](t.me/{$partner->username})\n";
            $text .= "〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️\n";
        }


        $keyboard = [];
        if ($partners->previousPageUrl() && $partners->nextPageUrl()) {
            $keyboard[] = [
                ['text' => '⬅️ قبلی', 'callback_data' => "search_page_" . ($page - 1)],
                ['text' => '➡️ بعدی', 'callback_data' => "search_page_" . ($page + 1)]
            ];
        } elseif ($partners->previousPageUrl()) {
            $keyboard[] = [['text' => '⬅️ قبلی', 'callback_data' => "search_page_" . ($page - 1)]];
        } elseif ($partners->nextPageUrl()) {
            $keyboard[] = [['text' => '➡️ بعدی', 'callback_data' => "search_page_" . ($page + 1)]];
        }

        $replyMarkup = ['inline_keyboard' => $keyboard];

        $this->telegram->editMessageText([
            'chat_id' => $chatId,
            'message_id' => $messageId,
            'text' => $text,
            'reply_markup' => json_encode($replyMarkup),
            'parse_mode' => 'Markdown',
            'disable_web_page_preview' => true
        ]);

    }

    private function searchForPartnerPages($chatId, $messageId, $callbackSelected, $page = 1)
    {

        $user = User::where('chat_id', $chatId)->first();
        $filters = $user->filters ? json_decode($user->filters, true) : [];


        $partners = User::where('level', '=', $filters['level'])
            ->where('practice_time', '=', $filters['practice_time']);

        if ($filters['gender'] !== 'any') {
            $partners->where('gender', '=', $filters['gender']);
        }

        $partners = $partners->paginate(5, ['*'], 'page', $page);


        if ($partners->isEmpty()) {

            $this->telegram->editMessageText([
                'chat_id' => $chatId,
                'message_id' => $messageId,
                'text' => 'هیچ پارتنری با این شرایط که سرچ کردی پیدا نشد اما نگران نباش  اگه کسی اضافه بشه من بهت پیام میدم 😉',
            ]);

        }

        $text = "🔍 نتایج جستجو:\n\n";
        foreach ($partners as $partner) {
            $text .= "✨ نام : {$partner->name}\n";
            $text .= "👤 جنسیت : {$partner->gender}\n";
            $text .= "🗣 سطح زبان : {$partner->level}\n";
            $text .= "⏰ زمان تمرین : {$partner->practice_time}\n";
            $text .= "🎯 *هدف :* {$partner->goal}\n";
            $text .= "🔗 [نمایش پروفایل](t.me/{$partner->username})\n";
            $text .= "〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️\n";
        }


        $keyboard = [];
        if ($partners->previousPageUrl() && $partners->nextPageUrl()) {
            $keyboard[] = [
                ['text' => '⬅️ قبلی', 'callback_data' => "search_page_" . ($page - 1)],
                ['text' => '➡️ بعدی', 'callback_data' => "search_page_" . ($page + 1)]
            ];
        } elseif ($partners->previousPageUrl()) {
            $keyboard[] = [['text' => '⬅️ قبلی', 'callback_data' => "search_page_" . ($page - 1)]];
        } elseif ($partners->nextPageUrl()) {
            $keyboard[] = [['text' => '➡️ بعدی', 'callback_data' => "search_page_" . ($page + 1)]];
        }

        $replyMarkup = ['inline_keyboard' => $keyboard];


        $this->telegram->editMessageText([
            'chat_id' => $chatId,
            'message_id' => $messageId,
            'text' => $text,
            'reply_markup' => json_encode($replyMarkup),
            'parse_mode' => 'Markdown',
            'disable_web_page_preview' => true
        ]);

    }

    private function showAskForChangeGoal($chatId, $messageId, $callbackSelected)
    {


        $userState = UserState::where('chat_id', $chatId)->first();
        $userState->update(['state' => 'ask_for_change_goal']);

        $text = <<<EOT
                ی توضیح کوتاه از هدفت برای تمرین رو بگو . این پیام برای همه توی لیست قابل نمایش هست  به عنوان مثال 👇🏻

                "تقویت مکالمه و دایره لغات"

            EOT;

        $this->telegram->editMessageText([
            'chat_id' => $chatId,
            'text' => $text,
            'message_id' => $messageId,
        ]);

    }

    private function editGoal($chatId, mixed $text)
    {

        User::where('chat_id', $chatId)->update(['goal' => $text]);
        $this->sendStartMenu($chatId, '✏️ هدف شما با موفقیت ثبت شد ✅');

    }

    private function showInviteUser($chatId, $messageId, $callbackSelected)
    {

        $user = User::where('chat_id', $chatId)->first();


            if (!empty($user->ref_code)) {

                $fileId = "AgACAgQAAxkBAAIGQ2e7FRRfk4wmVfa8zb3Vzp4UqJ_FAAKFwTEbQjnYUbXCJkmZrWJGAQADAgADcwADNgQ";

                $caption = "🚀 یادگیری زبان آلمانی هیچ‌وقت اینقدر جذاب نبوده! \n\n"
                    . "حالا وقتشه که دوستاتو هم دعوت کنی و با هم یه مسیر فوق‌العاده برای تقویت آلمانیتون بسازین! 🇩🇪✨\n\n"
                    . "با دعوت هر نفر، دایره ارتباطاتت بزرگ‌تر می‌شه و شانس پیدا کردن پارتنر ایده‌آلت بیشتر! 😎🔥\n\n"
                    . "🔗 لینک دعوت اختصاصی تو: \n"
                    . "https://t.me/DreamDeutschBot?start=ref_$user->ref_code";

                $this->telegram->sendPhoto([
                    'chat_id' => $chatId,
                    'photo' => $fileId,
                    'caption' => $caption
                ]);
            }




    }

    private function showTeacherMenu($chatId)
    {

        $this->telegram->sendMessage([
            'chat_id' => $chatId,
            'text' => "📌 *چرا یادگیری آلمانی با استاد، سریع‌تر و مؤثرتر است؟* 🚀

خیلی از زبان‌آموزها با روش‌های خودخوان شروع می‌کنن، اما بعد از چند ماه متوجه می‌شن که هنوز نمی‌تونن یه مکالمه ساده انجام بدن! 😟

یادگیری بدون استاد یعنی *اشتباهات مداوم، نبود برنامه مشخص و پیشرفت کند!*

❌ *مشکلات یادگیری بدون استاد:*
- بدون تمرین مکالمه، مهارت صحبت کردنت قوی نمی‌شه! 🗣
- کسی نیست که اشتباهاتت رو اصلاح کنه و باعث پیشرفتت بشه! ✖
- نبود برنامه مشخص باعث سردرگمی و کاهش انگیزه‌ات می‌شه! 😓
- یادگیری خودخوان به شدت زمان‌بره و ممکنه سال‌ها طول بکشه! ⏳

📍 *هزینه کلاس‌های زبان در آلمان سرسام‌آوره!* 💶
کلاس‌های آلمانی در خود آلمان بین *۴۰۰ تا ۸۰۰ یورو در ماه* هزینه دارن، اما اینجا می‌تونی با *یک استاد مجرب، با هزینه‌ای بسیار کمتر، همون کیفیت رو دریافت کنی!*

✅ *چرا کلاس با استاد این ربات بهترین انتخابه؟*

🔹 *کاملاً آنلاین*، پس از هرجایی می‌تونی شرکت کنی!
🔹 *کاملاً تضمینی*، یعنی استاد تضمین میکنه که شما با روش ایشون به بهترین شکل زبان آلمانی رو یاد خواهی گرفت اگر به تمام حرفهاش گوش کنی!
🔹 *مشاوره رایگان:* اگر میخوای کلاست رو شروع کنی کافیه پیام بدی تا ازت به صورت رایگان تست گرفته میشه و میتونی کلاست رو شروع کنی !
🔹 *استاد بسیار مجرب* دارای 30 سال تجربه تدریس و گذراندن تحصیلات تکمیلی در آلمان که میتونه خیال شما رو از هر بابت در زمینه یادگیری راحت کنه!
🔹 آموزش *تمامی مهارت‌ها*: مکالمه، نوشتار، گرامر، شنیداری و خواندن!
 🔹 مناسب *تمام سطوح*: از مبتدی تا پیشرفته!
🔹 برنامه‌ریزی اختصاصی متناسب با نیاز و سطح شما!
🔹 رفع اشکالات در لحظه و دریافت فیدبک حرفه‌ای!
🔹 *تمرین و پشتیبانی مداوم* برای رسیدن به تسلط کامل!
🔹 *کلاس خصوصی و نیمه خصوصی* خودت تنها یا با پارتنر و دوستات تا 4 نفر در یک سطح میتونید توی کلاس شرکت کنید!



🎯 *آماده‌ای مسیر درست یادگیری رو شروع کنی؟*

کلاس حضوری هم دارند اما فقط در شهر مشهد
برای اطلاعات بیشتر و هماهنگی کلاس‌ها، همین حالا به ادمین پیام بده:

👉 https://t.me/DreamDeutschAdmin",
            'parse_mode' => 'Markdown',
            'disable_web_page_preview' => true
        ]);


    }

    private function showJobLinkMenu($chatId, $text)
    {


        $text = <<<EOT


                فعلا در حال آماده سازی لینک ها هستیم . اما اگر میخوای زودتر بهشون دسترسی داشته باشی به ادمین پیام بده و هر سوالی راجع به لینک ها و کاریابی توی آلمان داشتی میتونی بپرسی


            EOT;

        $this->telegram->sendMessage([
            'chat_id' => $chatId,
            'text' => $text,

        ]);

    }


}
