using System;
using System.Collections.Generic;
using System.Text;
namespace InABox.Core
{
    /// 
    /// Static class through which the server registers s and s, as well as actually pushing messages.
    /// 
    public class PushManager
    {
        private static List Handlers = new List();
        private static List Pushers { get; set; } = new List();
        private PushManager() { }
        public static void AddPusher(IPusher pusher) =>
            Pushers.Add(pusher);
        public static void Push(TPush push) where TPush : BaseObject => 
            Pushers.ForEach(x => x.Push(push));
        public static void Push(Guid session, TPush push) where TPush : BaseObject =>
            Pushers.ForEach(x => x.Push(session, push));
        public static void PushUser(Guid userID, TPush push) where TPush : BaseObject =>
            Pushers.ForEach(x => x.PushUser(userID, push));
        public static void Push(Platform platform, TPush push) where TPush : BaseObject => 
            Pushers.ForEach(x => x.Push(platform, push));
        public static void Poll(Guid session)
        {
            foreach (var handler in Handlers)
            {
                foreach (var push in handler.Poll(session))
                {
                    Pushers.ForEach(x => x.Push(session, handler.Type, push));
                }
            }
        }
        public static void AddPollHandler(PollHandler handler)
            where TPush : BaseObject
        {
            Handlers.Add(handler);
        }
        public static void AddPollHandler(PollHandler.PollEvent poll)
            where TPush : BaseObject
        {
            Handlers.Add(new PollHandler(poll));
        }
    }
}