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;
        }

        public void SavePresence(List<PresenceLocalEntity> presences)
        {
            foreach (var presence in presences)
            {
                var existing = _remoteDatabaseContext.PresenceDaos.FirstOrDefault(p =>
                    p.Date == DateOnly.FromDateTime(presence.Date) &&
                    p.UserGuid == presence.UserGuid &&
                    p.LessonNumber == presence.LessonNumber);

                if (existing == null)
                {
                    var newPresence = new PresenceDao
                    {
                        Date = DateOnly.FromDateTime(presence.Date),
                        UserGuid = presence.UserGuid,
                        LessonNumber = presence.LessonNumber,
                        IsAttedance = presence.IsAttedance,
                        GroupId = presence.GroupId
                    };
                    _remoteDatabaseContext.PresenceDaos.Add(newPresence);
                }
                else
                {
                    existing.IsAttedance = presence.IsAttedance;
                }
            }
        }

        public void AddPresence(PresenceLocalEntity presence)
        {
            if (presence == null) throw new ArgumentNullException(nameof(presence));

            var newPresence = new PresenceDao
            {
                Date = DateOnly.FromDateTime(presence.Date),
                UserGuid = presence.UserGuid,
                LessonNumber = presence.LessonNumber,
                IsAttedance = presence.IsAttedance,
                GroupId = presence.GroupId // Если у вас есть это свойство
            };
            _remoteDatabaseContext.PresenceDaos.Add(newPresence);
        }

        public List<PresenceLocalEntity> GetPresenceByGroup(int groupId)
        {
            return _remoteDatabaseContext.PresenceDaos
                .Where(p => p.GroupId == groupId)
                .Select(p => new PresenceLocalEntity
                {
                    Date = p.Date.ToDateTime(TimeOnly.MinValue), 
                    UserGuid = p.UserGuid,
                    LessonNumber = p.LessonNumber,
                    IsAttedance = p.IsAttedance,
                    GroupId = p.GroupId 
                })
                .ToList();
        }

        public List<PresenceLocalEntity> GetPresenceByGroupAndDate(int groupId, DateTime date)
        {
            return _remoteDatabaseContext.PresenceDaos
                .Where(p => p.GroupId == groupId && p.Date == DateOnly.FromDateTime(date))
                .Select(p => new PresenceLocalEntity
                {
                    Date = p.Date.ToDateTime(TimeOnly.MinValue), 
                    UserGuid = p.UserGuid,
                    LessonNumber = p.LessonNumber,
                    IsAttedance = p.IsAttedance,
                    GroupId = p.GroupId 
                })
                .ToList();
        }

        public void MarkUserAsAbsent(Guid userGuid, int groupId, int firstLessonNumber, int lastLessonNumber)
        {
            foreach (var lesson in Enumerable.Range(firstLessonNumber, lastLessonNumber - firstLessonNumber + 1))
            {
                var presence = _remoteDatabaseContext.PresenceDaos.FirstOrDefault(p =>
                    p.UserGuid == userGuid &&
                    p.GroupId == groupId &&
                    p.LessonNumber == lesson);

                if (presence != null)
                {
                    presence.IsAttedance = false; // Помечаем как отсутствующего
                }
            }
        }
    }
}
