using Managing.Domain.Bots;
using static Managing.Common.Enums;

namespace Managing.Application.Abstractions.Repositories;

public interface IBotRepository
{
    Task InsertBotAsync(Bot bot);
    Task<IEnumerable<Bot>> GetBotsAsync();
    Task UpdateBot(Bot bot);
    Task DeleteBot(Guid identifier);
    Task<Bot> GetBotByIdentifierAsync(Guid identifier);
    Task<IEnumerable<Bot>> GetBotsByIdsAsync(IEnumerable<Guid> identifiers);
    Task<IEnumerable<Bot>> GetBotsByUserIdAsync(int id);
    Task<IEnumerable<Bot>> GetBotsByStatusAsync(BotStatus status);
    Task<Bot> GetBotByNameAsync(string name);
    
    /// <summary>
    /// Gets paginated bots with filtering and sorting
    /// </summary>
    /// <param name="pageNumber">Page number (1-based)</param>
    /// <param name="pageSize">Number of items per page</param>
    /// <param name="status">Filter by status (optional)</param>
    /// <param name="userId">Filter by user ID (optional)</param>
    /// <param name="name">Filter by name (partial match, case-insensitive)</param>
    /// <param name="ticker">Filter by ticker (partial match, case-insensitive)</param>
    /// <param name="agentName">Filter by agent name (partial match, case-insensitive)</param>
    /// <param name="sortBy">Sort field</param>
    /// <param name="sortDirection">Sort direction ("Asc" or "Desc")</param>
    /// <returns>Tuple containing the bots for the current page and total count</returns>
    Task<(IEnumerable<Bot> Bots, int TotalCount)> GetBotsPaginatedAsync(
        int pageNumber, 
        int pageSize, 
        BotStatus? status = null, 
        string? name = null, 
        string? ticker = null, 
        string? agentName = null, 
        string sortBy = "CreateDate", 
        string sortDirection = "Desc");
}