using MongoDB.Driver;
using Postall.Domain.Entities;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Postall.Domain
{
    public interface IUserSocialRepository
    {
        /// <summary>
        /// Obtém todos os dados sociais dos usuários
        /// </summary>
        Task<IEnumerable<UserSocialData>> GetAllAsync();

        /// <summary>
        /// Obtém os dados sociais pelo ID do MongoDB
        /// </summary>
        Task<UserSocialData> GetByIdAsync(string id);

        /// <summary>
        /// Obtém os dados sociais pelo ID do usuário
        /// </summary>
        Task<UserSocialData> GetByUserIdAsync(string userId);

        /// <summary>
        /// Obtém os dados sociais pelo token do Google
        /// </summary>
        Task<UserSocialData> GetByGoogleTokenAsync(string googleToken);

        /// <summary>
        /// Adiciona novos dados sociais de usuário
        /// </summary>
        Task<UserSocialData> AddAsync(UserSocialData userSocialData);

        /// <summary>
        /// Atualiza os dados sociais de um usuário existente
        /// </summary>
        Task<bool> UpdateAsync(UserSocialData userSocialData);

        /// <summary>
        /// Atualiza ou insere os dados sociais de um usuário
        /// </summary>
        Task<UserSocialData> UpsertAsync(UserSocialData userSocialData);

        /// <summary>
        /// Atualiza ou insere os dados sociais de um usuário unico pelo id
        /// </summary>
        Task<bool> UpdateOneAsync(string userId, UpdateDefinition<UserSocialData> update);

        /// <summary>
        /// Remove os dados sociais pelo ID do MongoDB
        /// </summary>
        Task<bool> DeleteAsync(string id);

        /// <summary>
        /// Remove os dados sociais pelo ID do usuário
        /// </summary>
        Task<bool> DeleteByUserIdAsync(string userId);

        /// <summary>
        /// Atualiza apenas o token do Google para um usuário
        /// </summary>
        Task<bool> UpdateGoogleTokenAsync(string userId, string googleToken);

        /// <summary>
        /// Atualiza apenas o token do Facebook para um usuário
        /// </summary>
        Task<bool> UpdateFacebookTokenAsync(string userId, FacebookToken facebookToken);
    }
}