import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable } from 'rxjs'; import { environment } from '../../environments/environment'; import { GameFull, GameState, GameStreamEvent, LegalMovesResponse, PlayerInfo } from '../models/game.models'; import { StreamHandlerService } from './stream-handler.service'; @Injectable({ providedIn: 'root' }) export class GameApiService { private readonly apiBase = environment.apiBaseUrl; private readonly wsBase = environment.wsBaseUrl; private readonly apiPath = environment.apiPath; private readonly streamHandler = inject(StreamHandlerService); constructor(private readonly http: HttpClient) {} createGame(): Observable { return this.http.post(`${this.apiBase}${this.apiPath}`, {}); } createGameVsBot(difficulty: 'easy' | 'medium' | 'hard' = 'medium'): Observable { const playerColor = Math.random() > 0.5 ? 'white' : 'black'; const playerInfo: PlayerInfo = { id: `player-${Date.now()}`, displayName: 'You' }; const botInfo: PlayerInfo = { id: `bot-${difficulty}`, displayName: `Bot (${difficulty})` }; const payload = playerColor === 'white' ? { white: playerInfo, black: botInfo } : { white: botInfo, black: playerInfo }; return this.http.post(`${this.apiBase}${this.apiPath}`, payload); } getGame(gameId: string): Observable { return this.http.get(`${this.apiBase}${this.apiPath}/${gameId}`); } makeMove(gameId: string, uci: string): Observable { return this.http.post(`${this.apiBase}${this.apiPath}/${gameId}/move/${uci}`, {}); } getLegalMoves(gameId: string, square?: string): Observable { let params = new HttpParams(); if (square) { params = params.set('square', square); } return this.http.get(`${this.apiBase}${this.apiPath}/${gameId}/moves`, { params }); } importFen(fen: string): Observable { return this.http.post(`${this.apiBase}${this.apiPath}/import/fen`, { fen }); } importPgn(pgn: string): Observable { return this.http.post(`${this.apiBase}${this.apiPath}/import/pgn`, { pgn }); } private resolveWsBase(): string { if (this.wsBase) { return this.wsBase; } const wsProtocol = window.location.protocol === 'https:' ? 'wss' : 'ws'; return `${wsProtocol}://${window.location.host}`; } streamGame(gameId: string): Observable { const wsUrl = `${this.resolveWsBase()}${this.apiPath}/${gameId}/stream`; const fallbackUrl = `${this.apiBase}${this.apiPath}/${gameId}/stream`; return this.streamHandler.createGameStream(wsUrl, fallbackUrl, gameId); } }