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

namespace data.Domain.UseCase
{
    public class GroupUseCase
    {
        private readonly IGroupRepository _SQLGroupRepositoryImpl;

        public GroupUseCase(IGroupRepository SQlGroupRepositoryImpl)
        {
            _SQLGroupRepositoryImpl = SQlGroupRepositoryImpl;
        }

        // Приватный метод для валидации имени группы
        private void ValidateGroupName(string groupName)
        {
            if (string.IsNullOrWhiteSpace(groupName))
            {
                throw new ArgumentException("Имя группы не может быть пустым.");
            }
        }

        private void ValidateGroupId(int GroupId)
        {
            if (GroupId < 1)
            {
                throw new ArgumentException("Введите корректный ID группы.");
            }
        }

        // Приватный метод для валидации существования группы по ID
        private GroupDao ValidateGroupExistence(int groupId)
        {
            var existingGroup = _SQLGroupRepositoryImpl.GetAllGroups()
                .FirstOrDefault(g => g.Id == groupId);

            if (existingGroup == null)
            {
                throw new ArgumentException("Группа не найдена.");
            }

            return existingGroup;
        }


        // Метод для получения списка всех групп
        public List<GroupDao> GetAllGroups()
        {
            return _SQLGroupRepositoryImpl.GetAllGroups();
        }

        // Метод для получения группы по ID
        public string FindGroupById(int IdGroup)
        {
            string groups = _SQLGroupRepositoryImpl.GetGroupById(IdGroup).Name;

            return groups;
        }


        // Метод для добавления новой группы
        public void AddGroup(string groupName)
        {
            ValidateGroupName(groupName);
            GroupDao newGroup = new GroupDao
            {
                Name = groupName
            };

            _SQLGroupRepositoryImpl.AddGroup(newGroup.Name);
        }


        // Метод для изменения названия группы
        public void UpdateGroup(int groupId, string newGroupName)
        {
            ValidateGroupName(newGroupName);
            var existingGroup = ValidateGroupExistence(groupId);

            existingGroup.Name = newGroupName;
            _SQLGroupRepositoryImpl.UpdateGroupById(groupId, existingGroup);
        }
    }
}