# 🎯 Полная интеграция Adel Site с API

## ✅ Завершенные функции

### 🔐 **Аутентификация (AuthTab)**
```
✅ Регистрация новых пользователей
✅ Вход за существующий аккаунт
✅ Сохранение JWT токена
✅ Обработка ошибок и валидация
```

**Endpoints:**
- `POST /api/login` - Вход
- `POST /api/login/register` - Регистрация

---

### 🏠 **Главная страница (HomeTab)**
```
✅ Привет, [Имя пользователя]!
✅ Быстрые ссылки на разделы
✅ Промо-баннер со скидками
✅ Категории поиска
```

---

### 📋 **Каталог (CatalogTab)**
```
✅ Загрузка всех залов с API
✅ Сортировка: по названию, цене ↑/↓
✅ Фильтрация по макс. цене (range slider)
✅ Добавление в корзину с дата/временем
✅ Функция избранного (❤️ кнопка)
✅ Загрузка избранного при входе
```

**Endpoints:**
- `GET /api/halls` - Получить все залы
- `GET /api/favorites` - Получить избранное пользователя (JWT)
- `POST /api/favorites` - Добавить в избранное (JWT)

**Функция избранного:**
```javascript
// Требует авторизации
Headers: { Authorization: "Bearer {token}" }
Body: { hall_id: number, photographer_id: null }
```

---

### 🔍 **Поиск (SearchTab)**
```
✅ Поиск по названию и описанию
✅ Фильтрация по категориям
✅ Клиентский поиск (быстрый)
✅ Отображение результатов в реальном времени
```

**Как работает:**
1. Загружает все залы при монтировании
2. Фильтрует по названию/описанию как пользователь печатает
3. Фильтрует по выбранной категории

---

### 🛒 **Корзина (CartTab)**
```
✅ Добавление/удаление товаров
✅ Увеличение/снижение количества часов
✅ Автоматический расчет суммы
✅ Сохранение бронирования через API
✅ Красный бэйдж с количеством товаров
✅ Проверка авторизации перед оплатой
```

**Процесс оформления:**
1. Нажимает "💳 Перейти к оплате"
2. Система проверяет наличие JWT токена
3. Для каждого товара в корзине создается бронирование
4. Вызывает `POST /api/booking` для каждого товара
5. При успехе очищает корзину

**API запрос:**
```javascript
POST /api/booking
Headers: {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer {token}'
}
Body: {
  clientId: number,
  hallId: number,
  startTime: ISO string,
  endTime: ISO string,
  totalCost: number,
  status: 'pending'
}
```

---

### 👤 **Профиль (ProfileTab)**
```
✅ Отображение имени пользователя
✅ Вкладка "Профиль" с меню
✅ Вкладка "Мои бронирования" со списком
✅ Статусы бронирований
✅ Форматирование дат
✅ Выход из аккаунта
```

**Вкладка "Профиль":**
- Мои бронирования
- Способы оплаты
- Настройки
- Выход

**Вкладка "Мои бронирования":**
- Список всех бронирований пользователя
- Статус каждого (⏳ Ожидание, ✅ Подтверждено и т.д.)
- Дата начала и конца
- Общая стоимость

**Endpoints:**
- `GET /api/booking` - Получить все бронирования

---

### 🧭 **Основное приложение (App.vue)**
```
✅ Нижняя навигация для мобилей (5 вкладок)
✅ Боковая навигация для ПК
✅ Переключение между вкладками
✅ Красный бэйдж на иконке корзины
✅ Проверка авторизации при загрузке
✅ Загрузка списка залов
```

---

## 📡 Полный список API endpoints

| Метод | Endpoint | Auth | Описание |
|-------|----------|------|----------|
| `POST` | `/api/login` | ❌ | Вход пользователя |
| `POST` | `/api/login/register` | ❌ | Регистрация |
| `GET` | `/api/halls` | ❌ | Все залы |
| `GET` | `/api/services` | ❌ | Все услуги |
| `GET` | `/api/booking` | ❌ | Все бронирования |
| `POST` | `/api/booking` | ✅ | Создать бронирование |
| `PATCH` | `/api/booking/:id` | ✅ | Обновить бронирование |
| `DELETE` | `/api/booking/:id` | ✅ | Удалить бронирование |
| `GET` | `/api/favorites` | ✅ | Получить избранное |
| `POST` | `/api/favorites` | ✅ | Добавить в избранное |

---

## 🔑 Токен JWT

**Где сохраняется:** `localStorage.jwt_token`

**Структура:** `{id: number, firstName: string}`

**Как использовать:**
```javascript
// Отправка
Headers: { Authorization: `Bearer ${token}` }

// Декодирование на клиенте
const payload = JSON.parse(atob(token.split('.')[1]));
```

---

## 🚀 Как запустить и тестировать

### 1. Запустить API сервер
```bash
cd Api
npm install
node app.js
```
✅ Сервер на `http://localhost:3000`

### 2. Запустить фронтенд
```bash
cd Site
npm install
npm run dev
```
✅ Фронтенд на `http://localhost:5173` (или другой порт)

### 3. Тестировать функции

**Регистрация:**
1. Откройте приложение
2. Перейдите на вкладку "👤 Профиль"
3. Нажмите "Нет аккаунта? Регистрация"
4. Заполните форму и создайте аккаунт

**Просмотр залов:**
1. Перейдите на вкладку "📋 Каталог"
2. Используйте фильтры и сортировку
3. Нажмите ❤️ для добавления в избранное
4. Нажмите "🛒 Добавить" для добавления в корзину

**Поиск:**
1. Перейдите на вкладку "🔍 Поиск"
2. Введите название или описание
3. Выбирайте категории
4. Смотрите результаты в реальном времени

**Оформление заказа:**
1. Добавьте несколько залов в корзину
2. Перейдите на вкладку "🛒 Корзина"
3. Нажмите "💳 Перейти к оплате"
4. Проверьте консоль браузера (F12) для результата API вызова

**Профиль:**
1. Авторизуйтесь
2. Перейдите на вкладку "👤 Профиль"
3. Смотрите список ваших бронирований
4. Нажмите "Выход" для выхода

---

## ⚙️ Конфигурация

**API URL:** `http://localhost:3000`
(Может быть изменен в каждом компоненте)

**Порт фронтенда:** автоматически определяется Vite

---

## 🎨 Дизайн

- **Основной цвет:** #2BD84C (зеленый)
- **Фон:** #FFFFFF (белый)
- **Вторичный фон:** #F5F5F5 (серый)
- **Текст:** #000000 (черный)
- **Ошибки:** #FF4B4B (красный)

---

## 📝 Важные примечания

1. **Корзина** хранится в памяти браузера - очищается при перезагрузке страницы
2. **Поиск** использует клиентскую фильтрацию для быстроты
3. **Избранное** требует авторизации и регулярно загружается
4. **Image fallback** использует placeholder при ошибке загрузки
5. **Даты** в бронированиях форматируруются в локали ru-RU

---

## 🐛 Отладка

Откройте DevTools (F12) для:
- Просмотра сетевых запросов (Network)
- Проверки консоли (Console)
- Просмотра localStorage (Application → Storage)
- Анализа ошибок

---

## ✨ Будущие улучшения

- [ ] Локальное хранилище для корзины
- [ ] Система прогрессивной загрузки
- [ ] WebSocket для обновления в реальном времени
- [ ] Загрузка фото профиля
- [ ] Расширенная фильтрация
- [ ] Система оценок и отзывов
- [ ] Уведомления о статусе бронирования
- [ ] Интеграция платежей (Stripe, Yandex.Kassa)
