<?php
/**
 * match_integration_example.php
 * 
 * Przykład integracji endpoint'u ustawień z systemem meczy
 * Pokazuje jak pracować ze snapshot'ami
 * 
 * Nie uruchamiaj ten plik bezpośrednio - to jest tylko przykład!
 */

// ===== PRZYKŁAD 1: Startup gry - pobierz snapshot =====
echo "PRZYKŁAD 1: Pobierz snapshot na start meczu\n";
echo "=============================================\n\n";

/*
require_once __DIR__ . '/api/DisciplineSettingsModel.php';

$model = new DisciplineSettingsModel($pdo);

// Pobierz snapshot (bieżąca wersja)
$snapshot = $model->getSnapshot('ping-pong');

echo "Snapshot:\n";
echo json_encode($snapshot, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";

// Zwróć do gry (JavaScript)
echo "Gra otrzymuje:\n";
echo "- Reguły (pointsToWin, setsToWin, itd.)\n";
echo "- Wersję (do logów)\n";
echo "- Timestamp (do auditowania)\n";
*/

// ===== PRZYKŁAD 2: Zapis snapshot'u w meczu =====
echo "PRZYKŁAD 2: Zapisz snapshot w bazie danych\n";
echo "===========================================\n\n";

/*
// W momencie startu meczu
$matchData = [
    'team1_id' => 1,
    'team2_id' => 2,
    'status' => 'live',
    'startTime' => date('Y-m-d H:i:s'),
    'settingsSnapshot' => json_encode($snapshot)
];

// INSERT
$stmt = $pdo->prepare(
    "INSERT INTO matches 
     (Team1_ID, Team2_ID, Status, StartTime, SettingsSnapshot)
     VALUES (?, ?, ?, ?, ?)"
);
$stmt->execute([
    $matchData['team1_id'],
    $matchData['team2_id'],
    $matchData['status'],
    $matchData['startTime'],
    $matchData['settingsSnapshot']
]);

echo "Mecz zapisany z snapshot'em ustawień v" . $snapshot['settingsVersion'] . "\n\n";
*/

// ===== PRZYKŁAD 3: Walidacja wyniku przy użyciu snapshot'u =====
echo "PRZYKŁAD 3: Waliduj wynik korzystając ze snapshot'u\n";
echo "====================================================\n\n";

/*
// Pobierz mecz
$stmt = $pdo->prepare("SELECT * FROM matches WHERE id = ?");
$stmt->execute([123]);
$match = $stmt->fetch(PDO::FETCH_ASSOC);

// Dekoduj snapshot ustawień z momentu startu
$settingsSnapshot = json_decode($match['SettingsSnapshot'], true);

echo "Gra skończyła się wynikiem: 2:1 (w setach)\n";
echo "Snapshot reguł z startu:\n";
echo "  - pointsToWin: " . $settingsSnapshot['rules']['pointsToWin'] . "\n";
echo "  - setsToWin: " . $settingsSnapshot['rules']['setsToWin'] . "\n\n";

// Walidacja
if ($match['score'] !== '2:1') {
    echo "❌ Błędny wynik\n";
} else if ($settingsSnapshot['settingsVersion'] !== $match['settingsVersion']) {
    echo "⚠️ Ustawienia gry nie zgadzają się z bieżącymi\n";
    echo "   Ale to OK - snapshot z momentu startu się liczył\n";
} else {
    echo "✅ Wynik prawidłowy\n";
}
*/

// ===== PRZYKŁAD 4: Migracja istniejących meczy =====
echo "PRZYKŁAD 4: Migracja meczy na nowe ustawienia\n";
echo "==============================================\n\n";

/*
$model = new DisciplineSettingsModel($pdo);

// Pobierz wszystkie istniejące mecze
$stmt = $pdo->query("SELECT id, SettingsSnapshot FROM matches WHERE SettingsSnapshot IS NULL");
$oldMatches = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo "Znaleziono " . count($oldMatches) . " meczy bez snapshot'u\n";

// Dodaj snapshot do każdego starego meczu
foreach ($oldMatches as $match) {
    // Domniemane ustawienia (np. defaults)
    $snapshot = $model->getSnapshot('ping-pong', 1);
    
    $updateStmt = $pdo->prepare("UPDATE matches SET SettingsSnapshot = ? WHERE id = ?");
    $updateStmt->execute([json_encode($snapshot), $match['id']]);
}

echo "Migracja ukończona\n\n";
*/

// ===== PRZYKŁAD 5: Porównanie zmiany ustawień =====
echo "PRZYKŁAD 5: Porównaj zmianę ustawień\n";
echo "====================================\n\n";

/*
require_once __DIR__ . '/api/DisciplineSettingsService.php';

$model = new DisciplineSettingsModel($pdo);
$service = new DisciplineSettingsService($model);

// Pobierz bieżące ustawienia
$current = $service->getSettingsForAPI('ping-pong');

// Pobierz dane z formularza (admin zmienia ustawienia)
$newInput = [
    'rules' => [
        'pointsToWin' => 21,  // było 11
        'setsToWin' => 3,
        'serveRotation' => 2
    ],
    'customization' => $current['customization']
];

// Porównaj przed zmianą
$diff = $service->compareVersions(
    $current['rules'],
    $newInput['rules']
);

echo "Zmiany ustawień:\n";
echo json_encode($diff, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";

// Jeśli są istotne zmiany, powiadom graczy
if (!empty($diff)) {
    echo "Powiadomienie dla graczy:\n";
    echo "Ustawienia ping-ponga zmienią się o " . date('Y-m-d H:i') . "\n";
    foreach ($diff as $field => $change) {
        echo "  - $field: " . $change['old'] . " → " . $change['new'] . "\n";
    }
}
*/

// ===== PRZYKŁAD 6: Analytics - wpływ zmian na gry =====
echo "PRZYKŁAD 6: Analytics - wpływ zmian na gry\n";
echo "==========================================\n\n";

/*
// Statystyki meczy przed zmianą
$stmt = $pdo->query(
    "SELECT COUNT(*) as count FROM matches 
     WHERE discipline = 'ping-pong' 
     AND settingsVersion = 1 
     AND status = 'end'"
);
$statsV1 = $stmt->fetch(PDO::FETCH_ASSOC);

echo "Ze starymi ustawieniami (v1): " . $statsV1['count'] . " meczy\n";

// Po zmianie
$stmt = $pdo->query(
    "SELECT COUNT(*) as count FROM matches 
     WHERE discipline = 'ping-pong' 
     AND settingsVersion = 2 
     AND status = 'end'"
);
$statsV2 = $stmt->fetch(PDO::FETCH_ASSOC);

echo "Z nowymi ustawieniami (v2): " . $statsV2['count'] . " meczy\n";

// Porównanie czasu trwania meczu
$stmt = $pdo->query(
    "SELECT AVG(TIMESTAMPDIFF(MINUTE, StartTime, EndTime)) as avg_duration
     FROM matches 
     WHERE discipline = 'ping-pong' 
     AND status = 'end' 
     AND settingsVersion = 1"
);
$durationV1 = $stmt->fetch(PDO::FETCH_ASSOC);

$stmt = $pdo->query(
    "SELECT AVG(TIMESTAMPDIFF(MINUTE, StartTime, EndTime)) as avg_duration
     FROM matches 
     WHERE discipline = 'ping-pong' 
     AND status = 'end' 
     AND settingsVersion = 2"
);
$durationV2 = $stmt->fetch(PDO::FETCH_ASSOC);

echo "\nŚredni czas meczu:\n";
echo "  v1: " . round($durationV1['avg_duration'], 2) . " minut\n";
echo "  v2: " . round($durationV2['avg_duration'], 2) . " minut\n";

if ($durationV2['avg_duration'] > $durationV1['avg_duration']) {
    echo "  → Mecze są dłuższe z nowymi ustawieniami\n";
} else if ($durationV2['avg_duration'] < $durationV1['avg_duration']) {
    echo "  → Mecze są szybsze z nowymi ustawieniami\n";
}
*/

// ===== PRZYKŁAD 7: Rollback do starszej wersji =====
echo "PRZYKŁAD 7: Przywróć starsze ustawienia\n";
echo "======================================\n\n";

/*
// Pobierz starszą wersję
$oldSettings = $model->getSettingsByVersion('ping-pong', 1);

if ($oldSettings) {
    // Przepisz back na obecne
    $input = [
        'pointsToWin' => $oldSettings['pointsToWin'],
        'setsToWin' => $oldSettings['setsToWin'],
        'serveRotation' => $oldSettings['serveRotation'],
        'specialRules' => $oldSettings['specialRules'],
        'customization' => json_decode($oldSettings['customization'], true)
    ];
    
    $result = $model->updateSettings('ping-pong', $input, $adminId);
    
    echo "✅ Przywrócono ustawienia z wersji " . $oldSettings['settingsVersion'] . "\n";
    echo "   Nowa wersja: " . $result['settingsVersion'] . "\n";
}
*/

// ===== PRZYKŁAD 8: Testowanie w grze =====
echo "PRZYKŁAD 8: Kod JavaScript - testowanie snapshot'u\n";
echo "===================================================\n\n";

?>

<script>
// Pobierz snapshot z backendu
async function testSettingsSnapshot() {
    try {
        const response = await fetch(
            '/api/discipline-settings.php?discipline=ping-pong&snapshot=true'
        );
        const result = await response.json();
        
        if (result.success) {
            const snapshot = result.snapshot;
            
            console.log('🏓 Ping-Pong Settings Snapshot:');
            console.log('Wersja ustawień:', snapshot.settingsVersion);
            console.log('Timestamp snapshot:', snapshot.snapshotTimestamp);
            console.log('Reguły gry:', snapshot.rules);
            console.log('Personalizacja UI:', snapshot.customization);
            
            // Uruchom grę z tymi ustawieniami
            return snapshot;
        } else {
            console.error('Błąd pobierania snapshot:', result.error);
        }
    } catch (error) {
        console.error('Błąd sieciowy:', error);
    }
}

// Wyślij wynik meczu z snapshot'em wersji
function submitMatchResult(matchData) {
    // matchData powinien zawierać:
    // - score: "3:2"
    // - settingsVersion: 1 (z snapshot'u)
    // - snapshotTimestamp: "..." (dla auditowania)
    
    return fetch('/api/matches_sync.php', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(matchData)
    });
}

// Test
// testSettingsSnapshot().then(snapshot => {
//     console.log('Snapshot gotowy do uruchomienia gry');
//     console.log(snapshot);
// });
</script>

<?php

// ===== PODSUMOWANIE =====
echo "\nPODSUMOWANIE\n";
echo "============\n\n";
echo "Snapshot to kopja ustawień z momentu startu meczu.\n";
echo "Pozwala:\n";
echo "  ✅ Starym meczom zachować stare reguły\n";
echo "  ✅ Nowym meczom używać nowych reguł\n";
echo "  ✅ Trackować jakie reguły były w każdym meczu\n";
echo "  ✅ Porównywać statystyki między wersjami\n";
echo "  ✅ Auditować zmiany\n\n";
echo "Bez snapshot'u:\n";
echo "  ❌ Admin zmienia ustawienia\n";
echo "  ❌ Wszystkie stare mecze 'widzą' nowe reguły\n";
echo "  ❌ Historia grana jest niepewna\n\n";
?>
