using System;
using System.Collections.Generic;
using ZeroLevel.Models;

namespace ZeroLevel.Network
{
    public interface IClientSet
    {
        bool Send<T>(string alias, T data);
        bool Send<T>(string alias, string inbox, T data);
        bool Request<Tresponse>(string alias, Action<Tresponse> callback);
        bool Request<Tresponse>(string alias, string inbox, Action<Tresponse> callback);
        bool Request<Trequest, Tresponse>(string alias, Trequest request, Action<Tresponse> callback);
        bool Request<Trequest, Tresponse>(string alias, string inbox, Trequest request, Action<Tresponse> callback);


        bool SendBroadcast<T>(string alias, T data);
        bool SendBroadcast<T>(string alias, string inbox, T data);
        
        bool SendBroadcastByType<T>(string serviceType, T data);
        bool SendBroadcastByType<T>(string serviceType, string inbox, T data);
        
        bool SendBroadcastByGroup<T>(string serviceGroup, T data);
        bool SendBroadcastByGroup<T>(string serviceGroup, string inbox, T data);
        
        bool RequestBroadcast<Tresponse>(string alias, Action<IEnumerable<Tresponse>> callback);
        bool RequestBroadcast<Tresponse>(string alias, string inbox, Action<IEnumerable<Tresponse>> callback);
        
        bool RequestBroadcast<Trequest, Tresponse>(string alias, Trequest data, Action<IEnumerable<Tresponse>> callback);
        bool RequestBroadcast<Trequest, Tresponse>(string alias, string inbox, Trequest data, Action<IEnumerable<Tresponse>> callback);
        
        bool RequestBroadcastByType<Tresponse>(string serviceType, Action<IEnumerable<Tresponse>> callback);
        bool RequestBroadcastByType<Tresponse>(string serviceType, string inbox, Action<IEnumerable<Tresponse>> callback);
        
        bool RequestBroadcastByType<Trequest, Tresponse>(string serviceType, Trequest data, Action<IEnumerable<Tresponse>> callback);
        bool RequestBroadcastByType<Trequest, Tresponse>(string serviceType, string inbox, Trequest data, Action<IEnumerable<Tresponse>> callback);
        
        bool RequestBroadcastByGroup<Tresponse>(string serviceGroup, Action<IEnumerable<Tresponse>> callback);
        bool RequestBroadcastByGroup<Tresponse>(string serviceGroup, string inbox, Action<IEnumerable<Tresponse>> callback);
        
        bool RequestBroadcastByGroup<Trequest, Tresponse>(string serviceGroup, Trequest data, Action<IEnumerable<Tresponse>> callback);
        bool RequestBroadcastByGroup<Trequest, Tresponse>(string serviceGroup, string inbox, Trequest data, Action<IEnumerable<Tresponse>> callback);
    }
}