// Fonction et variables essentiel const activePlayerLabel = document.getElementById('active-player-name'); let gameData = null; let currentPlayer = null; let playersData = []; async function SqlRequest(action, params = {}) { try { const response = await fetch('RequestsHandler.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: action, params: params }) }); const resultat = await response.json(); if (resultat.success) { return resultat; } else { console.error("Erreur :", resultat.error); } } catch (erreur) { console.error("Erreur de communication :", erreur); } } function startRealTimeSync(gameId) { const evtSource = new EventSource(`stream.php?game_id=${gameId}`); evtSource.onmessage = function(event) { const data = JSON.parse(event.data); // On met à jour nos variables globales avec les données fraîches du serveur gameData = data.game; playersData = data.players; console.log("🔄 Table synchronisée"); // On rafraîchit l'affichage sans recharger la page updateClientInterface(); }; evtSource.onerror = function() { console.log("⚠️ Connexion perdue, tentative de reconnexion..."); }; } // Fonction pour ouvrir le menu administrateur function toggleAdminMenu() { const menu = document.getElementById('admin-menu'); menu.classList.toggle('active'); } // Fonctions pour démarrer la page window.onload = async function() { const urlParams = new URLSearchParams(window.location.search); const gId = urlParams.get('game_id'); const result = await SqlRequest('is_admin'); console.log("Vérification des droits administrateur :", result); if (!result.is_admin) { alert("Vous n'avez pas les droits pour accéder à cette page."); window.location.href = 'index.html'; } gameData = await getGame(); playersData = await getPlayers(); document.getElementById('title_page').textContent = "Vue Administrateur - " + gameData.name + " - PokerPaf"; updateClientInterface(); startRealTimeSync(gId); } async function updateClientInterface() { setupPlayers(); getCurrentPlayer(); refreshAdminPanel(); activePlayerLabel.textContent = `${currentPlayer.name} (${currentPlayer.money} 🪙)`; } function refreshAdminPanel() { const adminPanel = document.getElementById('admin-lock-control'); if (!adminPanel) return; let statsItem = document.getElementById('stat-item'); if (statsItem) { statsItem.innerHTML = ` MISE ACTUELLE: ${gameData.last_bet}
POT ACTUEL ${gameData.pot} `; } const isLocked = Number(gameData.is_locked) === 1; let lockSwitch = document.getElementById('lock-switch'); // On ne crée le HTML que s'il n'existe pas encore if (!lockSwitch) { adminPanel.innerHTML = `
Autoriser le jeu :
`; } else { // Si le switch existe, on met à jour son état SEULEMENT si l'admin ne le touche pas if (document.activeElement !== lockSwitch) { lockSwitch.checked = !isLocked; } } } // Fonction pour envoyer l'ordre au serveur async function toggleGameLock(checkbox) { const status = checkbox.checked ? 0 : 1; // 1. On change d'abord le statut de verrouillage const response = await SqlRequest('toggle_lock', { game_id: gameData.id, status: status }); if (response && response.success) { // 2. Si on vient de DÉVERROUILLER (status 0), on reset le joueur actif if (status === 0) { console.log("🔓 Déverrouillage : Réinitialisation au joueur après le Dealer..."); await resetToPostDealerPlayer(); } } else { alert("Erreur lors du changement de statut"); checkbox.checked = !checkbox.checked; } } async function resetToPostDealerPlayer() { // On cherche l'index du dealer dans playersData const dealerIndex = playersData.findIndex(p => Number(p.is_dealer) === 1); // Le premier joueur à parler est (dealer + 1), mais on doit gérer la boucle du tableau // et sauter les joueurs qui se sont couchés (is_folded) let nextIndex = (dealerIndex + 1) % playersData.length; // Sécurité : on cherche le prochain qui n'est pas couché let attempts = 0; while (playersData[nextIndex].is_folded && attempts < playersData.length) { nextIndex = (nextIndex + 1) % playersData.length; attempts++; } const firstPlayerId = playersData[nextIndex].id; // On envoie l'ordre au serveur de mettre ce joueur en actif await SqlRequest('set_current_player', { game_id: gameData.id, player_id: firstPlayerId }); } async function setupPlayers() { const PokerTable = document.getElementById('table'); PokerTable.innerHTML = ''; // Clear existing players let newHtml = ``; newHtml += `
${gameData.pot}
Mise: ${gameData.last_bet}
`; playersData.forEach((player, index) => { // On s'assure de comparer avec le nombre 1 car la BDD renvoie souvent des strings ou des entiers const isDealer = Number(player.is_dealer) === 1; newHtml += `
${isDealer ? '
D
' : ''} J${index + 1} : ${player.name} ${player.money} 🪙
Mise: ${player.current_bet} 🪙
`; }); PokerTable.innerHTML = newHtml; } async function getGame(id = null) { let gameId; if (id === null) { const urlParams = new URLSearchParams(window.location.search); gameId = urlParams.get('game_id'); } else { gameId = id; } const response = await SqlRequest('getGame', { game_id: gameId }); if (response.success) { return response.game; } else { console.error("Erreur lors de la récupération du jeu :", response.error); return null; } } async function getPlayers() { const response = await SqlRequest('getPlayers', { game_id: gameData.id }); if (response.success) { return response.players; } else { console.error("Erreur lors de la récupération des joueurs :", response.error); return []; } } async function getCurrentPlayer() { currentPlayer = playersData.find(player => player.id === gameData.current_player_id); } // ----------------------------------------------------- // Fonctions pour les actions async function changePlayer(id = null) { if (id === null) { const response = await SqlRequest('next_player', { game_id: gameData.id, current_player_id: gameData.current_player_id }); if (response.success) { gameData.current_player_id = response.next_player_id; } else { console.error("Erreur lors du passage au joueur suivant :", response.error); } } else { const response = await SqlRequest('set_current_player', { game_id: gameData.id, player_id: id }); if (response.success) { gameData.current_player_id = id; } else { console.error("Erreur lors du changement de joueur :", response.error); } } updateClientInterface(); } async function playerFold() { const response = await SqlRequest('fold', { player_id: gameData.current_player_id }); if (response.success) { playersData = await getPlayers(); changePlayer(); } else { console.error("Erreur lors du fold :", response.error); } } async function playerRaise() { const betAmount = parseInt(document.getElementById('raise-amount').value); if (betAmount <= 0) { alert("Veuillez entrer un montant de mise valide."); return; } const amount = betAmount + gameData.last_bet - currentPlayer.current_bet; if (currentPlayer.money < amount) { alert("Vous n'avez pas assez d'argent pour cette mise."); return; } const response = await SqlRequest('raise', { game_id: gameData.id, player_id: gameData.current_player_id, amount: amount, current_bet: currentPlayer.current_bet }); if (response.success) { gameData.last_bet = currentPlayer.current_bet + amount; gameData.pot += amount; playersData = await getPlayers(); changePlayer(); } else { console.error("Erreur lors du raise :", response.error); } } async function playerFollow() { if (currentPlayer.current_bet >= gameData.last_bet) { changePlayer(); return; } let delta_amount = gameData.last_bet - currentPlayer.current_bet; if (currentPlayer.money < delta_amount) { delta_amount = currentPlayer.money; } const response = await SqlRequest('follow', { game_id: gameData.id, player_id: gameData.current_player_id, amount: delta_amount }); if (response.success) { gameData.pot += delta_amount; playersData = await getPlayers(); changePlayer(); } else { console.error("Erreur lors du follow :", response.error); } } async function playerAllIn() { const response = await SqlRequest('all_in', { game_id: gameData.id, player_id: gameData.current_player_id }); if (response.success) { gameData = await getGame(gameData.id); playersData = await getPlayers(); changePlayer(); } else { console.error("Erreur lors du all-in :", response.error); } } // ----------------------------------------------------- // Fonctions pour les actions administratives async function endGame() { await SqlRequest('update_game_status', { game_id: gameData.id, status: 'deciding' }); // 1. On vérifie si le panel existe déjà pour éviter les doublons if (document.querySelector('.win-overlay')) return; // 2. Création de l'overlay (on l'appelle win-overlay pour le CSS) const winOverlay = document.createElement('div'); winOverlay.className = 'win-overlay'; // 3. Création du panel blanc/bleu const winPanel = document.createElement('div'); winPanel.className = 'win-panel'; winPanel.innerHTML = `

🏆 La partie est terminée ! 🏆
Qui a gagné ?

`; winOverlay.appendChild(winPanel); // IMPORTANCE : On l'attache au BODY pour qu'il soit au-dessus de TOUT (même l'admin) document.body.appendChild(winOverlay); const area = document.getElementById('winner-buttons-area'); const playerElements = document.querySelectorAll('.player-slot'); playerElements.forEach(slot => { const id = slot.getAttribute('data-id'); // On récupère le nom proprement const nameElement = slot.querySelector('.player-name'); const name = nameElement ? nameElement.textContent.replace('VOUS', '').replace(':', '').trim() : "Joueur " + id; const btn = document.createElement('button'); btn.className = 'btn-win'; btn.innerText = name; btn.onclick = () => declareWinner(id); area.appendChild(btn); }); // On supprime la ligne qui cherchait 'end-game-screen' car winOverlay fait déjà le job } async function declareWinner(playerId) { console.log("Début de la procédure de victoire..."); // 1. Première requête : On définit le gagnant const resWinner = await SqlRequest('set_winner', { game_id: gameData.id, player_id: playerId }); if (resWinner && resWinner.success) { console.log("✅ Winner ID mis à jour en BDD"); // 2. Deuxième requête : On passe le statut à 'finished' // C'est cette requête qui va déclencher l'écran de victoire chez les joueurs via le SSE const resStatus = await SqlRequest('update_game_status', { game_id: gameData.id, status: 'finished' }); if (resStatus && resStatus.success) { console.log("✅ Statut passé à 'finished'"); // On met a jour les valeurs dans BDD const result = await SqlRequest('declare_winner', { game_id: gameData.id, player_id: playerId }); if (result && result.success){ // Mise à jour de l'interface Admin showAdminWinPanel(playerId); } else { console.log("Dommage tu y étais presque") } } } else { alert("Erreur lors de la mise à jour du gagnant."); } } // Fonction isolée pour l'affichage du panel admin (plus propre) function showAdminWinPanel(playerId) { const container = document.querySelector('.table-container'); if (container) container.classList.remove('blur-effect'); const winPanel = document.querySelector('.win-panel'); if (winPanel) { const winner = playersData.find(p => p.id == playerId); winPanel.innerHTML = `

🏆 Victoire de ${winner ? winner.name : 'Joueur'}

Le pot de ${gameData.pot} 🪙 lui a été attribué.

`; } } async function StartNewGame() { // 1. On force le verrouillage (status: 1) avant de relancer try { const response = await SqlRequest('toggle_lock', { game_id: gameData.id, status: 1 // 1 pour verrouillé }); if (response.success) { console.log("Partie verrouillée, relance en cours..."); // 2. On recharge la page pour démarrer la nouvelle main const response = await SqlRequest('update_game_status', { game_id: gameData.id, status: 'playing' }); if(response.success){ window.location.reload(); } else { console.error("Erreur de changement de status :", response.error); } } else { console.error("Erreur de verrouillage :", response.error); // Optionnel : on recharge quand même ou on affiche une alerte window.location.reload(); } } catch (error) { console.error("Erreur réseau :", error); window.location.reload(); } } async function addMoney() { let amount = parseInt(document.getElementById('money-amount').value); if (isNaN(amount)) { alert("Veuillez entrer un montant valide."); return; } const response = await SqlRequest('add_money', { player_id: gameData.current_player_id, amount: amount }); if (response.success) { playersData = await getPlayers(); updateClientInterface(); } else { console.error("Erreur lors de l'ajout d'argent :", response.error); } } async function deleteGame() { const confirmation = confirm("Êtes-vous sûr de vouloir supprimer cette partie ? Cette action est irréversible."); if (!confirmation) return; const response = await SqlRequest('delete_game', { game_id: gameData.id }); if (response.success) { console.log("Partie supprimée avec succès.", response.success); window.location.replace('index.html'); } else { console.error("Erreur lors de la suppression du jeu :", response.error); } }