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'); if (window.event && window.event.target) { window.event.target.closest('li').classList.add('active'); } if (sectionId === 'matches') { loadMatchesTable(); loadPlayersDropdowns(); } 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('player.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 loadPlayersDropdowns() { try { const result = await apiCall('player.php'); const p1Select = document.getElementById('matchPlayer1'); const p2Select = document.getElementById('matchPlayer2'); if (!p1Select || !p2Select) return; p1Select.innerHTML = ''; p2Select.innerHTML = ''; if (result.players) { result.players.forEach(p => { const opt1 = document.createElement('option'); opt1.value = p.id; opt1.textContent = `${p.name} (#${p.ranking})`; p1Select.appendChild(opt1); const opt2 = document.createElement('option'); opt2.value = p.id; opt2.textContent = `${p.name} (#${p.ranking})`; p2Select.appendChild(opt2); }); } } catch (e) { console.error('Erreur chargement joueurs:', e); } } async function addMatch() { const round = document.getElementById('matchRound').value; const player1_id = parseInt(document.getElementById('matchPlayer1').value); const player2_id = parseInt(document.getElementById('matchPlayer2').value); const match_date = document.getElementById('matchDate').value; const court = document.getElementById('matchCourt').value || 'Court Philippe-Chatrier'; if (!match_date || isNaN(player1_id) || isNaN(player2_id)) { alert('Veuillez remplir tous les champs requis.'); return; } if (player1_id === player2_id) { alert('Veuillez sélectionner deux joueurs différents.'); return; } try { await apiCall('matches.php', 'POST', { round, player1_id, player2_id, match_date, court }); alert('Match ajouté avec succès !'); loadMatchesTable(); loadAdminStats(); } catch (error) { alert(error.message); } } async function addPlayer() { const name = document.getElementById('playerName').value.trim(); const nationality = document.getElementById('playerNationality').value.trim(); const age = parseInt(document.getElementById('playerAge').value); const handedness = document.getElementById('playerHandedness').value; const ranking = parseInt(document.getElementById('playerRanking').value); if (!name || !nationality || isNaN(age) || isNaN(ranking)) { alert('Veuillez remplir tous les champs requis.'); return; } const player_code = name.toLowerCase().replace(/[^a-z0-9]/g, ''); try { await apiCall('player.php', 'POST', { player_code, name, nationality, age, handedness, ranking, points: 0, clay_win_rate: 0.75, hard_win_rate: 0.70, grass_win_rate: 0.65 }); alert('Joueur ajouté avec succès !'); document.getElementById('playerName').value = ''; document.getElementById('playerNationality').value = ''; document.getElementById('playerAge').value = ''; document.getElementById('playerRanking').value = ''; loadAdminStats(); } catch (error) { alert(error.message); } } 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'); 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); } }