const API_BASE_URL = 'https://monpetitpari.fr/api'; async function apiCall(endpoint, method = 'GET', data = null) { const options = { method: method, headers: { 'Content-Type': 'application/json' } }; const token = localStorage.getItem('authToken'); if (token) options.headers['Authorization'] = `Bearer ${token}`; if (data && (method === 'POST' || method === 'PUT')) { options.body = JSON.stringify(data); } const response = await fetch(`${API_BASE_URL}/${endpoint}`, options); const result = await response.json(); if (!response.ok) throw new Error(result.error || 'Erreur serveur'); return result; } window.onload = function() { const user = JSON.parse(localStorage.getItem('currentUser')); if (!user || user.role !== 'admin') { window.location.href = 'index.html'; return; } document.getElementById('adminName').textContent = user.username; loadAdminStats(); }; function logout() { localStorage.removeItem('currentUser'); localStorage.removeItem('authToken'); window.location.href = 'index.html'; } function showAdminSection(sectionId) { document.querySelectorAll('.section').forEach(s => s.classList.remove('active')); document.querySelectorAll('.sidebar li').forEach(l => l.classList.remove('active')); document.getElementById(sectionId).classList.add('active'); event.target.classList.add('active'); if (sectionId === 'matches') loadMatchesTable(); if (sectionId === 'users') loadUsersTable(); if (sectionId === 'results') loadResultsDropdown(); } async function loadAdminStats() { try { const users = await apiCall('users.php'); const matches = await apiCall('matches.php'); const players = await apiCall('players.php'); document.getElementById('totalUsers').textContent = users.users ? users.users.length : 0; document.getElementById('totalMatches').textContent = matches.matches ? matches.matches.length : 0; document.getElementById('totalPlayers').textContent = players.players ? players.players.length : 0; } catch (error) { console.error('Erreur stats admin', error); } } async function loadMatchesTable() { try { const result = await apiCall('matches.php'); const tbody = document.getElementById('matchesTable'); if(!tbody) return; tbody.innerHTML = ''; if(result.matches) { result.matches.forEach(match => { const row = document.createElement('tr'); // Gestion de l'affichage selon le format retourné par getAllMatches() const p1Name = match.p1_name || (match.player1 && match.player1.name) || 'Inconnu'; const p2Name = match.p2_name || (match.player2 && match.player2.name) || 'Inconnu'; row.innerHTML = ` ${match.round} ${p1Name} ${p2Name} ${new Date(match.match_date || match.date).toLocaleDateString('fr-FR')} ${match.status === 'completed' ? 'Terminé' : 'À venir'} `; tbody.appendChild(row); }); } } catch(e) { console.error(e); } } async function loadUsersTable() { try { const result = await apiCall('users.php'); const tbody = document.getElementById('usersTable'); if(!tbody) return; tbody.innerHTML = ''; if(result.users) { result.users.forEach(user => { const row = document.createElement('tr'); row.innerHTML = ` ${user.id} ${user.username} ${user.email} ${user.role} ${user.points || 0} `; tbody.appendChild(row); }); } } catch(e) { console.error(e); } } async function deleteUser(id) { if (confirm('Êtes-vous sûr de vouloir supprimer cet utilisateur ?')) { try { await apiCall(`users.php?id=${id}`, 'DELETE'); loadUsersTable(); loadAdminStats(); } catch(e) { alert(e.message); } } } async function deleteMatch(id) { if (confirm('Êtes-vous sûr de vouloir supprimer ce match ?')) { try { await apiCall(`matches.php?id=${id}`, 'DELETE'); loadMatchesTable(); loadAdminStats(); } catch(e) { alert(e.message); } } } async function loadResultsDropdown() { try { const result = await apiCall('matches.php'); const select = document.getElementById('resultMatch'); if(!select) return; select.innerHTML = ''; window.currentAdminMatches = result.matches || []; window.currentAdminMatches.filter(m => m.status !== 'completed').forEach(match => { const option = document.createElement('option'); option.value = match.id; const p1Name = match.p1_name || (match.player1 && match.player1.name); const p2Name = match.p2_name || (match.player2 && match.player2.name); option.textContent = `${match.round} : ${p1Name} vs ${p2Name}`; select.appendChild(option); }); updateWinnerSelect(); select.addEventListener('change', updateWinnerSelect); } catch(e) { console.error(e); } } function updateWinnerSelect() { const select = document.getElementById('resultMatch'); const winnerSelect = document.getElementById('resultWinner'); if(select.selectedIndex === -1 || !window.currentAdminMatches) return; const matchId = parseInt(select.value); const match = window.currentAdminMatches.find(m => m.id === matchId); winnerSelect.innerHTML = ''; if (match) { const p1Id = match.p1_id || (match.player1 && match.player1.id); const p1Name = match.p1_name || (match.player1 && match.player1.name); const p2Id = match.p2_id || (match.player2 && match.player2.id); const p2Name = match.p2_name || (match.player2 && match.player2.name); winnerSelect.innerHTML = ` `; } } async function updateResult() { const matchId = parseInt(document.getElementById('resultMatch').value); const winnerId = parseInt(document.getElementById('resultWinner').value); const score = document.getElementById('resultScore').value; try { await apiCall('results.php', 'POST', { match_id: matchId, winner_id: winnerId, score: score }); alert('Résultat mis à jour avec succès ! Les points ont été distribués.'); loadResultsDropdown(); } catch (error) { alert(error.message); } }