namespace ZadaniaWPF.Model
{
    using JacekMatulewski.WpfUtils;

    #region Polecenia
    public interface IPolecenie : IMessage { }

    public class PolecenieDodaniaZadania : IPolecenie
    {
        public Zadanie Zadanie;
    }

    public class PolecenieUsunięciaZadania : IPolecenie
    {
        public int IdZadania;
    }

    public class PolecenieSortowaniaZadań : IPolecenie
    {
        public bool PorównywaniePriorytetówCzyPlanowanychTerminówRealizacji;
    }
    #endregion

    #region Obsługi poleceń
    public abstract class ObsługaPoleceńDlaZadań<Polecenie> : IMessageHandler<Polecenie>
        where Polecenie : IPolecenie
    {
        protected Zadania modelZapis;

        public ObsługaPoleceńDlaZadań(Zadania modelZapis)
        {
            this.modelZapis = modelZapis;
        }

        public abstract void Handle(Polecenie polecenie);
    }

    public class ObsługaDodaniaZadania : ObsługaPoleceńDlaZadań<PolecenieDodaniaZadania>
    {
        public ObsługaDodaniaZadania(Zadania modelZapis)
            : base(modelZapis)
        { }

        public override void Handle(PolecenieDodaniaZadania polecenie)
        {
            modelZapis.DodajZadanie(polecenie.Zadanie);
        }
    }

    public class ObsługaUsunięciaZadania : ObsługaPoleceńDlaZadań<PolecenieUsunięciaZadania>
    {
        public ObsługaUsunięciaZadania(Zadania modelZapis)
            : base(modelZapis)
        { }

        public override void Handle(PolecenieUsunięciaZadania polecenie)
        {
            modelZapis.UsuńZadanie(polecenie.IdZadania);
        }
    }

    public class ObsługaSortowaniaZadań : ObsługaPoleceńDlaZadań<PolecenieSortowaniaZadań>
    {
        public ObsługaSortowaniaZadań(Zadania modelZapis)
            : base(modelZapis)
        { }

        public override void Handle(PolecenieSortowaniaZadań polecenie)
        {
            modelZapis.SortujZadania(polecenie.PorównywaniePriorytetówCzyPlanowanychTerminówRealizacji);
        }
    }
    #endregion

    public class DyspozytorPoleceńDlaZadań : MessageDispatcher<IPolecenie>
    {
        public DyspozytorPoleceńDlaZadań(Zadania modelZapis)
        {
            //messageHandlers.Add(typeof(PolecenieDodaniaZadania), new ObsługaDodaniaZadania(modelZapis));
            //messageHandlers.Add(typeof(PolecenieUsunięciaZadania), new ObsługaUsunięciaZadania(modelZapis));
            //messageHandlers.Add(typeof(PolecenieSortowaniaZadań), new ObsługaSortowaniaZadań(modelZapis));
            AddHandler(typeof(PolecenieDodaniaZadania), new ObsługaDodaniaZadania(modelZapis));
            AddHandler(typeof(PolecenieUsunięciaZadania), new ObsługaUsunięciaZadania(modelZapis));
            AddHandler(typeof(PolecenieSortowaniaZadań), new ObsługaSortowaniaZadań(modelZapis));
        }
    }
}
