# План — Інструмент системної діагностики (System Tools)

## Огляд
Додати окреме вікно «Системні інструменти» (🔧), яке надає користувачу можливість запускати типові мережеві діагностичні команди прямо з графічного інтерфейсу **без потреби у терміналі**. Вікно містить покроковий довідник із діагностики мережевих проблем, комбобокс для вибору команди та поле виводу результатів.

Код реалізується як **окремий модуль** `src/ui/system_tools.rs`, щоб не ускладнювати вже великий `app.rs`.

## Зміни в архітектурі

### 1. Новий модуль `src/ui/system_tools.rs`
Містить:
- **Структуру `SystemCommand`** — опис однієї команди (назва, опис, програма, аргументи).
- **Функцію `get_commands() -> Vec<SystemCommand>`** — повертає список команд, відповідний для поточної ОС (`cfg!(target_os = "linux")` / `cfg!(target_os = "windows")`).
- **Структуру `SystemToolsState`** зі станом вікна:
  - `selected_command: usize` — індекс обраної команди.
  - `output: String` — результат виконання.
  - `is_running: bool` — прапорець «команда виконується».
  - `selected_tab: ToolsTab` — вкладка (Довідник / Команди).
- **Функцію `ui_system_tools_window()`** — малює вікно.
- **Функцію `run_command_async()`** — запускає команду через `std::process::Command` у фоновому потоці.

### 2. Новий модуль `src/ui/mod.rs`
Виділити UI-модулі в окремий каталог:
```
src/ui/
  mod.rs              // pub mod system_tools;
  system_tools.rs
```

### 3. Зміни в `src/app.rs`
- Додати поле `system_tools_open: bool` та `system_tools: SystemToolsState` до `EguiPinger`.
- Додати кнопку «🔧» у верхній панелі (біля перемикача тем).
- Виклик `ui_system_tools_window()` коли `system_tools_open == true`.

## Набір команд

### Linux
| Категорія            | Назва                         | Команда                              |
|----------------------|-------------------------------|--------------------------------------|
| Базова інформація    | Мережеві інтерфейси           | `ip -c addr`                         |
| Базова інформація    | Стан інтерфейсів              | `ip -c link`                         |
| Базова інформація    | Зовнішня IP-адреса           | `curl -s ifconfig.me`                |
| Маршрутизація        | Таблиця маршрутів             | `ip route`                           |
| Маршрутизація        | Таблиця маршрутів IPv6        | `ip -6 route`                        |
| DNS                  | Налаштування DNS              | `cat /etc/resolv.conf`               |
| DNS                  | DNS-запит google.com          | `dig google.com +short`              |
| DNS                  | Зворотний DNS (8.8.8.8)      | `dig -x 8.8.8.8 +short`             |
| З'єднання            | Активні TCP/UDP з'єднання     | `ss -tuln`                           |
| З'єднання            | Всі TCP з'єднання з процесами | `ss -tlnp`                           |
| ARP / Сусіди         | ARP таблиця                   | `ip neigh`                           |
| Wi-Fi                | Стан Wi-Fi з'єднання          | `iw dev wlan0 link` (або `nmcli dev wifi`) |
| Wi-Fi                | Список Wi-Fi мереж            | `nmcli dev wifi list`                |
| Система              | Статистика мережевих інтерфейсів | `ip -s link`                      |
| Система              | Час роботи системи            | `uptime`                             |
| Система              | Журнал мережевих помилок      | `journalctl -u NetworkManager --no-pager -n 30` |

### Windows
| Категорія            | Назва                         | Команда                              |
|----------------------|-------------------------------|--------------------------------------|
| Базова інформація    | Налаштування мережі           | `ipconfig /all`                      |
| Базова інформація    | MAC-адреси мережевих адаптерів | `getmac /v`                          |
| Базова інформація    | Статус мережевих інтерфейсів  | `netsh interface show interface`     |
| Базова інформація    | Зовнішня IP-адреса            | `curl -s ifconfig.me`                |
| Маршрутизація        | Таблиця маршрутів             | `route print`                        |
| DNS                  | Кеш DNS                       | `ipconfig /displaydns`               |
| DNS                  | Очищення DNS-кешу             | `ipconfig /flushdns`                 |
| DNS                  | DNS-запит google.com          | `nslookup google.com`                |
| З'єднання            | Активні з'єднання             | `netstat -an`                        |
| З'єднання            | Статистика протоколів         | `netstat -s`                         |
| ARP                  | ARP таблиця                   | `arp -a`                             |
| Wi-Fi                | Стан Wi-Fi з'єднання          | `netsh wlan show interfaces`         |
| Wi-Fi                | Список Wi-Fi мереж            | `netsh wlan show networks mode=bssid`|
| Система              | Стан Firewall                 | `netsh advfirewall show currentprofile` |
| Система              | Глобальні налаштування TCP    | `netsh interface tcp show global`    |
| Система              | Час роботи системи            | `systeminfo | findstr /C:"System Boot Time"` |

## Покроковий довідник (вкладка «Guide»)
Довідник структурується за сценаріями проблем. Кожен сценарій вказує, яку команду запустити та на що звернути увагу у виводі. Довідник перекладений через `tr!()`.

**Структура (скорочено):**

1. **Інтернет повністю не працює**
   - Перевірте: чи є IP-адреса? → `Мережеві інтерфейси`
   - Перевірте: чи є шлюз? → `Таблиця маршрутів`
   - Перевірте: чи працює DNS? → `DNS-запит google.com`

2. **Обриви та нестабільний зв'язок**
   - Подивіться сусідів та ARP → `ARP таблиця`
   - Перевірте статистику інтерфейсу → `Статистика мережевих інтерфейсів`

3. **Повільний інтернет**
   - Перевірте Wi-Fi: якість сигналу → `Стан Wi-Fi з'єднання`
   - Перевірте наявність встановлених з'єднань → `Активні TCP/UDP з'єднання`

4. **DNS не працює (сайти не відкриваються, але ping 8.8.8.8 працює)**
   - Перевірте настройки DNS → `Налаштування DNS`
   - Спробуйте запит вручну → `DNS-запит google.com`

5. **Потрібні права адміністратора** *(лише текст довідки, без кнопок)*
   - `sudo iptables -L -n` (Linux) — перевірка фаєрвола
   - `sudo tcpdump -i any -c 20` — перехоплення пакетів на рівні NIC

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

- [x] 1. **Створити каталог та модуль `src/ui/`**:
  - Створити `src/ui/mod.rs` із `pub mod system_tools;`.
  - Створити `src/ui/system_tools.rs` із базовими структурами `SystemCommand`, `SystemToolsState`, `ToolsTab`.
  - Зареєструвати `mod ui;` у `src/lib.rs`.

- [x] 2. **Реалізувати список команд `get_commands()`**:
  - Реалізувати функцію, яка повертає `Vec<SystemCommand>` залежно від ОС.
  - Кожна команда має `label`, `description`, `cmd`, `args`.
  - Забезпечити `tr!()` для назв та описів.

- [x] 3. **Реалізувати UI вікна в `ui_system_tools_window()`**:
  - Дві вкладки: «Guide» (довідник) та «Command Output» (вивід команди).
  - На вкладці «Command Output»:
    - `ComboBox` із назвами команд.
    - Опис обраної команди під комбобоксом.
    - Кнопка «▶ Run» (не активна під час виконання).
    - Текстове поле виводу (multiline, monospace, з прокруткою).
    - Перед виводом відображати повний рядок запуску `$ cmd arg1 arg2`.
  - На вкладці «Guide»:
    - Перекладений покроковий довідник із секціями.
    - ComboBox із командами залишається видимим (зверху, поза вкладками).

- [x] 4. **Реалізувати логіку запуску (`run_command_async`)**:
  - Використовувати `std::thread::spawn` + `std::process::Command` (синхронно в окремому потоці).
  - Передавати результат через `Arc<Mutex<Option<String>>>`.
  - Додати тайм-аут 15 секунд.
  - Об'єднувати `stdout` і `stderr` у вивід.
  - Встановлювати `is_running = false` після завершення.

- [x] 5. **Інтегрувати в `src/app.rs`**:
  - Додати `system_tools_open: bool` та `system_tools: SystemToolsState` до `EguiPinger`.
  - Додати кнопку «🔧» у верхній панелі (біля перемикача тем).
  - Виклик функції `ui_system_tools_window()` у `ui_layout()`.

- [x] 6. **Локалізація (`locales/uk.po`)**:
  - Додати переклади для всіх назв команд, описів, та тексту довідника.
  - Оновити `.mo` файл.

- [x] 7. **Тестування**:
  - Написати unit-тести для `get_commands()` (перевірка що список не порожній).
  - Написати GUI-тест: перевірка відкриття вікна та наявності елементів.
  - Ручне тестування запуску кількох команд на Linux.

- [x] 8. **Оновити документацію**:
  - Додати опис функції у `Специфікація.md`.
  - Додати пункт у `TODO.md`.

## Критерії успіху
- Кнопка 🔧 у верхній панелі відкриває вікно «System Tools».
- Вкладка «Guide» містить покроковий довідник із діагностики.
- Вкладка «Commands» дозволяє обрати команду, побачити її опис, запустити та побачити результат.
- Поле виводу починається з рядка `$ ip -c addr` (повна команда з аргументами).
- Інтерфейс не «замерзає» під час виконання команди.
- Всі тексти перекладені українською.
- Всі існуючі тести проходять.
