CaffGeek/MBACNationals

View on GitHub
ReadModels/ParticipantProfileQueries.cs

Summary

Maintainability
A
0 mins
Test Coverage
using Edument.CQRS;
using Events.Contingent;
using Events.Participant;
using Events.Tournament;
using System;
using System.Collections.Generic;
using System.Linq;

namespace MBACNationals.ReadModels
{
    public class ParticipantProfileQueries : 
        IReadModel,
        IParticipantProfileQueries,
        ISubscribeTo<TournamentCreated>,
        ISubscribeTo<ContingentCreated>,
        ISubscribeTo<ContingentAssignedToTournament>,
        ISubscribeTo<TeamCreated>,
        ISubscribeTo<ParticipantCreated>,
        ISubscribeTo<ParticipantRenamed>,
        ISubscribeTo<ParticipantProfileChanged>,
        ISubscribeTo<ParticipantAssignedToTeam>,
        ISubscribeTo<ParticipantYearsQualifyingChanged>,
        ISubscribeTo<ParticipantQualifyingPositionChanged>
    {
        public List<Participant> Participants { get; set; }
        public Dictionary<Guid, string> Tournaments { get; set; }
        public Dictionary<Guid, Contingent> Contingents { get; set; }
        public List<Team> Teams { get; set; }

        public class Participant
        {
            public Guid Id { get; set; }
            public Guid ContingentId { get; set; }
            public bool HasProfile { get; set; }
            public string Province { get; set; }
            public string Team { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
            public string HomeTown { get; set; }
            public string MaritalStatus { get; set; }
            public string SpouseName { get; set; }
            public string Children { get; set; }
            public string Occupation { get; set; }
            public string HomeCenter { get; set; }
            public int YearsBowling { get; set; }
            public int NumberOfLeagues { get; set; }
            public int HighestAverage { get; set; }
            public int YearsCoaching { get; set; }
            public int YearsCoachingAdults { get; set; }
            public string BestFinishProvincially { get; set; }
            public string BestFinishNationally { get; set; }
            public int MastersYears { get; set; }
            public int MastersYearsQualifying { get; set; }
            public int MasterProvincialWins { get; set; }
            public string MastersAchievements { get; set; }
            public string OpenAchievements { get; set; }
            public int OpenYears { get; set; }
            public string OtherAchievements { get; set; }
            public string Hobbies { get; set; }
            public bool IsSingle { get; set; }
        }

        public class Contingent
        {
            public Guid Id { get; set; }
            public Guid TournamentId { get; set; }
            public string Province { get; set; }
        }

        public class Team
        {
            public Guid Id { get; set; }
            public Guid ContingentId { get; set; }
            public string Name { get; set; }
            public string Province { get; set; }
            public bool IncludesSinglesRep { get; set; }
        }

        public ParticipantProfileQueries()
        {
            Reset();
        }

        public void Reset()
        {
            Participants = new List<Participant>();
            Tournaments = new Dictionary<Guid, string>();
            Contingents = new Dictionary<Guid, Contingent>();
            Teams = new List<Team>();
            Tournaments.Add(Guid.Empty, "2014");
        }

        public void Save()
        {
            ReadModelPersister.Save(this);
        }
        
        public List<Participant> GetProfiles(int year)
        {
            if (!Tournaments.Any(x => x.Value == year.ToString()))
                return null;

            var tournament = Tournaments.Single(x => x.Value == year.ToString());
            var contingents = Contingents.Where(x => x.Value.TournamentId == tournament.Key);
            var participants = Participants.Where(x => x.IsSingle && contingents.Any(c => c.Key == x.ContingentId))
                .ToList();

            return participants;
        }

        public Participant GetProfile(Guid id)
        {
            return Participants.SingleOrDefault(x => x.Id == id);
        }

        public void Handle(TournamentCreated e)
        {
            if (Tournaments.ContainsKey(e.Id))
                Tournaments.Remove(e.Id);
            
            Tournaments.Add(e.Id, e.Year);
        }

        public void Handle(ContingentCreated e)
        {
            Contingents.Add(e.Id, new Contingent
            {
                Id = e.Id,
                Province = e.Province
            });
        }

        public void Handle(ContingentAssignedToTournament e)
        {
            var contingent = Contingents[e.Id];
            contingent.TournamentId = e.TournamentId;
        }

        public void Handle(TeamCreated e)
        {
            var contingent = Contingents[e.Id];

            Teams.Add(new Team
            {
                Id = e.TeamId,
                ContingentId = e.Id,
                Name = e.Name,
                Province = contingent.Province,
                IncludesSinglesRep = e.IncludesSinglesRep
            });
        }

        public void Handle(ParticipantCreated e)
        {
            Participants.Add(new Participant
            {
                Id = e.Id,
                Name = e.Name,
                MastersYearsQualifying = e.YearsQualifying,
            });
        }

        public void Handle(ParticipantRenamed e)
        {
            var participant = Participants.Single(x => x.Id == e.Id);
            participant.Name = e.Name;
        }

        public void Handle(ParticipantProfileChanged e)
        {
            var participant = Participants.Single(x => x.Id == e.Id);

            participant.HasProfile = true;
            participant.Age = e.Age;
            participant.HomeTown = e.HomeTown;
            participant.MaritalStatus = e.MaritalStatus;
            participant.SpouseName = e.SpouseName;
            participant.Children = e.Children;
            participant.Occupation = e.Occupation;
            participant.HomeCenter = e.HomeCenter;
            participant.YearsBowling = e.YearsBowling;
            participant.NumberOfLeagues = e.NumberOfLeagues;
            participant.HighestAverage = e.HighestAverage;
            participant.YearsCoaching = e.YearsCoaching;
            participant.YearsCoachingAdults = e.YearsCoachingAdults;
            participant.BestFinishProvincially = e.BestFinishProvincially;
            participant.BestFinishNationally = e.BestFinishNationally;
            participant.MastersYears = e.MastersYears;
            participant.MasterProvincialWins = e.MasterProvincialWins;
            participant.MastersAchievements = e.MastersAchievements;
            participant.OpenAchievements = e.OpenAchievements;
            participant.OpenYears = e.OpenYears;
            participant.OtherAchievements = e.OtherAchievements;
            participant.Hobbies = e.Hobbies;
        }

        public void Handle(ParticipantAssignedToTeam e)
        {
            if (!Teams.Any(x => x.Id == e.TeamId))
                return;
            
            var participant = Participants.Single(x => x.Id == e.Id);
            var team = Teams.Single(x => x.Id == e.TeamId);

            participant.Team = team.Name;
            participant.Province = team.Province;
            participant.ContingentId = team.ContingentId;
        }

        public void Handle(ParticipantYearsQualifyingChanged e)
        {
            var participant = Participants.Single(x => x.Id == e.Id);

            participant.MastersYearsQualifying = e.YearsQualifying;
        }

        public void Handle(ParticipantQualifyingPositionChanged e)
        {
            var participant = Participants.Single(x => x.Id == e.Id);
            var team = Teams.SingleOrDefault(x => x.Id == e.TeamId);
            if (team == null)
                return;
            
            participant.IsSingle = team.IncludesSinglesRep && e.QualifyingPosition == 1;
        }
    }
}