# Подтверждение резерваций через Telegram

## Обзор

Система поддерживает подтверждение резерваций через inline-кнопку в Telegram. При создании новой резервации со статусом `pending` и указанным email адресом, в Telegram отправляется сообщение с кнопкой "✅ Подтвердить резервацию".

## Как это работает

1. **Создание резервации**: При создании новой резервации через API, если статус `pending` и указан `customer_email`, в Telegram отправляется сообщение с inline-кнопкой.

2. **Нажатие на кнопку**: При нажатии на кнопку Telegram отправляет callback query на webhook endpoint.

3. **Обработка**: Webhook контроллер:
   - Подтверждает резервацию (меняет статус на `confirmed`)
   - Отправляет email клиенту с подтверждением
   - Сохраняет историю сообщения
   - Обновляет сообщение в Telegram (убирает кнопку)
   - Отвечает на callback query

## Настройка

### 1. Настройка Telegram Bot

Убедитесь, что в `.env` настроены:
```env
TELEGRAM_BOT_TOKEN=your_bot_token
TELEGRAM_CHAT_ID=your_chat_id
```

**Важно для групп:**
- `TELEGRAM_CHAT_ID` должен быть ID группы (обычно отрицательное число, например: `-1001234567890`)
- Бот должен быть добавлен в группу как участник
- Бот должен иметь права на отправку сообщений в группе

### 2. Настройка Webhook

В Telegram Bot API нужно настроить webhook на ваш сервер:

```bash
curl -X POST "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/setWebhook" \
  -d "url=https://kartulirest.de/api/webhooks/telegram"
```

Или через браузер:
```
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/setWebhook?url=https://kartulirest.de/api/webhooks/telegram
```

### 3. Получение Chat ID группы

Если вы используете группу, получите её Chat ID:

1. Добавьте бота в группу
2. Отправьте любое сообщение в группу
3. Используйте API для получения обновлений:
   ```bash
   curl "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates"
   ```
4. Найдите в ответе `chat.id` для вашей группы (будет отрицательным числом)
5. Или используйте бота [@getidsbot](https://t.me/getidsbot) - добавьте его в группу и он покажет ID

### 4. Проверка Webhook

Проверить текущий webhook:
```bash
curl "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getWebhookInfo"
```

## Использование

### Автоматическое использование

При создании резервации через `ReservationController::store()`, если:
- Статус резервации = `pending`
- Указан `customer_email`

То автоматически отправляется сообщение в Telegram с кнопкой подтверждения.

### Ручная отправка

Можно вручную отправить уведомление с кнопкой:

```php
use App\Services\TelegramBotService;
use App\Models\Reservation;

$reservation = Reservation::find($id);
$telegramService = app(TelegramBotService::class);
$telegramService->sendNewReservationNotification($reservation);
```

## API Endpoints

### Webhook Endpoint

**POST** `/api/webhooks/telegram`

Обрабатывает callback queries от Telegram Bot API.

**Пример запроса от Telegram:**
```json
{
  "callback_query": {
    "id": "123456789",
    "from": {
      "id": 123456789,
      "is_bot": false,
      "first_name": "Admin"
    },
    "message": {
      "message_id": 123,
      "chat": {
        "id": -1001234567890
      }
    },
    "data": "confirm_reservation_42"
  }
}
```

## Обработка событий

### Подтверждение резервации

При нажатии на кнопку с `callback_data = "confirm_reservation_{id}"`:

1. Резервация обновляется: `status = 'confirmed'`
2. Отправляется email клиенту через `EmailMailerSendService`
3. Создается запись в `reservation_messages` с типом `confirmation`
4. Сообщение в Telegram обновляется (убирается кнопка)
   - В группах также добавляется информация о том, кто подтвердил резервацию
5. Отправляется ответ на callback query

### Работа в группах

Система полностью поддерживает работу в группах Telegram:
- Кнопки работают в группах так же, как и в личных чатах
- При подтверждении в группе в сообщение добавляется информация о пользователе, который нажал кнопку
- Все действия логируются с указанием типа чата (group/supergroup/private)

### Ошибки

- Если резервация не найдена → ответ: "Резервация не найдена"
- Если резервация уже подтверждена → ответ: "Резервация уже подтверждена"
- Если нет email → ответ: "У резервации нет email адреса"
- Если ошибка при отправке email → резервация все равно подтверждается, но показывается предупреждение

## Логирование

Все события логируются:
- Получение callback query (с информацией о пользователе и типе чата)
- Подтверждение резервации
- Отправка email
- Обновление сообщения в Telegram
- Ошибки обработки

Проверить логи:
```bash
tail -f storage/logs/laravel.log | grep -i telegram
```

Пример лога:
```
[2026-01-15 10:30:45] local.INFO: Telegram webhook: Callback query received 
{"callback_query_id":"123456789","data":"confirm_reservation_42","from_user":"admin_user","chat_type":"supergroup"}

[2026-01-15 10:30:46] local.INFO: Reservation confirmed via Telegram 
{"reservation_id":42,"email":"customer@example.com"}

[2026-01-15 10:30:47] local.INFO: Telegram message updated after confirmation 
{"chat_id":-1001234567890,"chat_type":"supergroup","message_id":123}
```

## Безопасность

- Webhook endpoint исключен из CSRF проверки
- Рекомендуется добавить проверку секретного токена в webhook (опционально)
- Telegram Bot API автоматически проверяет подлинность запросов

## Расширение функционала

Можно добавить дополнительные кнопки:
- Отменить резервацию
- Изменить время
- Связаться с клиентом

Пример добавления дополнительных кнопок в `TelegramBotService::sendNewReservationNotification()`:

```php
[
    [
        [
            'text' => '✅ Подтвердить',
            'callback_data' => 'confirm_reservation_' . $reservation->id
        ],
        [
            'text' => '❌ Отменить',
            'callback_data' => 'cancel_reservation_' . $reservation->id
        ]
    ]
]
```
