# Przewodnik testowania - System Statystyk

## Krok 1: Aktualizacja istniejącej bazy danych

Jeśli masz już memy w bazie, najpierw zaktualizuj bazę:

### Opcja A: Przez przeglądarkę
1. Uruchom serwer: kliknij `run.bat`
2. Otwórz: `http://localhost:8088/update_existing_db.php`
3. Sprawdź komunikaty o sukcesie

### Opcja B: Przez terminal
```bash
php update_existing_db.php
```

Powinno się wyświetlić:
```
=== Aktualizacja bazy danych ===

[1/2] Aktualizacja hashów dla istniejących memów...
  ✓ Zaktualizowano hash dla mema #1
  ✓ Zaktualizowano hash dla mema #2
  ...
Zaktualizowano: X memów

[2/2] Inicjalizacja rating_history dla memów...
  ✓ Dodano wpis do rating_history dla mema #1
  ✓ Dodano wpis do rating_history dla mema #2
  ...
Dodano: X wpisów do rating_history

=== Aktualizacja zakończona ===
```

## Krok 2: Test detekcji duplikatów

1. Przejdź do: `http://localhost:8088/upload.php`
2. Spróbuj dodać obrazek który już istnieje w bazie
3. Powinien pojawić się komunikat:
   ```
   Plik 'nazwa.jpg' już istnieje w bazie (duplikat: meme_xxxxx.jpg)
   ```

## Krok 3: Test zapisywania pojedynków

1. Przejdź do: `http://localhost:8088/index.php`
2. Zagłosuj na kilka memów (np. 5-10 razy)
3. Sprawdź bazę danych:

### Opcja A: SQLite Browser (jeśli masz)
Otwórz `memes.db` i sprawdź tabelę `battles`

### Opcja B: Przez PHP
Utwórz plik `test_battles.php`:
```php
<?php
require_once 'db.php';
$result = $db->query("SELECT COUNT(*) as cnt FROM battles");
$row = $result->fetchArray(SQLITE3_ASSOC);
echo "Liczba zapisanych pojedynków: " . $row['cnt'];
?>
```

Otwórz: `http://localhost:8088/test_battles.php`

## Krok 4: Test strony statystyk

1. Przejdź do: `http://localhost:8088/ranking.php`
2. Kliknij przycisk "Zobacz" przy dowolnym memie
3. Powinieneś zobaczyć:
   - ✅ Obrazek mema na górze
   - ✅ Karty ze statystykami (Rating, Win Rate, Wygrane, Przegrane)
   - ✅ Wykres zmian ratingu (jeśli mem brał udział w >1 walce)
   - ✅ Listę ostatnich pojedynków z obrazkami przeciwników
   - ✅ Zmianę ratingu dla każdego pojedynku (+X lub -X)

## Krok 5: Test wykresu zmian ratingu

Aby zobaczyć wykres, mem musi mieć przynajmniej 2 wpisy w historii:

1. Zagłosuj kilka razy na ten sam mem (zarówno wygrane jak i przegrane)
2. Odśwież stronę statystyk
3. Wykres powinien się pojawić z linią pokazującą zmiany

## Krok 6: Sprawdzenie integralności danych

Utwórz `test_integrity.php`:
```php
<?php
require_once 'db.php';

echo "<h2>Test integralności bazy danych</h2>";

// 1. Liczba memów
$result = $db->query("SELECT COUNT(*) as cnt FROM memes");
$memes = $result->fetchArray(SQLITE3_ASSOC)['cnt'];
echo "<p>✓ Memów w bazie: $memes</p>";

// 2. Liczba memów z hashem
$result = $db->query("SELECT COUNT(*) as cnt FROM memes WHERE file_hash IS NOT NULL AND file_hash != ''");
$withHash = $result->fetchArray(SQLITE3_ASSOC)['cnt'];
echo "<p>✓ Memów z hashem: $withHash / $memes</p>";

// 3. Liczba pojedynków
$result = $db->query("SELECT COUNT(*) as cnt FROM battles");
$battles = $result->fetchArray(SQLITE3_ASSOC)['cnt'];
echo "<p>✓ Zapisanych pojedynków: $battles</p>";

// 4. Liczba wpisów w rating_history
$result = $db->query("SELECT COUNT(*) as cnt FROM rating_history");
$history = $result->fetchArray(SQLITE3_ASSOC)['cnt'];
echo "<p>✓ Wpisów w rating_history: $history</p>";

// 5. Sprawdź czy każdy mem ma wpis w rating_history
$result = $db->query("SELECT COUNT(*) as cnt FROM memes m WHERE NOT EXISTS (SELECT 1 FROM rating_history WHERE meme_id = m.id)");
$missing = $result->fetchArray(SQLITE3_ASSOC)['cnt'];

if ($missing == 0) {
    echo "<p style='color: green;'>✓ Wszystkie memy mają wpisy w rating_history</p>";
} else {
    echo "<p style='color: red;'>✗ $missing memów nie ma wpisów w rating_history</p>";
}

// 6. Top 5 najaktywniejszych memów
echo "<h3>Top 5 najaktywniejszych memów:</h3>";
$result = $db->query("SELECT m.id, m.filename, (wins + losses) as total FROM memes m ORDER BY total DESC LIMIT 5");
echo "<ul>";
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
    echo "<li>Mem #{$row['id']} - {$row['total']} pojedynków</li>";
}
echo "</ul>";

echo "<h3>✅ Test integralności zakończony</h3>";
?>
```

Otwórz: `http://localhost:8088/test_integrity.php`

## Krok 7: Test API (opcjonalnie)

Możesz utworzyć prosty endpoint JSON dla statystyk:

`api_stats.php`:
```php
<?php
require_once 'db.php';
require_once 'functions.php';

header('Content-Type: application/json');

$memeId = isset($_GET['id']) ? (int)$_GET['id'] : 0;

if ($memeId <= 0) {
    echo json_encode(['error' => 'Invalid meme ID']);
    exit;
}

$stmt = $db->prepare("SELECT * FROM memes WHERE id = :id");
$stmt->bindValue(':id', $memeId, SQLITE3_INTEGER);
$meme = $stmt->execute()->fetchArray(SQLITE3_ASSOC);

if (!$meme) {
    echo json_encode(['error' => 'Meme not found']);
    exit;
}

$ratingHistory = getMemeHistory($db, $memeId, 100);
$battles = getMemeBattles($db, $memeId, 30);

echo json_encode([
    'meme' => $meme,
    'rating_history' => $ratingHistory,
    'battles' => $battles
], JSON_PRETTY_PRINT);
?>
```

Test: `http://localhost:8088/api_stats.php?id=1`

## Checklist końcowa

- [ ] Baza danych zaktualizowana (wszystkie memy mają hashe)
- [ ] Detekcja duplikatów działa podczas uploadu
- [ ] Pojedynki są zapisywane w tabeli `battles`
- [ ] Rating_history aktualizuje się po każdym głosowaniu
- [ ] Strona statystyk wyświetla się poprawnie
- [ ] Wykres zmian ratingu działa (dla memów z >1 pojedynkiem)
- [ ] Historia pojedynków pokazuje przeciwników
- [ ] Link "Zobacz" w rankingu prowadzi do statystyk
- [ ] Wszystkie memy mają wpisy w rating_history

## Problemy i rozwiązania

### Problem: "Class SQLite3 not found"
**Rozwiązanie**: Użyj `run.bat` lub uruchom z `php -S localhost:8088 -c php.ini`

### Problem: Brak wykresu na stronie statystyk
**Rozwiązanie**: Mem musi mieć >1 wpis w rating_history. Zagłosuj kilka razy.

### Problem: Duplikaty nie są wykrywane
**Rozwiązanie**: Uruchom `update_existing_db.php` aby dodać hashe do starych memów

### Problem: Brak danych w battles
**Rozwiązanie**: Zagłosuj na kilka memów, dopiero wtedy pojawią się dane

### Problem: Pusty wykres
**Rozwiązanie**: Odśwież stronę lub wyczyść cache przeglądarki

## Dodatkowe zapytania SQL do testowania

### Znajdź memy bez hashu:
```sql
SELECT id, filename FROM memes WHERE file_hash IS NULL OR file_hash = '';
```

### Pokaż ostatnie 10 pojedynków:
```sql
SELECT 
    b.id,
    m1.filename as winner,
    m2.filename as loser,
    b.battle_date
FROM battles b
JOIN memes m1 ON b.winner_id = m1.id
JOIN memes m2 ON b.loser_id = m2.id
ORDER BY b.battle_date DESC
LIMIT 10;
```

### Mem z największą zmianą ratingu:
```sql
SELECT 
    m.id,
    m.filename,
    MAX(rh.rating) - MIN(rh.rating) as rating_change
FROM memes m
JOIN rating_history rh ON m.id = rh.meme_id
GROUP BY m.id
ORDER BY rating_change DESC
LIMIT 1;
```
