using Common.Library; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using GreadyPoang.DataLayer; using GreadyPoang.EntityLayer; using GreadyPoang.Services; using System.Collections.ObjectModel; using System.Diagnostics; namespace GreadyPoang.ViewModelLayer; public partial class RoundRunningViewModel : ObservableObject { public event EventHandler RebuildRequested; public RoundRunningViewModel() : base() { } public RoundRunningViewModel( IRepository roundsRepo, IRepository pointsRepo, IMethodSharingService sharingService, ICombinedRepository combined, IObjectMessageService objectMessage ) : base() { _roundsRepo = roundsRepo; _pointsRepo = pointsRepo; _sharingService = sharingService; _combined = combined; _objectMessage = objectMessage; RoundElements = new ObservableCollection(); BuilderObject = new(); } private readonly IRepository? _roundsRepo; private readonly IRepository _pointsRepo; private readonly IMethodSharingService _sharingService; private readonly ICombinedRepository _combined; private readonly IObjectMessageService _objectMessage; //private ObservableCollection _GameRoundList = new(); //private ObservableCollection _ParticipantList = new(); [ObservableProperty] private ObservableCollection roundElements; [ObservableProperty] private Collection playerColumns; [ObservableProperty] private RoundBuilderElement builderObject; public void TriggerRebuild() { // Trigga eventet RebuildRequested?.Invoke(this, EventArgs.Empty); } public ObservableCollection Get() { if (_objectMessage.CurrentGroup != null) { //CurrentGroup är satt från RoundStarting ViewModel Debug.WriteLine($"Chosen round: {_objectMessage.CurrentGroup.GameRoundId}"); if (RoundElements.Count > 0) { RoundElements.Clear(); } foreach (var item in _objectMessage.CurrentGroup.Elements) { RoundElements.Add(item); } // Räkna ut vem som är nästa spelare var nxt = nextPlayerElement(); // Aktuell spelare sätts som BuilderObject BuilderObject.ParticipantName = _objectMessage.CurrentGroup.Elements[nxt].ParticipantName; BuilderObject.GameRoundId = _objectMessage.CurrentGroup.GameRoundId; BuilderObject.ParticipantId = _objectMessage.CurrentGroup.Elements[nxt].ParticipantId; BuilderObject.Status = _objectMessage.CurrentGroup.Status; // Alla poängposter från samtliga spelare i rundan samlas ihop och fördelas per deltagare var localElements = _combined.roundBuilderElementsTotalById(_objectMessage.CurrentGroup.GameRoundId); FillupResultTable(localElements); foreach (var col in PlayerColumns) { RoundElements.FirstOrDefault(e => e.ParticipantId == col.PlayerId).GameRegPoints = col.PlayerPoints; } TriggerRebuild(); } return RoundElements; } [RelayCommand] private void StoreAndHandlePointsAsync() { var game = _roundsRepo.Get(BuilderObject.GameRoundId).GetAwaiter().GetResult(); var regNr = RoundElements.Count > 0 ? RoundElements.Max(e => e.GameRoundRegNr) + 1 : 1; if (game.GameStatus == GamePointStatus.New) { game.GameStatus = GamePointStatus.InProgress; regNr = regNr == 0 ? 1 : regNr; _roundsRepo.Save(game); } BuilderObject.Status = game.GameStatus; var points = BuilderObject.GameRegPoints; var newPoint = new GamePoint { ParticipantId = BuilderObject.ParticipantId, GameRoundId = BuilderObject.GameRoundId, GameDate = DateTime.Now, GameRoundRegNr = regNr, GameRegPoints = points }; var pointId = _pointsRepo?.Save(newPoint).GetAwaiter().GetResult(); // Uppdatera listan med element var tmpElements = _combined.roundBuilderElementsDbById(BuilderObject.GameRoundId); RoundElements.Clear(); foreach (var item in tmpElements) { item.Status = GamePointStatus.InProgress; RoundElements.Add(item); } // Uppdatera spelaren som skall spela nästa var nxt = nextPlayerElement(); BuilderObject.GameRegPoints = 0; BuilderObject.ParticipantName = RoundElements[nxt].ParticipantName; BuilderObject.ParticipantId = RoundElements[nxt].ParticipantId; BuilderObject.GameRoundId = RoundElements[0].GameRoundId; var localElements = _combined.roundBuilderElementsTotalById(BuilderObject.GameRoundId); FillupResultTable(localElements); foreach (var col in PlayerColumns) { RoundElements.FirstOrDefault(e => e.ParticipantId == col.PlayerId).GameRegPoints = col.PlayerPoints; } TriggerRebuild(); Shell.Current.GoToAsync("..").GetAwaiter().GetResult(); } private int nextPlayerElement() { for (int i = 0; i < RoundElements.Count; i++) { if (RoundElements[i].GameRoundRegNr == -1 || (i > 0 && (RoundElements[i - 1].GameRoundRegNr > RoundElements[i].GameRoundRegNr)) || (i == 0 && RoundElements[i].GameRoundRegNr < RoundElements[RoundElements.Count - 1].GameRoundRegNr)) return i; } return -1; } private void FillupResultTable(IEnumerable elements) { if (PlayerColumns != null) { PlayerColumns.Clear(); } else { PlayerColumns = new Collection(); } // if (elements.Any(g => g.GameRegPoints > 0)) if (BuilderObject.Status == GamePointStatus.InProgress) { PlayerColumn player = new PlayerColumn(); foreach (var element in elements) { player = PlayerColumns.FirstOrDefault(p => p.PlayerId == element.ParticipantId); if (player == null) { player = new PlayerColumn { PlayerName = element.ParticipantName, PlayerId = element.ParticipantId, PlayerPoints = 0 }; } if (element.GameRegPoints > 0) { player.Values.Add(element.GameRegPoints.ToString()); player.PlayerPoints += element.GameRegPoints; } //oldPart = element.ParticipantId; if (!PlayerColumns.Contains(player)) { PlayerColumns.Add(player); } } } else { Random slumper = new Random(); foreach (var element in elements) { var player = new PlayerColumn { PlayerName = element.ParticipantName, PlayerId = element.ParticipantId, PlayerPoints = 0 }; for (int i = 0; i < slumper.Next(6); i++) { player.Values.Add(slumper.Next(1, 10).ToString()); } PlayerColumns.Add(player); } } } }