import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable } from 'rxjs'; import { Tournament, TournamentList, RoundPairings } from '../models/tournament.models'; export interface CreateTournamentForm { name: string; nbRounds: number; clockLimitMinutes: number; clockIncrement: number; rated: boolean; } @Injectable({ providedIn: 'root' }) export class TournamentService { private readonly http = inject(HttpClient); private readonly base = '/api/tournament'; list(): Observable { return this.http.get(this.base); } get(id: string): Observable { return this.http.get(`${this.base}/${id}`); } create(form: CreateTournamentForm): Observable { const body = new URLSearchParams(); body.set('name', form.name); body.set('nbRounds', String(form.nbRounds)); body.set('clockLimit', String(form.clockLimitMinutes * 60)); body.set('clockIncrement', String(form.clockIncrement)); body.set('rated', String(form.rated)); return this.http.post(this.base, body.toString(), { headers: new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded' }) }); } start(id: string): Observable { return this.http.post(`${this.base}/${id}/start`, null); } joinWithBotToken(id: string, botToken: string): Observable { return this.http.post(`${this.base}/${id}/join`, null, { headers: new HttpHeaders({ Authorization: `Bearer ${botToken}` }) }); } roundPairings(id: string, round: number): Observable { return this.http.get(`${this.base}/${id}/round/${round}`); } }