<?php

namespace App\Telegram;

use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\GuzzleException;
use JsonException;
use Psr\Log\LoggerInterface;
use Openguru\OpenCartFramework\Support\Arr;
use Openguru\OpenCartFramework\Telegram\Commands\TelegramCommand;
use Openguru\OpenCartFramework\Telegram\Enums\ChatAction;
use Openguru\OpenCartFramework\Telegram\TelegramBotStateManager;
use Openguru\OpenCartFramework\Telegram\TelegramService;
use Throwable;

class LinkCommand extends TelegramCommand
{
    private LoggerInterface $logger;

    public function __construct(
        TelegramService $telegram,
        TelegramBotStateManager $stateManager,
        LoggerInterface $logger
    ) {
        parent::__construct($telegram, $stateManager);
        $this->logger = $logger;
    }

    /**
     * @throws GuzzleException
     * @throws JsonException
     */
    public function handle(array $update): void
    {
        try {
            $userId = $update['message']['from']['id'];
            $chatId = $update['message']['chat']['id'];

            $state = $this->state->getState($userId, $chatId);

            if (! $state) {
                $greeting = $this->telegram->escapeTgSpecialCharacters(
                    <<<HTML
Это удобный инструмент, который поможет вам 📎 создать красивое 
сообщение с кнопкой для открытия вашего 🛒 Telecart магазина.

📌 Такое сообщение можно закрепить в канале или группе.  
📤 Переслать клиентам в личные сообщения.  
🚀 Или использовать повторно, когда нужно поделиться магазином.

Давайте начнём — отправьте текст, который вы хотите разместить в сообщении 👇
HTML
                );
                $this->telegram->sendMessage($chatId, $greeting);

                $this->state->setState(self::class, $userId, $chatId, [
                    'step' => 'message_text',
                    'data' => [
                        'message_text' => '',
                        'btn_text' => '',
                        'btn_link' => '',
                    ],
                ]);

                return;
            }

            $step = $state['data']['step'];

            if ($step === 'message_text') {
                $message = Arr::get($update, 'message.text', 'Недопустимый текст сообщения');
                $state['data']['data']['message_text'] = $message;
                $state['data']['step'] = 'btn_text';
                $this->state->setState(self::class, $userId, $chatId, $state['data']);

                $text = <<<HTML
🔸 Отлично!  
Теперь укажите, какой текст будет на кнопке 👇

✍️ Напишите короткую, понятную фразу, например:
• Открыть магазин
• Каталог товаров
• Начать покупки
HTML;
                $this->telegram->sendMessage($chatId, $text);

                return;
            }

            if ($step === 'btn_text') {
                $message = $update['message']['text'];
                $state['data']['data']['btn_text'] = $message;
                $state['data']['step'] = 'btn_link';
                $this->state->setState(self::class, $userId, $chatId, $state['data']);

                $template = <<<MARKDOWN
🌐 Теперь отправьте ссылку на Telegram Mini App.  
Ссылка должна начинаться с <pre>https://</pre>

📎 Инструкция, где взять ссылку:  
👉 {LINK}
MARKDOWN;

                $text = $this->telegram->prepareMessage($template, [
                    '{LINK}' => 'https://telecart-labs.github.io/docs/telegram/telegram/#direct-link',
                ]);
                $this->telegram->sendMessage($chatId, $text);

                return;
            }

            if ($step === 'btn_link') {
                $message = $update['message']['text'];
                $state['data']['data']['btn_link'] = $message;
                $this->state->setState(self::class, $userId, $chatId, $state['data']);

                $messageText = Arr::get($state, 'data.data.message_text', 'Текст сообщения');
                $btnText = $this->telegram->escapeTgSpecialCharacters(
                    Arr::get($state, 'data.data.btn_text', 'Открыть магазин')
                );
                $btnLink = $message;

                $replyMarkup = [
                    'inline_keyboard' => [
                        [
                            [
                                'text' => $btnText,
                                'url' => $btnLink,
                            ]
                        ]
                    ],
                ];

                $this->telegram->sendMessage(
                    $chatId,
                    $this->telegram->escapeTgSpecialCharacters($messageText),
                    $replyMarkup,
                );
            }

            $this->state->clearState($userId, $chatId);
        } catch (ClientException $exception) {
            $this->telegram->sendMessage($chatId, 'Ошибка: ' . $exception->getResponse()->getBody()->getContents());
        } catch (Throwable $exception) {
            $this->logger->error($exception->getMessage(), ['exception' => $exception]);
            $this->telegram->sendMessage($chatId, 'Произошла ошибка');
        }
    }
}
