# Контексты Bootstrap

`XC_Bootstrap` — единая точка входа для инициализации системы.
Каждый контекст загружает ровно тот набор подсистем, который нужен для конкретного типа запроса.
Контекст передаётся как значение enum `BootContext`.

---

## Быстрый справочник

| Enum-значение         | Где используется                         |
| --------------------- | ---------------------------------------- |
| `BootContext::MINIMAL` | Скрипты, которым нужны только пути/конфиг |
| `BootContext::CLI`     | Cron-задачи, CLI-команды                 |
| `BootContext::STREAM`  | Стриминговые эндпоинты (live, vod, ts)   |
| `BootContext::ADMIN`   | Панель администратора / реселлера        |

---

## Что загружает каждый контекст

### BootContext::MINIMAL

Загружает только базовые константы и конфигурацию. База данных не подключается.

**Включает:**

- Composer PSR-4 автозагрузчик (`vendor/autoload.php`)
- Константы путей (`MAIN_HOME`, `INCLUDES_PATH`, `CONFIG_PATH`, …)
- Logger (`Logger::init()`)
- Функции ошибок (`generateError()`, `generate404()`)

**Не включает:** DB, Redis, сессии, Translator, Admin API.

**Пример:**

```php
require_once '/home/xc_vm/bootstrap.php';
XC_Bootstrap::boot(BootContext::MINIMAL);

// Теперь доступны MAIN_HOME, Logger
echo MAIN_HOME;
```

---

### BootContext::CLI

Предназначен для cron-заданий и CLI-команд. Добавляет подключение к БД поверх `MINIMAL`.

**Включает** (дополнительно к MINIMAL):

- Подключение к базе данных
- `LegacyInitializer` (легаси-глобалы для функций из `www/`)
- Redis (по умолчанию: `false`; включить через опцию `'redis' => true`)
- `cli_set_process_title()` (если передана опция `'process'`)

**Пример:**

```php
require_once '/home/xc_vm/bootstrap.php';
XC_Bootstrap::boot(BootContext::CLI, [
    'cached'  => true,
    'process' => 'xc_vm: my-cron-job',
]);
```

---

### BootContext::STREAM

Лёгкий контекст для стриминговых эндпоинтов. Инициализирует только то, что нужно для горячего пути стриминга.

**Включает** (дополнительно к MINIMAL):

- Подключение к базе данных (`cached: true` — всегда)
- Flood-protection и проверка хоста

**Не включает:** Redis, Translator, Admin API, сессии.

> Это намеренное ограничение. Любой дополнительный код в горячем пути увеличивает задержку стриминга.

**Пример:**

```php
require_once '/home/xc_vm/bootstrap.php';
XC_Bootstrap::boot(BootContext::STREAM, ['cached' => true]);
```

---

### BootContext::ADMIN

Полная инициализация для панели администратора и реселлера.

**Включает** (дополнительно к MINIMAL):

- PHP-сессия (с параметром `SameSite=Strict`)
- Подключение к базе данных (`cached: false`)
- `LegacyInitializer`
- Redis
- Admin API / Reseller API
- Translator (локализация)
- Shutdown-обработчик
- Статусные константы
- Admin globals

**Пример:**

```php
require_once '/home/xc_vm/bootstrap.php';
XC_Bootstrap::boot(BootContext::ADMIN);
```

---

## Матрица подсистем

| Подсистема         | MINIMAL | CLI | STREAM | ADMIN |
| ------------------ | :-----: | :-: | :----: | :---: |
| Константы / пути   | ✅      | ✅  | ✅     | ✅    |
| Logger             | ✅      | ✅  | ✅     | ✅    |
| Flood-protection   | —       | —   | ✅     | ✅    |
| Проверка хоста     | —       | —   | ✅     | ✅    |
| База данных        | —       | ✅  | ✅     | ✅    |
| LegacyInitializer  | —       | ✅  | —      | ✅    |
| Redis              | —       | opt | —      | ✅    |
| PHP-сессия         | —       | —   | —      | ✅    |
| Admin API          | —       | —   | —      | ✅    |
| Translator         | —       | —   | —      | ✅    |

---

## Опции `boot()`

```php
XC_Bootstrap::boot(BootContext $context, array $options = []);
```

| Опция        | Тип        | Умолчание                    | Описание                              |
| ------------ | ---------- | ---------------------------- | ------------------------------------- |
| `cached`     | `bool`     | `true` (STREAM), `false` (остальные) | Загружать настройки из кеша     |
| `redis`      | `bool`     | `true` (ADMIN), `false` (остальные)  | Подключать Redis                |
| `process`    | `string`   | `''`                         | Имя процесса для `cli_set_process_title()` |
| `shutdown`   | `callable` | встроенный                   | Замена стандартного shutdown-обработчика |

---

## Идемпотентность

`boot()` выполняется **один раз за процесс** — повторные вызовы игнорируются.

```php
XC_Bootstrap::boot(BootContext::ADMIN);
XC_Bootstrap::boot(BootContext::CLI); // проигнорировано
```

Для сброса состояния (только в тестах):

```php
XC_Bootstrap::reset();
```

---

## Публичные методы

```php
XC_Bootstrap::getContext(): ?BootContext  // текущий контекст
XC_Bootstrap::isBooted(): bool            // выполнен ли boot()
XC_Bootstrap::isCli(): bool               // работает ли в CLI
XC_Bootstrap::getDatabase(): ?Database
XC_Bootstrap::getContainer(): ServiceContainer
```

## Связанные файлы

| Файл | Роль |
| --- | --- |
| `src/bootstrap.php` | Определяет MAIN_HOME, подключает автозагрузчик Composer, бутит контекст |
| `src/Core/Enum/BootContext.php` | Enum контекста загрузки |
| `src/Core/Init/LegacyInitializer.php` | Инициализация под каждый контекст |
