using data.RemoteData.DAO;
using domain.Models;

namespace data.Repository
{
    public class PresenceRepositoryImpl
    {
        // Коллекция для хранения данных о посещаемости.
        private readonly List<PresenceLocalEntity> _presences = new List<PresenceLocalEntity>();

        // Метод для сохранения списка посещаемости.
        public void SavePresence(List<PresenceLocalEntity> presences)
        {
            foreach (var presence in presences)
            {
                // Проверяем, существует ли уже запись о посещении для этого пользователя, урока и даты.
                var existing = _presences.FirstOrDefault(p =>
                    p.Date == presence.Date &&
                    p.UserGuid == presence.UserGuid && 
                    p.LessonNumber == presence.LessonNumber);

                if (existing == null)
                {
                    // Если записи нет, добавляем новую.
                    _presences.Add(presence);
                }
                else
                {
                    // Если запись уже существует, обновляем информацию о посещении.
                    existing.IsAttedance = presence.IsAttedance;
                }
            }
        }

        // Метод для добавления нового присутствия.
        public void AddPresence(PresenceLocalEntity presence)
        {
            // Если передан null, выбрасываем исключение.
            if (presence == null) throw new ArgumentNullException(nameof(presence));

            // Добавляем новое присутствие в коллекцию.
            _presences.Add(presence);
        }

        // Метод для получения списка посещаемости по группе.
        public List<PresenceLocalEntity> GetPresenceByGroup(int groupId)
        {
            return _presences.Where(p => p.GroupId == groupId).ToList();
        }

        // Метод для получения посещаемости по группе и дате.
        public List<PresenceLocalEntity> GetPresenceByGroupAndDate(int groupId, DateTime date)
        {
            return _presences.Where(p => p.GroupId == groupId && p.Date.Date == date.Date).ToList();
        }

        // Метод для пометки пользователя как отсутствующего на определённом интервале уроков.
        public void MarkUserAsAbsent(Guid userGuid, int firstLessonNumber, int lastLessonNumber)
        {
            foreach (var lesson in Enumerable.Range(firstLessonNumber, lastLessonNumber - firstLessonNumber + 1))
            {
                // Находим присутствие для данного пользователя и урока.
                var presence = _presences.FirstOrDefault(p => p.UserGuid == userGuid && p.LessonNumber == lesson);
                if (presence != null)
                {
                    // Если присутствие найдено, помечаем пользователя как отсутствующего.
                    presence.IsAttedance = false;
                }
            }
        }
    }
}
