using Common.Library; using GreadyPoang.DataLayer; using GreadyPoang.EntityLayer; using System.Collections.ObjectModel; using System.Diagnostics; namespace GreadyPoang.ViewModelLayer; public class RoundStartingViewModel : ViewModelBase { #region Constructors public RoundStartingViewModel() : base() { } public RoundStartingViewModel( IRepository roundsRepo, IRepository pointsRepo, IMethodSharingService sharingService, ICombinedRepository combined) : base() { _roundsRepo = roundsRepo; _pointsRepo = pointsRepo; _sharingService = sharingService; _combined = combined; _roundElements = new ObservableCollection(); } #endregion private GameRound? _GameRoundObject = new(); private ObservableCollection _GameRoundList = new(); private ObservableCollection _ParticipantList = new(); private readonly IRepository? _roundsRepo; private readonly IRepository _pointsRepo; private readonly IMethodSharingService _sharingService; private readonly ICombinedRepository _combined; private Participant _selectedItem; private ObservableCollection _roundElements; public ObservableCollection RoundElements { get { return _roundElements; } set { _roundElements = value; RaisePropertyChanged(nameof(RoundElements)); } } public Participant SelectedItem { get => _selectedItem; set { if (_selectedItem != value) { _selectedItem = value; RaisePropertyChanged(nameof(SelectedItem)); OnItemSelected(value); // Metod som triggas vid val } } } private void OnItemSelected(Participant item) { if (_roundElements.Count == 0) { var GameRound = new GameRound { GameRoundStartDate = DateTime.Now, GameStatus = GamePointStatus.New, GameRoundFinished = null }; var gameRoundId = _roundsRepo?.Save(GameRound).GetAwaiter().GetResult(); if (gameRoundId != null && gameRoundId != -1) { GameRound.GameRoundId = gameRoundId.Value; } GameRoundObject = GameRound; } var GamePointStart = new GamePoint { ParticipantId = item.ParticipantId, GameRoundId = GameRoundObject?.GameRoundId ?? 0, GameDate = DateTime.Now, GameRoundRegNr = -1, GameRegPoints = 0 }; var gamePointId = _pointsRepo.Save(GamePointStart).GetAwaiter().GetResult(); GamePointStart.GamePointId = gamePointId; var newElement = new RoundBuilderElement(); newElement.ParticipantId = item.ParticipantId; newElement.ParticipantName = item.LastNameFirstName; newElement.GameRoundRegNr = GamePointStart.GameRoundRegNr; newElement.GameRegPoints = GamePointStart.GameRegPoints; newElement.Status = GameRoundObject!.GameStatus; newElement.GameRoundStartDate = GameRoundObject?.GameRoundStartDate ?? DateTime.Now; newElement.GameRoundId = GamePointStart.GameRoundId; newElement.GamePointId = GamePointStart.GamePointId; _roundElements.Add(newElement); // Gör något med det valda objektet Debug.WriteLine($"Du valde: {item.LastNameFirstName}"); } public GameRound? GameRoundObject { get { return _GameRoundObject; } set { _GameRoundObject = value; RaisePropertyChanged(nameof(GameRoundObject)); } } public ObservableCollection GameRoundList { get { return _GameRoundList; } set { _GameRoundList = value; RaisePropertyChanged(nameof(GameRoundList)); } } public ObservableCollection ParticipantList { get { return _ParticipantList; } set { _ParticipantList = value; RaisePropertyChanged(nameof(ParticipantList)); } } #region Get Method public ObservableCollection Get() { if (_combined != null) { var GameRoundSummary = _combined.roundBuilderElements(); var groupedRounds = GameRoundSummary .GroupBy(r => r.GameRoundId) .Select(g => new RoundBuilderGroup { GameRoundId = g.Key, GameRoundStartDate = g.First().GameRoundStartDate, Status = g.First().Status, Elements = g.Select(p => new RoundBuilderElement { ParticipantId = p.ParticipantId, ParticipantName = p.ParticipantName, GamePointId = p.GamePointId, GameRoundRegNr = p.GameRoundRegNr, GameRegPoints = p.GameRegPoints, GameRoundId = p.GameRoundId, GameRoundStartDate = p.GameRoundStartDate }).ToList() }) .ToList(); GameRoundList = new ObservableCollection(groupedRounds); } return GameRoundList; } public ObservableCollection GetParticipants() { ParticipantList = _sharingService.Get(); return ParticipantList; } #endregion #region Get(id) Method public GameRound? Get(int id) { try { GameRoundObject = _roundsRepo?.Get(id).GetAwaiter().GetResult(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"Error in Get method: {ex.Message}"); } return GameRoundObject; } public virtual bool Save() { if (_roundsRepo == null || GameRoundObject == null) { return false; } var tmpTask = _roundsRepo.Save(GameRoundObject); bool tmp = tmpTask.GetAwaiter().GetResult() != -1; if (tmp) { GameRoundObject = new GameRound(); RoundElements.Clear(); this.Get(); } return tmp; } public void Rensa() { foreach (var element in RoundElements) { _pointsRepo.DeleteById(element.GamePointId); } _roundsRepo?.DeleteById(GameRoundObject?.GameRoundId ?? 0); RoundElements.Clear(); } public void RoundSelected(RoundBuilderElement element) { Debug.WriteLine($"Du valde raden med Runda {element.GameRoundId} och spelare: {element.ParticipantName}"); } public void SelectNewlyAddedParticipant(RoundBuilderElement roundBuilder) { Debug.WriteLine($"Du valde raden med Runda {roundBuilder.GameRoundId} och spelare: {roundBuilder.ParticipantName}"); } #endregion }