# Plan implementacji systemu statystyk głosowań

## Cel projektu
Rozszerzenie bazy danych o szczegółowe zbieranie statystyk głosowań:
1. **Historia pojedynków** - zapis każdego pojedynku (który mem z którym walczył i wynik)
2. **Historia rankingu** - śledzenie zmian ratingu dla każdego mema w czasie
3. **Unikalne ID memów** - identyfikacja memów bazująca na hashach plików (SHA-256), żeby uniknąć duplikatów

## Struktura bazy danych

### Tabela 1: memes (zmodyfikowana)
```sql
CREATE TABLE memes (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    filename TEXT NOT NULL,
    file_hash TEXT UNIQUE NOT NULL,  -- SHA-256 hash pliku (unikatowy identyfikator)
    rating INTEGER DEFAULT 1200,
    wins INTEGER DEFAULT 0,
    losses INTEGER DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
```

### Tabela 2: battles (nowa)
```sql
CREATE TABLE battles (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    winner_id INTEGER NOT NULL,
    loser_id INTEGER NOT NULL,
    winner_rating_before INTEGER NOT NULL,
    winner_rating_after INTEGER NOT NULL,
    loser_rating_before INTEGER NOT NULL,
    loser_rating_after INTEGER NOT NULL,
    battle_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (winner_id) REFERENCES memes(id) ON DELETE CASCADE,
    FOREIGN KEY (loser_id) REFERENCES memes(id) ON DELETE CASCADE
);
```

### Tabela 3: rating_history (nowa)
```sql
CREATE TABLE rating_history (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    meme_id INTEGER NOT NULL,
    rating INTEGER NOT NULL,
    rank_position INTEGER,  -- pozycja w rankingu w danym momencie
    recorded_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (meme_id) REFERENCES memes(id) ON DELETE CASCADE
);
```

### Indeksy dla wydajności
```sql
CREATE INDEX idx_battles_winner ON battles(winner_id);
CREATE INDEX idx_battles_loser ON battles(loser_id);
CREATE INDEX idx_battles_date ON battles(battle_date);
CREATE INDEX idx_rating_history_meme ON rating_history(meme_id);
CREATE INDEX idx_rating_history_date ON rating_history(recorded_at);
CREATE INDEX idx_memes_hash ON memes(file_hash);
```

## Plik: db_schema_update.php
Nowy plik do aktualizacji schematu bazy danych.

## Plik: db.php (zmodyfikowany)
Dodanie nowych tabel i indeksów.

## Plik: functions.php (zmodyfikowany)
Dodanie funkcji:
- `calculateFileHash($filepath)` - oblicza SHA-256 hash pliku
- `checkDuplicateByHash($db, $hash)` - sprawdza czy mem o danym hashu już istnieje
- `recordBattle($db, $winnerId, $loserId, $oldRatingW, $newRatingW, $oldRatingL, $newRatingL)` - zapisuje pojedynek
- `updateRatingHistory($db, $memeId, $newRating)` - aktualizuje historię ratingu
- `getMemeHistory($db, $memeId)` - pobiera historię ratingu dla danego mema
- `getMemeBattles($db, $memeId, $limit)` - pobiera historię pojedynków dla mema

## Plik: vote.php (zmodyfikowany)
Rozszerzenie o zapisywanie historii pojedynków i aktualizację historii ratingu.

## Plik: upload.php (zmodyfikowany)
Dodanie obliczania hashu pliku przed uploadem i sprawdzania duplikatów.

## Plik: meme_stats.php (nowy)
Strona ze statystykami dla pojedynczego mema:
- Wykres zmian ratingu w czasie
- Lista ostatnich pojedynków
- Statystyki win/loss ratio

## Etapy implementacji

1. ✅ Utworzenie planu implementacji
2. ⏳ Utworzenie skryptu migracji bazy danych (db_schema_update.php)
3. ⏳ Modyfikacja db.php - dodanie nowych tabel
4. ⏳ Rozszerzenie functions.php o nowe funkcje
5. ⏳ Modyfikacja upload.php - system hashowania i detekcja duplikatów
6. ⏳ Modyfikacja vote.php - zapisywanie historii pojedynków
7. ⏳ Utworzenie meme_stats.php - strona statystyk
8. ⏳ Testowanie funkcjonalności
