using Gameboard.ShogiUI.Sockets.Models; using Gameboard.ShogiUI.Sockets.Repositories; using Gameboard.ShogiUI.Sockets.ServiceModels.Socket.Messages; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers.ClientActionHandlers { public interface IMoveHandler { Task Handle(MoveRequest request, string userName); } public class MoveHandler : IMoveHandler { private readonly IActiveSessionManager boardManager; private readonly IGameboardManager gameboardManager; private readonly ISocketConnectionManager communicationManager; public MoveHandler( IActiveSessionManager boardManager, ISocketConnectionManager communicationManager, IGameboardManager gameboardManager) { this.boardManager = boardManager; this.gameboardManager = gameboardManager; this.communicationManager = communicationManager; } public async Task Handle(MoveRequest request, string userName) { Move moveModel; if (request.Move.PieceFromCaptured.HasValue) { moveModel = new Move(request.Move.PieceFromCaptured.Value, request.Move.To); } else { moveModel = new Move(request.Move.From!, request.Move.To, request.Move.IsPromotion); } var board = boardManager.Get(request.GameName); if (board == null) { // TODO: Find a flow for this var response = new MoveResponse(ServiceModels.Socket.Types.ClientAction.Move) { Error = $"Game isn't loaded. Send a message with the {ServiceModels.Socket.Types.ClientAction.LoadGame} action first." }; await communicationManager.BroadcastToPlayers(response, userName); } //var moveSuccess = board.Move(boardMove); //if (moveSuccess) //{ // await gameboardRepository.PostMove(request.GameName, new PostMove(moveModel.ToApiModel())); // var boardState = new BoardState(board); // var response = new Service.Messages.MoveResponse(Service.Types.ClientAction.Move) // { // GameName = request.GameName, // PlayerName = userName, // BoardState = boardState.ToServiceModel() // }; // await communicationManager.BroadcastToGame(request.GameName, response); //} //else //{ // var response = new Service.Messages.MoveResponse(Service.Types.ClientAction.Move) // { // Error = "Invalid move." // }; // await communicationManager.BroadcastToPlayers(response, userName); //} } } }