using System;
using System.Collections.Generic;
using System.Linq;

namespace ZadaniaWPF.Model
{
    using JacekMatulewski.WpfUtils;

    public interface IZdarzenie : IMessage { }

    public class ZdarzenieDodaniaZadania : IZdarzenie
    {
        public Zadanie DodaneZadanie;

        public ZdarzenieDodaniaZadania(Zadanie dodaneZadanie)
        {
            this.DodaneZadanie = dodaneZadanie;
        }
    }

    public class ZdarzenieUsunięciaZadania : IZdarzenie
    {
        public Zadanie UsunięteZadanie;

        public ZdarzenieUsunięciaZadania(Zadanie usunięteZadanie)
        {
            this.UsunięteZadanie = usunięteZadanie;
        }
    }

    public class ZdarzenieSortowaniaZadań : IZdarzenie
    {
        public bool PorównywaniePriorytetówCzyPlanowanychTerminówRealizacji;
    }

    public class MagazynZdarzeń
    {
        private class OpisZdarzenia
        {
            public DateTime Czas;
            public IZdarzenie Zdarzenie;
        }

        private List<OpisZdarzenia> historiaZdarzeń = new List<OpisZdarzenia>();

        public void ZachowajZdarzenie(IZdarzenie zdarzenie)
        {
            historiaZdarzeń.Add(
                new OpisZdarzenia() { Czas = DateTime.Now, Zdarzenie = zdarzenie });
        }

        public IZdarzenie PobierzOstatnieZdarzenie()
        {
            return historiaZdarzeń.Last().Zdarzenie;
        }

        public void UsuńOstatnieZdarzenie()
        {
            historiaZdarzeń.Remove(historiaZdarzeń.Last());
        }

        public IZdarzenie[] PobierzZdarzeniaZOkresu(DateTime czasOd, DateTime? czasDo = null)
        {
            if (!czasDo.HasValue) czasDo = DateTime.Now;
            return 
                historiaZdarzeń
                .Where(opis => opis.Czas >= czasOd && opis.Czas <= czasDo)
                .Select(opis => opis.Zdarzenie)
                .ToArray();
        }
    }

    public class SzynaZdarzeń : IMessageBus<IZdarzenie>
    {
        ZadaniaOdczyt modelOdczyt;

        public SzynaZdarzeń(ZadaniaOdczyt modelOdczyt)
        {
            this.modelOdczyt = modelOdczyt;
        }

        public void Send<Message>(Message message) where Message : IZdarzenie
        {
            modelOdczyt.PrzekażZdarzenie(message as IZdarzenie);
        }
    }
}
