CaffGeek/MBACNationals

View on GitHub
ReadModels/ScheduleQueries.cs

Summary

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

namespace MBACNationals.ReadModels
{
    public class ScheduleQueries : 
        IReadModel,
        IScheduleQueries,
        ISubscribeTo<TournamentCreated>,
        ISubscribeTo<MatchCreated>,
        ISubscribeTo<MatchCompleted>
    {
        public List<Tournament> Tournaments { get; set; }

        public class Tournament
        {
            public Guid Id { get; set; }
            public string Year { get; set; }
            public List<Schedule> DivisionSchedules { get; set; }
            
            public Tournament()
            {
                DivisionSchedules = new List<Schedule>();
            }
        }

        public class Schedule
        {
            public string Division { get; set; }
            public List<Match> Games { get; set; }

            public Schedule()
            {
                Games = new List<Match>();
            }
        }

        public class Match
        {
            public Guid Id { get; set; }
            public string Division { get; set; }
            public bool IsPOA { get; set; }
            public int Number { get; set; }
            public string Away { get; set; }
            public string Home { get; set; }
            public int Lane { get; set; }
            public BowlingCentre Centre { get; set; }
            public string CentreName { get; set; }
            public bool IsComplete { get; set; }

            public Match(Guid guid, string division, int number, string away, string home, int lane, BowlingCentre centre, bool isPOA = false)
            {
                Id = guid;
                Division = division;
                IsPOA = isPOA;
                Number = number;
                Away = away;
                Home = home;
                Lane = lane;
                Centre = centre;
                CentreName = centre.ToString();
                IsComplete = false;
            }
        }

        public ScheduleQueries()
        {
            Reset();
        }

        public void Reset()
        {
            Tournaments = new List<Tournament>();            
        }

        public void Save()
        {
            ReadModelPersister.Save(this);
        }
        
        public ScheduleQueries.Schedule GetSchedule(int year, string division)
        {
            var tournament = Tournaments.SingleOrDefault(x => x.Year == year.ToString());
            var schedule = tournament.DivisionSchedules.SingleOrDefault(x => x.Division == division);
            return schedule;
        }

        public void Handle(TournamentCreated e)
        {
            var tournament = Tournaments.SingleOrDefault(x => x.Year == e.Year || x.Id == e.Id);
            if (tournament == null)
                Tournaments.Add(new Tournament
                {
                    Id = e.Id,
                    Year = e.Year,
                });
            else if (tournament != null && tournament.Year == "2014")
                tournament.Id = e.Id;            
        }

        public void Handle(MatchCreated e)
        {
            var tournament = Tournaments.SingleOrDefault(x => x.Year == e.Year || x.Id == e.TournamentId);
            if (tournament == null) {
                tournament = new Tournament { Year = "2014" };
                Tournaments.Add(tournament);
            }

            var division = tournament.DivisionSchedules.SingleOrDefault(x => x.Division == e.Division);
            if (division == null)
            {
                division = new Schedule { Division = e.Division };
                tournament.DivisionSchedules.Add(division);
            }

            division.Games.Add(new Match(e.Id, e.Division, e.Number, e.Away, e.Home, e.Lane, e.Centre, e.IsPOA));             
        }

        public void Handle(MatchCompleted e)
        {
            var match = Tournaments
                .SelectMany(x => x.DivisionSchedules)
                .SelectMany(x => x.Games)
                .SingleOrDefault(x => x.Id == e.Id);
            match.IsComplete = true;
        }
    }
}