using Microsoft.EntityFrameworkCore;
using MTWorkHR.Core.Entities;
using MTWorkHR.Core.IDto;
using MTWorkHR.Infrastructure.Entities;
using MTWorkHR.Infrastructure.DBContext;
using MTWorkHR.Core.IRepositories;

namespace MTWorkHR.Infrastructure.Repositories
{
    public class ChatMessageRepository : Repository<ChatMessage>, IChatMessageRepository
    {
        private readonly DbSet<ChatMessage> dbSet;

        public ChatMessageRepository(HRDataContext context) : base(context)
        {
            dbSet = context.Set<ChatMessage>();
        }
        
        public async Task<ChatMessage> GetByIdWithAllChildren(long id)
        {
            return await dbSet
                .Include(x => x.ChatAttachments)
                .FirstOrDefaultAsync(x => x.Id == id);
        }
        public async Task<Tuple<IQueryable<ChatMessage>, int>> GetAllWithChildrenAsync(string userId, string contactId)
        {
            var query = dbSet.Include(x => x.ChatAttachments).Where(m=> (m.ReceiverId == contactId && m.SenderId == userId) || (m.ReceiverId == userId && m.SenderId == contactId)).AsQueryable();
            var total = await query.CountAsync();

            return new Tuple<IQueryable<ChatMessage>, int>(query, total);
        }

        public async Task<Tuple<IQueryable<ChatMessage>, int>> GetAllUserMessagesAsync(string userId)
        {
            var query = dbSet.Include(x => x.ChatAttachments).Where(m => (m.SenderId == userId) || (m.ReceiverId == userId )).AsQueryable();
            var total = await query.CountAsync();

            return new Tuple<IQueryable<ChatMessage>, int>(query, total);
        }
    }
}