namespace JiShe.CollectBus.Kafka.Consumer;

public interface IConsumerService
{
    Task SubscribeAsync<TKey, TValue>(string topic, Func<TKey, TValue, Task<bool>> messageHandler,
        string? groupId = null) where TKey : notnull where TValue : class;

    /// <summary>
    ///     订阅消息
    /// </summary>
    /// <typeparam name="TValue"></typeparam>
    /// <param name="topic"></param>
    /// <param name="messageHandler"></param>
    /// <returns></returns>
    Task SubscribeAsync<TValue>(string topic, Func<TValue, Task<bool>> messageHandler, string? groupId = null)
        where TValue : class;

    Task SubscribeAsync<TKey, TValue>(string[] topics, Func<TKey, TValue, Task<bool>> messageHandler, string? groupId)
        where TKey : notnull where TValue : class;


    /// <summary>
    ///     订阅消息
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    /// <typeparam name="TValue"></typeparam>
    /// <param name="topics"></param>
    /// <param name="messageHandler"></param>
    /// <returns></returns>
    Task SubscribeAsync<TValue>(string[] topics, Func<TValue, Task<bool>> messageHandler, string? groupId = null)
        where TValue : class;

    Task SubscribeBatchAsync<TKey, TValue>(string[] topics, Func<List<TValue>, Task<bool>> messageBatchHandler,
        string? groupId = null, int batchSize = 100, TimeSpan? batchTimeout = null)
        where TKey : notnull where TValue : class;

    Task SubscribeBatchAsync<TKey, TValue>(string topic, Func<List<TValue>, Task<bool>> messageBatchHandler,
        string? groupId = null, int batchSize = 100, TimeSpan? batchTimeout = null)
        where TKey : notnull where TValue : class;

    Task SubscribeBatchAsync<TValue>(string topic, Func<List<TValue>, Task<bool>> messageBatchHandler,
        string? groupId = null, int batchSize = 100, TimeSpan? batchTimeout = null, TimeSpan? consumeTimeout = null)
        where TValue : class;

    Task SubscribeBatchAsync<TValue>(string[] topics, Func<List<TValue>, Task<bool>> messageBatchHandler,
        string? groupId = null, int batchSize = 100, TimeSpan? batchTimeout = null, TimeSpan? consumeTimeout = null)
        where TValue : class;

    void Unsubscribe<TKey, TValue>(string[] topics, string groupId) where TKey : notnull where TValue : class;
}