private bool ProcessEdit(string songRequestText, GetAllSongsResponse currentSongs, string username, ProcessEditArgsResult action, int songIndex = 0)
        {
            var vipRequestsWithIndex =
                currentSongs.VipList.Select((sr, index) => new { Index = index + 1, SongRequest = sr }).ToList();

            using (var context = _contextFactory.Create())
            {
                PlaylistItem request;
                switch (action)
                {
                case ProcessEditArgsResult.OneRequestEdit:
                    request = currentSongs.RegularList.SingleOrDefault(rs => rs.songRequester == username) ??
                              currentSongs.VipList.SingleOrDefault(vs => vs.songRequester == username);

                    break;

                case ProcessEditArgsResult.RegularRequest:
                    request = currentSongs.RegularList.SingleOrDefault(rs => rs.songRequester == username);

                    break;

                case ProcessEditArgsResult.VipRequestNoIndex:
                    request = currentSongs.VipList.SingleOrDefault(rs => rs.songRequester == username);

                    break;

                case ProcessEditArgsResult.VipRequestWithIndex:
                    request = vipRequestsWithIndex
                              .SingleOrDefault(rs => rs.SongRequest.songRequester == username && rs.Index == songIndex)?
                              .SongRequest;

                    break;

                default:
                    request = null;
                    break;
                }

                if (request == null)
                {
                    return(false);
                }

                var dbReq = context.SongRequests.SingleOrDefault(
                    sr => sr.SongRequestId == request.songRequestId);

                if (dbReq == null)
                {
                    return(false);
                }

                dbReq.RequestText = songRequestText;
                dbReq.InDrive     = false;
                context.SaveChanges();

                return(true);
            }
        }
        private ProcessEditArgsResult ProcessEditArgs(string username, string commandText, GetAllSongsResponse currentSongs, out string songRequestText)
        {
            var vipRequestsWithIndex =
                currentSongs.VipList.Select((sr, index) => new { Index = index + 1, SongRequest = sr }).ToList();

            songRequestText = string.Empty;

            if (currentSongs.RegularList.All(rs => rs.songRequester != username) &&
                currentSongs.VipList.All(vs => vs.songRequester != username))
            {
                return(ProcessEditArgsResult.NoRequestInList);
            }

            var splitCommandText = commandText.Split(' ').ToList();

            int.TryParse(splitCommandText[0].Trim(), out var playlistIndex);
            if (playlistIndex != 0)
            {
                splitCommandText.RemoveAt(0);
            }

            songRequestText = string.Join(" ", splitCommandText);

            var totalRequestCount = (currentSongs.RegularList.Count(rs => rs.songRequester == username) +
                                     vipRequestsWithIndex.Count(vs => vs.SongRequest.songRequester == username));

            var doesUserHaveRegularRequest = currentSongs.RegularList.Any(rs => rs.songRequester == username);
            var userVips = vipRequestsWithIndex.Where(req => req.SongRequest.songRequester == username).ToList();

            if (string.IsNullOrWhiteSpace(songRequestText))
            {
                return(ProcessEditArgsResult.NoRequestProvided);
            }

            if (totalRequestCount == 1)
            {
                return(ProcessEdit(songRequestText, currentSongs, username, ProcessEditArgsResult.OneRequestEdit)
                    ? ProcessEditArgsResult.OneRequestEdit
                    : ProcessEditArgsResult.ArgumentError); // We can change this request regardless
            }

            if (playlistIndex != 0)
            {
                if (userVips.Count == 0)
                {
                    return(ProcessEditArgsResult.ArgumentError);
                }

                return(ProcessEdit(songRequestText, currentSongs, username, ProcessEditArgsResult.VipRequestWithIndex,
                                   playlistIndex)
                    ? ProcessEditArgsResult.VipRequestWithIndex
                    : ProcessEditArgsResult.ArgumentError);
            }


            if (doesUserHaveRegularRequest)
            {
                return(ProcessEdit(songRequestText, currentSongs, username, ProcessEditArgsResult.RegularRequest)
                    ? ProcessEditArgsResult.RegularRequest
                    : ProcessEditArgsResult.ArgumentError);
            }
            switch (userVips.Count)
            {
            case 1:
                return(ProcessEdit(songRequestText, currentSongs, username, ProcessEditArgsResult.VipRequestNoIndex)
                        ? ProcessEditArgsResult.VipRequestNoIndex
                        : ProcessEditArgsResult.ArgumentError);

            default:
                return(ProcessEditArgsResult.ArgumentError);
            }
        }