using Demo.Data.LocalData;
using Demo.Data.RemoteData.RemoteDataBase;
using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Demo.Domain.Models;

namespace Demo.Data.Repository
{
    public class SQLPresenceRepositoryImpl : IPresenceRepository
    {
        private readonly RemoteDatabaseContext _remoteDatabaseContext;

        public SQLPresenceRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext){
            _remoteDatabaseContext = remoteDatabaseContext;
            GetAllPresence = _remoteDatabaseContext.PresenceDaos.Select(x => new PresenceLocalEntity{UserGuid = x.UserGuid, Date = x.Date, LessonNumber = x.LessonNumber, IsAttedance = x.IsAttedance}).ToList();
        }
        public List<PresenceLocalEntity> GetAllPresence = new List<PresenceLocalEntity>{};

        public List<PresenceLocalEntity> GetAllPresences(){
            return _remoteDatabaseContext.PresenceDaos.Select(x => new PresenceLocalEntity{UserGuid = x.UserGuid, Date = x.Date, LessonNumber = x.LessonNumber, IsAttedance = x.IsAttedance}).ToList();
        }

        public List<PresenceLocalEntity> GeneratePresence(List<PresenceLocalEntity> presenceLocalEntities)
        {
            var presences = presenceLocalEntities.Select(x => new PresenceDAO
            {
                UserGuid = x.UserGuid,
                IsAttedance = x.IsAttedance,
                LessonNumber = x.LessonNumber,
                Date = x.Date,
                userDAO = _remoteDatabaseContext.Users.FirstOrDefault(u => u.Guid == x.UserGuid)
            }).ToList();

            _remoteDatabaseContext.PresenceDaos.AddRange(presences);
            _remoteDatabaseContext.SaveChanges();

            return presenceLocalEntities;
        }

        public void IsAttedance(int firstLesson, int lastLesson, DateOnly date, Guid UserGuid){
            var presencesToUpdate = _remoteDatabaseContext.PresenceDaos
            .Where(x => x.LessonNumber >= firstLesson 
                        && x.LessonNumber <= lastLesson 
                        && x.Date == date 
                        && x.UserGuid == UserGuid)
            .ToList();

            foreach(var presence in presencesToUpdate){
                presence.IsAttedance = false;
            }

            _remoteDatabaseContext.SaveChanges();
        }

    }
}
