using System.Collections.Generic;

namespace ZadaniaWPF.Model
{
    //piszemy od nowa
    /*
    public class ZadaniaOdczyt : IEnumerable<Zadanie>
    {
        private Zadanie[] zadania = new Zadanie[0];

        public ZadaniaOdczyt(Zadania modelZapis)
        {
            modelZapis.ZadaniaZmienione +=
                (object sender, ZadaniaEventArgs e) =>
                {
                    zadania = e.Zadania;
                    OnZadaniaZmienione();
                };
        }

        public int LiczbaZadań
        {
            get
            {
                return zadania.Length;
            }
        }

        public Zadanie this[int indeks]
        {
            get
            {
                return zadania[indeks];
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return zadania.GetEnumerator();
        }

        public IEnumerator<Zadanie> GetEnumerator()
        {
            return ((IEnumerable<Zadanie>)zadania).GetEnumerator();
        }

        public event ZadaniaZmienioneEventHandler ZadaniaZmienione;
        protected void OnZadaniaZmienione()
        {
            if (ZadaniaZmienione != null)
                ZadaniaZmienione(this, new ZadaniaEventArgs() { Zadania = zadania });
        }
    }
    */

    //to chyba w zasadzie niepotrzebne - tu mogłoby być filtrowanie itp
    //bufor tylko dla jednego subskrybenta !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    public class ZadaniaOdczyt
    {
        public ZadaniaZmienioneEventHandler zadaniaZmienione;
        public event ZadaniaZmienioneEventHandler ZadaniaZmienione
        {
            add
            {
                zadaniaZmienione += value;
                while (bufor.Count > 0)
                {
                    OnZadaniaZmienione(bufor.Dequeue());
                    
                }
            }
            remove
            {
                zadaniaZmienione -= value;
            }
        }
        private Queue<IZdarzenie> bufor = new Queue<IZdarzenie>();
        protected void OnZadaniaZmienione(IZdarzenie zdarzenie)
        {
            if (zadaniaZmienione != null)
                zadaniaZmienione(this, new ZadaniaEventArgs() { Zdarzenie = zdarzenie });            
        }

        public void PrzekażZdarzenie(IZdarzenie zdarzenie)
        {
            if (zdarzenie is ZdarzenieDodaniaZadania) LiczbaZadań++;
            if (zdarzenie is ZdarzenieUsunięciaZadania) LiczbaZadań--;

            if(zadaniaZmienione != null) OnZadaniaZmienione(zdarzenie);
            else bufor.Enqueue(zdarzenie);
        }

        public int LiczbaZadań { get; private set; } = 0;
    }
}
