<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Telegram\Bot\Laravel\Facades\Telegram;
use Telegram\Bot\FileUpload\InputFile;
use App\Services\YtDlpDownloader;

class TelegramListen extends Command
{
    protected $signature = 'telegram:listen';
    protected $description = 'Listen Telegram updates via long polling';

    public function handle(YtDlpDownloader $downloader): int
    {
        $this->info('Listening Telegram... Ctrl+C to stop');

        $offset = 0;

        while (true) {
            $updates = Telegram::getUpdates([
                'offset' => $offset,
                'timeout' => 25,
                'allowed_updates' => ['message'],
            ]);

            foreach ($updates as $update) {
                $offset = $update->getUpdateId() + 1;

                $message = $update->getMessage();
                if (!$message) continue;

                $chatId = $message->getChat()->getId();
                $text = trim((string) $message->getText());

                if (!preg_match('~https?://\S+~', $text, $m)) {
                    Telegram::sendMessage([
                        'chat_id' => $chatId,
                        'text' => "Пришли ссылку на видео (YouTube и т.д.)",
                    ]);
                    continue;
                }

                $url = $m[0];

                Telegram::sendMessage([
                    'chat_id' => $chatId,
                    'text' => "Скачиваю... ⏳",
                ]);

                $tries = [720, 480, 360];

                foreach ($tries as $h) {
                    $result = $downloader->downloadMp4($url, $h);

                    if (!$result['ok']) {
                        $tail = implode("\n", $result['log_tail'] ?? []);
                        $extra = (($result['code'] ?? null) === 0)
                            ? "\n\nКод 0 = yt-dlp отработал, но файл не найден/не определён."
                            : "";

                        Telegram::sendMessage([
                            'chat_id' => $chatId,
                            'text' => "Ошибка ❌ (качество {$h}p)\nКод: {$result['code']}{$extra}\n\n{$tail}",
                        ]);
                        break;
                    }

                    $filePath = $result['file'];
                    $size = @filesize($filePath);

                    if ($size !== false && $size <= 50 * 1024 * 1024) {
                        try {
                            Telegram::sendVideo([
                                'chat_id' => $chatId,
                                'video' => InputFile::create($filePath, basename($filePath)),
                                'caption' => "Готово ✅ ({$h}p)",
                                'supports_streaming' => true,
                            ]);
                        } catch (\Throwable $e) {
                            Telegram::sendDocument([
                                'chat_id' => $chatId,
                                'document' => InputFile::create($filePath, basename($filePath)),
                                'caption' => "Видео отправил файлом ✅ ({$h}p)",
                            ]);
                        }
                        break;
                    }

                    if ($h !== 360) {
                        $mb = $size ? round($size / 1024 / 1024, 1) : '?';
                        Telegram::sendMessage([
                            'chat_id' => $chatId,
                            'text' => "Файл {$mb} MB — пробую меньшее качество...",
                        ]);
                        continue;
                    }

                    $mb = $size ? round($size / 1024 / 1024, 1) : '?';
                    Telegram::sendMessage([
                        'chat_id' => $chatId,
                        'text' => "Файл всё равно большой ({$mb} MB). Сохранён тут:\n{$filePath}",
                    ]);
                }
            }

            usleep(250000);
        }

        return self::SUCCESS;
    }
}