# План: Рефакторинг логіки та впровадження Unit-тестування (Варіант 1)

## Огляд
Цей план фокусується на відокремленні обчислювальної логіки (метрики мережі, стан хостів) від коду графічного інтерфейсу. Це дозволить написати надійні Unit-тести для перевірки правильності розрахунку Jitter та втрат пакетів, а також підготує грунт для подальшого розширення функціоналу (UDP-пінг, діагностика) без захаращування `main.rs`.

## Зміни в архітектурі
1. **Створення модулів**:
   - `src/model/mod.rs` та `src/model/status.rs`: Винесення структур `HostInfo`, `HostStatus` та логіки обробки семплів.
   - `src/model/app_state.rs`: Винесення `AppState`.
2. **Інкапсуляція**: Перетворення методів розрахунку на чисті функції або методи, які легко тестувати з передбачуваними вхідними даними.
3. **Чистота main.rs**: У головному файлі залишиться лише запуск `eframe` та опис UI-компонентів.

## Етапи реалізації

### 1. Рефакторинг структур даних
- [x] Створити каталог `src/model/`.
- [x] Перенести `HostInfo` та `HostStatus` у `src/model/status.rs`.
- [x] Перенести `AppState` у `src/model/app_state.rs`.
- [x] Оновити імпорти в `src/main.rs` та забезпечити коректну сереалізацію/десереалізацію.

### 2. Відокремлення обчислювальної логіки
- [x] Винести метод `calculate_jitter` як незалежну публічну функцію (для легкого тестування різних послідовностей затримок).
- [x] Рефакторинг `add_sample`: забезпечити, щоб метод повертав оновлені стани, не залежачи від зовнішніх станів.
- [x] Створити модуль `src/logic/` для фонового завдання пінгів (`pinger_task`), щоб відокремити мережеву активність від UI-циклу.

### 3. Написання Unit-тестів
- [x] Створити модульні тести для `calculate_jitter`:
    - [x] Тест на порожні дані.
    - [x] Тест на стабільну затримку (jitter має бути 0).
    - [x] Тест на затримку, що зростає.
    - [x] Тест на випадкові стрибки (порівняння з ручним розрахунком за алгоритмами T3, T21, T99).
- [x] Створити тести для `HostStatus::add_sample`:
    - [x] Перевірка накопичення історії (ліміт у 99 елементів).
    - [x] Перевірка коректності розрахунку відсотка втрат пакетів (`lost / sent`).
    - [x] Перевірка ігнорування `NaN` значень при розрахунку середнього RTT.

### 4. Верифікація інтеграції
- [x] Запустити `cargo test` і переконатися, що всі логічні тести проходять.
- [x] Запустити програму в ручному режимі та переконатися, що UI відображає дані коректно після рефакторингу.

## Критерії успіху
- Код розрахунку метрик повністю відокремлений від `egui` та `eframe`.
- Файл `src/main.rs` став компактнішим і фокусується лише на UI.
- Наявність тестового покриття для критичних алгоритмів (jitter, loss).
- Всі існуючі функції програми (збереження хостів, графіки) працюють без змін.
