using Postall.Domain.Dtos;
using Postall.Domain.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Postall.Domain.Contracts.Repositories
{
    /// <summary>
    /// Interface para repositório de canais do YouTube no MongoDB
    /// </summary>
    public interface IChannelRepository
    {
        /// <summary>
        /// Obtém todos os canais
        /// </summary>
        Task<IEnumerable<ChannelData>> GetAllAsync();

        /// <summary>
        /// Obtém um canal pelo ID do MongoDB
        /// </summary>
        Task<ChannelData> GetByIdAsync(string id);


        /// <summary>
        /// Obtém os canais pelo ID do usuario do MongoDB
        /// </summary>
        Task<IList<ChannelData>> GetByUserIdAsync(string userId);

        /// <summary>
        /// Obtém os canais pelo ID do usuario e o channelId
        /// </summary>
        Task<ChannelData> GetByUserIdAndChannelIdAsync(string userId, string channelId);

        /// <summary>
        /// Obtém um canal pelo ID do YouTube
        /// </summary>
        Task<ChannelData> GetByYoutubeIdAsync(string youtubeId);

        /// <summary>
        /// Adiciona um novo canal
        /// </summary>
        Task<ChannelData> AddAsync(ChannelData ChannelData);

        /// <summary>
        /// Adiciona vários canais de uma vez
        /// </summary>
        Task<IEnumerable<ChannelData>> AddManyAsync(IEnumerable<ChannelData> channels);

        /// <summary>
        /// Atualiza um canal existente
        /// </summary>
        Task<bool> UpdateAsync(ChannelData ChannelData);

        /// <summary>
        /// Remove um canal pelo ID do MongoDB
        /// </summary>
        Task<bool> DeleteAsync(string id);

        /// <summary>
        /// Remove um canal pelo ID do YouTube
        /// </summary>
        Task<bool> DeleteByYoutubeIdAsync(string youtubeId);

        /// <summary>
        /// Busca canais com base em um termo de pesquisa no título ou descrição
        /// </summary>
        Task<IEnumerable<ChannelData>> SearchAsync(string searchTerm);

        /// <summary>
        /// Obtém canais selecionados (IsSelected = true)
        /// </summary>
        Task<IEnumerable<ChannelData>> GetSelectedAsync();

        /// <summary>
        /// Marca ou desmarca um canal como selecionado
        /// </summary>
        Task<bool> SetSelectedStatusAsync(string id, bool isSelected);

        /// <summary>
        /// Converte ChannelResponse para ChannelData
        /// </summary>
        ChannelData ConvertFromResponse(ChannelResponse channelResponse);

        /// <summary>
        /// Converte ChannelData para ChannelResponse
        /// </summary>
        ChannelResponse ConvertToResponse(ChannelData ChannelData);
    }
}
