---
phase: 02-admin-panel-upgrade
plan: 01
type: execute
wave: 1
depends_on: ["01-01"]
files_modified:
  - src/Core/Database/Migrator.php
  - src/Controllers/SettingsController.php
  - src/Controllers/StatLinkController.php
  - templates/layout/sidebar.php
  - templates/layout/main.php
  - templates/settings/index.php
  - templates/settings/database.php
  - templates/statlink/index.php
  - config/routes.php
  - assets/css/app.css
autonomous: true
delegation: off
---

<objective>
## Goal
Rozbudowa panelu administracyjnego backPRO o trzy funkcje:
1. Panel migracji bazy danych (wzorowany na orderPRO Migrator)
2. Nowoczesne lewe menu sidebar (wzorowane na orderPRO)
3. Lista publikacji StatLink — przegląd linkowanych artykułów

## Purpose
Usprawnienie zarządzania projektem — migracje bez ręcznego SSH, lepszy UX nawigacji, widoczność statusu linkowania StatLink.

## Output
- `Migrator.php` — engine migracji (port z orderPRO, dostosowany do backPRO)
- Nowy sidebar z grupowaniem, ikonami SVG, collapse/expand
- Widok `/statlink` z listą aktywnych/wygasłych linków StatLink
- Endpoint migracji `/settings/database/migrate`
</objective>

<context>
## Project Context
@.paul/PROJECT.md
@.paul/ROADMAP.md
@.paul/STATE.md

## Source Files — backPRO
@templates/layout/sidebar.php
@templates/layout/main.php
@assets/css/app.css
@src/Controllers/SettingsController.php
@config/routes.php

## Reference — orderPRO (wzorce do adaptacji)
- Migrator: C:\visual studio code\projekty\orderPRO\src\Core\Database\Migrator.php
- Sidebar: C:\visual studio code\projekty\orderPRO\resources\views\layouts\app.php (lines 18-116)
- Database view: C:\visual studio code\projekty\orderPRO\resources\views\settings\database.php
- CSS sidebar: C:\visual studio code\projekty\orderPRO\public\assets\css\app.css (sidebar section)
</context>

<acceptance_criteria>

## AC-1: Panel migracji bazy danych
```gherkin
Given użytkownik zalogowany w panelu backPRO
When przechodzi do /settings/database
Then widzi statystyki migracji (total, applied, pending)
And widzi listę oczekujących plików migracji
And może kliknąć "Uruchom migracje" aby wykonać pending migracje
And po wykonaniu widzi logi z wynikami (ok/error per plik)
```

## AC-2: Nowy sidebar
```gherkin
Given użytkownik zalogowany w panelu
When widzi lewe menu
Then menu ma nowoczesny wygląd (ciemne tło, ikony SVG, grupy rozwijane)
And sekcje: Główne (Dashboard, Strony, SEO Stats), Treści (Tematy, Artykuły, StatLink), Administracja (Instalator, Ustawienia z sub-menu, Logi)
And aktywna strona jest podświetlona
And menu można zwinąć/rozwinąć
```

## AC-3: Lista publikacji StatLink
```gherkin
Given użytkownik przechodzi do /statlink
Then widzi tabelę z linkami StatLink (artykuł, URL, anchor, data dodania, wygasa, status)
And linki aktywne są zielone, wygasłe szare, failed czerwone
And widzi podsumowanie: X aktywnych, Y wygasłych, Z błędów
```

</acceptance_criteria>

<tasks>

<task type="auto">
  <name>Task 1: Migrator engine + controller + widok migracji</name>
  <files>src/Core/Database/Migrator.php, src/Controllers/SettingsController.php, templates/settings/database.php, config/routes.php</files>
  <action>
    1. Skopiować i dostosować Migrator.php z orderPRO:
       - Namespace: App\Core\Database
       - Zmienić lock name na 'backpro_migrations_lock'
       - Używa istniejącego Database::getInstance() do PDO
       - Ścieżka migracji: basePath/migrations/
       - Bez zmian w logice (ensureMigrationsTable, runPending, status)

    2. Dodać metody do SettingsController:
       - database(): GET /settings/database — wyświetla status migracji
         - Tworzy Migrator z Database::getInstance() i ścieżką migrations
         - Przekazuje $status = $migrator->status() do widoku
       - migrate(): POST /settings/database/migrate — uruchamia migracje
         - Wywołuje $migrator->runPending()
         - Flash success/error + redirect do /settings/database

    3. Dodać routes:
       - $router->get('/settings/database', 'SettingsController', 'database');
       - $router->post('/settings/database/migrate', 'SettingsController', 'migrate');

    4. Utworzyć templates/settings/database.php:
       - Statystyki: total, applied, pending (3 karty)
       - Alert warning jeśli pending > 0 + przycisk "Uruchom migracje"
       - Tabela z pending files
       - Logi po wykonaniu (jeśli dostępne)
       - Styl: użyj istniejących klas Bootstrap z backPRO

    Avoid: nie zmieniaj istniejącego install.php — Migrator to nowy, równoległy mechanizm.
    Avoid: nie usuwaj istniejącej metody index() ani update() z SettingsController.
  </action>
  <verify>PHP lint na wszystkich zmienionych plikach</verify>
  <done>AC-1 satisfied: panel migracji z Migratorem dostępny pod /settings/database</done>
</task>

<task type="auto">
  <name>Task 2: Nowy sidebar wzorowany na orderPRO</name>
  <files>templates/layout/sidebar.php, templates/layout/main.php, assets/css/app.css</files>
  <action>
    1. Przepisać sidebar.php na nowy format z orderPRO:
       - Struktura: aside.sidebar > div.sidebar__brand + nav.sidebar__nav
       - Grupy rozwijane: details.sidebar__group > summary.sidebar__group-toggle + div.sidebar__group-links
       - Ikony SVG inline (nie Bootstrap Icons CDN)
       - Collapse button w brand area

       Sekcje menu:
       a) Grupa "Główne":
          - Dashboard (/) — ikona: dashboard/home
          - Strony WP (/sites) — ikona: globe
          - Statystyki SEO (/seo/stats) — ikona: chart

       b) Grupa "Treści":
          - Biblioteka Tematów (/global-topics) — ikona: book
          - Artykuły (/articles) — ikona: document
          - StatLink (/statlink) — ikona: link/chain

       c) Grupa "Administracja":
          - Instalator WP (/installer) — ikona: download
          - Ustawienia (/settings) — sub-links:
            - Ustawienia API (/settings)
            - Baza danych (/settings/database)
          - Dziennik zdarzeń (/logs) — ikona: list

       d) Footer: użytkownik + wyloguj (jak obecny)

    2. Active state: użyj zmiennej $activeMenu przekazywanej z kontrolera
       - Grupy auto-open gdy aktywna strona jest w grupie

    3. Dodać CSS sidebar do app.css (skopiować sekcję sidebar z orderPRO app.css):
       - .sidebar: dark bg (#0f172a), 260px width, fixed left
       - .sidebar.is-collapsed: 52px width, hide labels
       - .sidebar__brand, __nav, __link, __group, __sublink
       - Hover, active states, transitions
       - Responsive: mobile overlay z backdrop

    4. Zaktualizować main.php:
       - Dodać .app-shell wrapper
       - Dodać sidebar-backdrop div
       - Dodać JS do collapse/expand

    Avoid: nie usuwaj istniejących stylów z app.css — dodaj nowe sekcje sidebar na końcu.
    Avoid: zachowaj aktualną zmienną $activeMenu i Router::isCurrent().
  </action>
  <verify>PHP lint + wizualna weryfikacja (sidebar renderuje się poprawnie)</verify>
  <done>AC-2 satisfied: nowy sidebar z grupami, ikonami SVG, collapse</done>
</task>

<task type="auto">
  <name>Task 3: Widok listy StatLink + route</name>
  <files>src/Controllers/StatLinkController.php, templates/statlink/index.php, config/routes.php</files>
  <action>
    1. Dodać metodę index() do StatLinkController:
       - Auth::requireLogin()
       - Pobrać z bazy statlink_links z JOIN na articles i sites
       - Podsumowanie: count active, expired, removed, failed
       - Paginacja (20 per page)
       - Przekazać do widoku

    2. Dodać route: $router->get('/statlink', 'StatLinkController', 'index');

    3. Utworzyć templates/statlink/index.php:
       - Nagłówek z 4 kartami statystyk (active, expired, removed, failed) — kolorowe
       - Tabela:
         - Artykuł (tytuł + link do /articles/{id})
         - Strona (nazwa site)
         - URL linkowany
         - Anchor
         - Data dodania
         - Wygasa
         - Status (badge: zielony=active, szary=expired/removed, czerwony=failed)
         - StatLink ID
       - Sortowanie domyślne: added_at DESC
       - Paginacja na dole

    Avoid: nie modyfikuj istniejącej metody runByToken() w StatLinkController.
  </action>
  <verify>PHP lint + endpoint /statlink zwraca stronę z tabelą</verify>
  <done>AC-3 satisfied: lista StatLink z tabelą i statystykami</done>
</task>

</tasks>

<boundaries>

## DO NOT CHANGE
- src/Services/StatLinkService.php (dopiero co utworzony)
- src/Services/PublisherService.php
- src/Models/Article.php
- migrations/* (istniejące migracje)
- install.php (istniejący mechanizm)

## SCOPE LIMITS
- Nie dodajemy CRUD dla statlink_links (tylko podgląd)
- Nie przenosimy istniejących ustawień do nowego formatu
- Sidebar: adaptacja orderPRO designu, nie kopia 1:1

</boundaries>

<verification>
Before declaring plan complete:
- [ ] php -l na wszystkich zmienionych/nowych plikach PHP
- [ ] /settings/database pokazuje status migracji
- [ ] POST /settings/database/migrate wykonuje pending migracje
- [ ] Sidebar renderuje się z nowymi grupami i ikonami
- [ ] /statlink pokazuje listę linków z tabeli statlink_links
- [ ] Aktywne linki w menu są podświetlone
</verification>

<success_criteria>
- 3 taski wykonane
- Panel migracji działa end-to-end
- Sidebar wygląda jak w orderPRO (adaptacja do backPRO)
- Lista StatLink pokazuje dane z tabeli
- Brak regresji w istniejącej funkcjonalności
</success_criteria>

<output>
After completion, create `.paul/phases/02-admin-panel-upgrade/02-01-SUMMARY.md`
</output>
