async function j(url, opts={}){ const r = await fetch(url, opts); if (!r.ok) { const t = await r.text().catch(()=>''); throw new Error(`HTTP ${r.status} ${t}`); } const ct = r.headers.get('content-type')||''; return ct.includes('application/json') ? r.json() : r.text(); } const $ = (s)=>document.querySelector(s); async function loadTournaments(){ const data = await j('/api/tournaments'); const opts = [''] .concat(data.map(t=>``)); $('#t-list').innerHTML = opts.join(''); $('#p-tournament').innerHTML = opts.join(''); $('#m-tournament').innerHTML = opts.join(''); $('#tournaments-box').textContent = JSON.stringify(data, null, 2); const tid = Number($('#p-tournament').value || data[0]?.id || 0); if (tid) await refreshParticipants(tid); } async function refreshParticipants(tid){ try{ const data = await j(`/api/tournaments/${tid}/participants`); $('#participants-box').textContent = JSON.stringify(data, null, 2); }catch(e){ $('#participants-box').textContent = 'Erreur: '+e.message; } } async function createTournament(e){ e.preventDefault(); const payload = { name: $('#t-name').value.trim(), location: $('#t-location').value.trim(), start_date: $('#t-start').value, end_date: $('#t-end').value }; try{ await j('/api/tournaments', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(payload) }); $('#t-create-status').textContent = 'OK ✅'; await loadTournaments(); }catch(err){ $('#t-create-status').textContent = err.message; } } async function deleteTournament(){ const id = Number($('#t-list').value||'0'); if (!id) return; if (!confirm('Supprimer le tournoi #' + id + ' ?')) return; try{ await j(`/api/tournaments/${id}`, { method:'DELETE' }); await loadTournaments(); }catch(e){ alert(e.message); } } async function createParticipant(e){ e.preventDefault(); const tid = Number($('#p-tournament').value||'0'); const name = $('#p-name').value.trim(); if (!tid || !name) return; try{ await j('/api/participants', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({ tournament_id: tid, full_name: name }) }); $('#p-create-status').textContent = 'OK ✅'; await refreshParticipants(tid); }catch(e){ $('#p-create-status').textContent = e.message; } } async function scoreMatch(e){ e.preventDefault(); const id = Number($('#m-id').value||'0'); const sa = Number($('#m-score-a').value||'0'); const sb = Number($('#m-score-b').value||'0'); const finished = $('#m-finished').checked; if (!id) return; try{ await j(`/api/matches/${id}/score`, { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({ score_a: sa, score_b: sb, finished }) }); $('#m-score-status').textContent = 'OK ✅'; }catch(e){ $('#m-score-status').textContent = e.message; } } async function ping(){ try{ await j('/api/health'); $('#health').textContent = 'OK ✅'; } catch(e){ $('#health').textContent = e.message; } } document.addEventListener('DOMContentLoaded', () => { $('#t-create-form').addEventListener('submit', createTournament); $('#btn-del-t').addEventListener('click', deleteTournament); $('#btn-refresh-t').addEventListener('click', loadTournaments); $('#p-create-form').addEventListener('submit', createParticipant); $('#m-score-form').addEventListener('submit', scoreMatch); $('#btn-health').addEventListener('click', ping); loadTournaments(); ping(); });