<?php

namespace Bastion\Handlers;

use App\Services\SettingsService;
use Exception;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\GuzzleException;
use Openguru\OpenCartFramework\Cache\CacheInterface;
use Openguru\OpenCartFramework\Telegram\Enums\ChatAction;
use Symfony\Component\HttpFoundation\JsonResponse;
use Openguru\OpenCartFramework\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Openguru\OpenCartFramework\Support\Arr;
use Openguru\OpenCartFramework\Telegram\Exceptions\TelegramClientException;
use Openguru\OpenCartFramework\Telegram\TelegramService;

class TelegramHandler
{
    private CacheInterface $cache;
    private TelegramService $telegramService;
    private SettingsService $settings;

    public function __construct(CacheInterface $cache, TelegramService $telegramService, SettingsService $settings)
    {
        $this->cache = $cache;
        $this->telegramService = $telegramService;
        $this->settings = $settings;
    }

    public function getChatId(): JsonResponse
    {
        $message = $this->cache->get('tg_latest_msg');

        if (! $message) {
            return new JsonResponse([
                // phpcs:ignore Generic.Files.LineLength
                'message' => 'Сообщение не найдено. Убедитесь что отправили кодовое слово в чат с ботом и повторите через 10 секунд. У Вас есть 60 секунд после отправки сообщения в чат, чтобы нажать на кнопку! Это сделано в целях безопасности.'
            ], Response::HTTP_UNPROCESSABLE_ENTITY);
        }

        $text = Arr::get($message, 'text');
        if ($text !== 'opencart_get_chatid') {
            return new JsonResponse(
                ['message' => 'Последнее сообщение в чате не содержит кодовое слово.'],
                Response::HTTP_UNPROCESSABLE_ENTITY
            );
        }

        $chatId = Arr::get($message, 'chat.id');

        if (! $chatId) {
            return new JsonResponse([
                // phpcs:ignore Generic.Files.LineLength
                'message' => 'ChatID не найден. Убедитесь что отправили кодовое слово в чат с ботом и повторите через 10 секунд.'
            ], Response::HTTP_UNPROCESSABLE_ENTITY);
        }

        return new JsonResponse([
            'data' => [
                'chat_id' => $chatId,
            ],
        ]);
    }

    public function testTgMessage(Request $request): JsonResponse
    {
        $template = $request->json('template', 'Нет шаблона');
        $token = $request->json('token');
        $chatId = $request->json('chat_id');

        if (! $token) {
            return new JsonResponse([
                'message' => 'Не задан Telegram BotToken',
            ]);
        }

        if (! $chatId) {
            return new JsonResponse([
                'message' => 'Не задан ChatID.',
            ]);
        }

        $variables = [
            '{store_name}' => $this->settings->config()->getApp()->getAppName(),
            '{order_id}' => 777,
            '{customer}' => 'Иван Васильевич',
            '{email}' => 'telegram@opencart.com',
            '{phone}' => '+79999999999',
            '{comment}' => 'Это тестовый заказ',
            '{address}' => 'г. Москва',
            '{total}' => 100000,
            '{ip}' => '127.0.0.1',
            '{created_at}' => date('Y-m-d H:i:s'),
        ];

        $message = $this->telegramService->prepareMessage($template, $variables);

        try {
            $this->telegramService
                ->setBotToken($token)
                ->sendMessage($chatId, $message);

            return new JsonResponse([
                'message' => 'Сообщение отправлено. Проверьте Telegram.',
            ]);
        } catch (ClientException $exception) {
            $json = json_decode($exception->getResponse()->getBody(), true);

            return new JsonResponse([
                'message' => $json['description'],
            ]);
        } catch (Exception $e) {
            return new JsonResponse([
                'message' => $e->getMessage(),
            ]);
        }
    }

    /**
     * @throws GuzzleException
     * @throws TelegramClientException
     * @throws \JsonException
     */
    public function tgGetMe(): JsonResponse
    {
        if (! $this->settings->config()->getTelegram()->getBotToken()) {
            return new JsonResponse(['data' => null]);
        }

        $data = $this->cache->get('tg_me_info');

        if (! $data) {
            $data = $this->telegramService->exec('getMe');
            $this->cache->set('tg_me_info', $data, 60 * 5);
        }

        return new JsonResponse(compact('data'));
    }
}
